-1 -WindowsWDM设备驱动程序开发指南第1章简介本书介绍如何编写某些类型的Windows设备驱动程序,主要介绍Windows 98和Windows 2000的Windows驱动程序模型(WDM)。此外,还将介绍也可以在Windows NT 3、51和NT 4中运行的设备驱动程序,这些设备驱动程序称为“ NT样式”驱动程序。设备驱动程序提供了到计算机硬件的软件接口,该软件接口是操作系统的受信任部分。用户应用程序以标准化方式访问硬件,而不必考虑必须如何控制硬件。例如,磁盘驱动器可以隐藏必须以512字节块写入数据的事实。驱动程序是一种软件,在加载后成为操作系统内核的一部分。它使一个或多个设备可供用户模式程序员使用。每个设备代表一个物理或逻辑硬件。例如,物理硬盘可以看作是两个逻辑磁盘C 1和D 4。在Windows中,驱动程序始终使设备看起来像文件,可以打开设备的句柄,然后应用程序可以在最终关闭设备句柄之前向驱动程序发出读写请求。显然,有许多硬件基本相同,因为它们共享总线或执行相似的任务。 Mcrosoft提供了几种通用驱动程序来执行这些常见任务。设备驱动程序可以使用这些标准驱动程序的功能。
此方法使共享公共总线变得更加容易,并且更容易编写新的驱动程序。因此,编写新驱动程序的任务通常始于确定可以使用哪些通用驱动程序。驱动程序堆栈分阶段处理用户请求,并且这些驱动程序相互叠加。低级总线驱动程序可用于处理与硬件的所有基本通信,中级驱动程序为整个驱动程序提供通用的功能。在Windows 98和wlndows 2000中,必须根据下面将介绍的Windows驱动程序模型(WDM)设计设备驱动程序。 WDM基于Windows NT 4和NT 351中使用的设备驱动程序模型。1 1 Windows驱动程序模型Windows驱动程序模型有两个不同但同样重要的方面。首先,核心模型描述了设备驱动程序的标准结构,其次,Microsoft为常见类型的设备提供了一系列总线驱动程序和类驱动程序。 wDM核心模型描述了如何安装和启动设备驱动程序,以及如何为用户请求服务和处理硬件。 wDM设备驱动程序必须适合即插即用(PnP)系统,允许用户插入可以在软件中配置的设备。 Microsoft提供了一系列系统驱动程序,这些驱动程序具有为许多标准类型的设备提供服务所需的所有基本功能。
第一个系统驱动程序支持不同类型的总线,例如通用串行总线(usB),IEEE] 394(Firewire)和音频端口设备。其他类驱动程序实现标准的Windows功能,例如人工输入设备(HID)和内核流功能。最后,静态图像体系结构(sTI)提供了用于处理静态图像,扫描仪等的框架。这些系统驱动程序使某些类型的设备驱动程序的设计更加容易。例如,USB系统驱动程序处理usD总线上的所有低级通信,因此其他驱动程序具有可以使用的定义明确的接口,这使得向usB总线发出请求非常简单。 ·源代码兼容性和二进制兼容性-最初,Microsort应该称为wDM驱动程序。它将在Windows 98和W1ndows 2000x86之间二进制兼容,并且与Windows 2000 A1Pha平台源代码兼容。但是,尽管DDK在这方面还不清楚,但似乎无法保证二进制兼容性。作者仅出于安全考虑。安装为正确的操作系统构建的驱动程序,也就是说,在为Windows 98构建驱动程序时,请使用W1ndows 98驱动程序开发工具包(DDK),并使用wlndow52000 DDK对于Wjndows 2000。
如果使用某些仅在Windiws 2000中出现的wDM功能,则无法实现源代码兼容性。示例2-Windows WDM设备驱动程序开发指南例如,Windows 2000 USB系统驱动程序支持W1ndow s 98驱动程序中不提供的某些功能。以下是通过开发简单的设备驱动程序来讨论wDM的核心功能。然后,讨论使用访问内存和处理硬件资源(例如中断)的驱动程序的需求。最后,介绍usB和HID系统驱动程序。使用内核例程IoIsWdmversionAvailabIe确定所需的wDM版本是否可用。 DDK头文件定义了两个常量wDM_MAJORVERSION和WDM_MINORVERSION。对于Windows 98,这些常数是1和0,对于Windows 2000,它们是1和0x10。 1. 1. 1 WDM和NT样式的驱动程序图1-1大致显示了WDM和NT样式的驱动程序之间的区别。本书的其余部分将解释该图中提到的所有功能。这两个驱动因素之间的重叠很大。 wDM和NT样式的驱动程序的实际编写基本上是相同的。驱动程序代码的主要区别在于设备的创建方式。
在wDM驱动程序中,即插即用(PnP)管理器告诉系统何时添加设备或从系统中删除设备。 PnP管理器使用安装INF文件为新设备找到正确的驱动程序。相反,NT样式的驱动程序必须通常在其初始化例程中发现其自己的设备。通常使用特殊的安装程序来安装NT样式的驱动程序。新的总线驱动程序和类驱动程序只能用于wDM设备驱动程序。新的WDM和NT样式的驱动程序应支持电源管理和wMI功能。 1. 1. 2如果从头开始编写可用的驱动程序-一个驱动程序,则似乎大多数代码与访问设备无关。在执行一些实际的输入和输出(Io)之前,必须设置许多“基础结构”。本书以一些实用且有用的驱动程序为例,它们将帮助读者尽快上手。直接使用,其他驱动程序构成读者自己的驱动程序的基础;虚拟设备驱动程序用于解释wDM的核心功能;虚拟设备不使用任何实际硬件;三个驱动程序Wdml,wdm2和wdm3逐渐实现更一开始,它们提供了一个共享的内存缓冲区,使它们成为其他有用驱动程序的基础,实际上wdm2驱动程序被用作本书中其他几个驱动程序(包括使用系统驱动程序的驱动程序)的基础。
在本书中,DebugPrint软件用于提供驱动程序的跟踪调试输出。 DebugPrint驱动程序将在第4章中介绍。读者可以在其设备驱动程序中使用DebugPrint。 Wdmlo和PHDIo是通用驱动程序,可用于立即访问简单的硬件设备。 One-3-WindowsWDM设备驱动程序开发指南Win32控件程序可以使用一组简单但功能强大的命令与硬件进行通讯。这些驱动程序支持中断驱动的Io。该应用示例说明了如何使用这些通用驱动程序来访问并行端口。 USBKbd和HidKbd驱动程序均可访问连接到USB总线的键盘。这些驱动程序描述了使用usB和HID类驱动程序所需的技术。最后,win 32应用程序HidKbduser解释了用户模式应用程序如何发现和访问HID设备。本书的1×1×3 CD-ROM本书的CD-ROM包含上述所有驱动程序,包括这些驱动程序的所有源代码和已编译的可执行文件。每个驱动程序都有至少一个测试程序,用于测试驱动程序。此外,本书中还提供了一些有用的W1n32实用程序,以帮助开发驱动程序。第4章包含在本书CD-ROM上安装软件的完整说明。
大多数经过测试的W1n32程序都是控制台应用程序,使它们易于编写和理解。无需这些代码即可成为成熟的窗口或MFc应用程序。为了充分利用本书,您应该安装所有驱动程序示例并运行win32测试程序。所有驱动程序均包含跟踪调试语句。如果安装了DebugPrint软件,则可以在DebugPritnt Monitor应用程序中看到跟踪输出。仔细检查每个示例的源代码非常有用。在实际工作中,一个人只能通过编写实际代码来学习编程。您可以将这些驱动程序示例用作起点,并添加一些功能以进一步掌握设备驱动程序的编写。 114设备驱动程序软件工具有两种类型的软件可用于帮助开发设备驱动程序,如表1-1所示。驱动程序类是源代码c ++类包装器,提供了驱动程序所需的大多数默认功能。通用驱动程序可以从用户模式访问许多类型的设备。 osR公司有一个称为osRDDK的调试辅助工具。第4章讨论了用于开发设备驱动程序的替代工具。在某些情况下,新硬件可能不需要新的设备驱动程序。有现成的通用产品可以处理简单的Io,而不管它是在内存映射的中间还是在Io空间中。实际上,这可能是一个更好的选择,因为NT和W1ndows 95使用相同的接口支持,从而使用户的代码可移植。
即使编写简单的NT设备驱动程序或Windows 95vxD也不是一件容易的事。这些通用驱动程序可以是脚本驱动的。如果必须在安排用户模式线程时运行脚本,则中断延迟将是一个问题。本书中的wdmIo和PHDIo示例是简单的通用设备驱动程序。读者可能已经想到需要编写一个新的设备驱动程序来处理连接到并行端口的特殊设备。完整的win 32 API接口应用于检查是否可以获取所需的功能,并且也许应该发出异步读取或写入调用并检查超时。 1. 1. 5在本书结尾处讨论的驱动程序类型不讨论如何为Windows 95或Windows 98编写vxD。本书中没有任何驱动程序可以在Windows 95中运行。 cE软件。 不讨论打印机驱动程序或虚拟Dos驱动程序。本书描述的设备驱动程序模型是多种类型驱动程序的基础。本书不讨论有关以下驱动程序类型的详细信息:文件系统驱动程序,视频驱动程序,网络驱动程序和scsI驱动程序。如前所述,本书仅详细介绍了usB和HID系统驱动程序。 -4 -WindowsWDM设备驱动程序开发指南本书中的驱动程序应该可以在非x86系统上运行,但是尚未经过测试。 12一种新的思维方式。如果读者只编写了win32应用程序,他们将找到编写设备驱动程序的方式。需要一种新的思维方式。没有可处理的窗口和消息,也没有可防止损坏其他进程和操作系统的窗口保护手段。
更难以设置源代码级调试,大多数支持库不可用,甚至c标准库和c ++的新运算符也不可用。我们甚至必须使用makefile来构造驱动程序,但是很容易通过诸如visualBasic之类的开发工具来控制构造过程。由于设备驱动程序是操作系统的受信任部分,因此很容易损坏系统。因此,开发人员必须编写安全可靠的代码,并仔细注释和测试驱动程序代码。检查每个内核调用返回的错误值。设备驱动程序问题一直是用户和支持人员的难题。在释放驱动程序之前。确保彻底尝试。在各种机器上测试驱动程序。 1. 2.1设备驱动程序环境设备驱动程序在要求苛刻的环境中工作,并且可能有多个用户应用程序请求该驱动程序。请求打开Io的用户程序可能会突然终止。该驱动程序可以在多处理器PC中运行,在不同处理器上运行该驱动程序的不同部分。实际上,两个读取请求可以由两个不同处理器上的驱动程序的同一部分同时处理。低级设备驱动程序必须处理可能随时到达的硬件定义。在某一时刻,只有一部分驱动程序可以访问硬件电路。您必须使用直接内存访问(DMA)将数据从设备传输到内存,或从内存传输到设备。支持可配置和可热交换的总线也增加了设备驱动程序开发人员的负担。
例如,用户可以随时删除即插即用设备,内核可以随时决定需要停止该设备,以便它可以重新分配所有硬件资源。但是,如前所述,使用标准WDM总线和类驱动程序可以帮助减少编写某些类型的驱动程序的工作量。 122术语和资源设备驱动程序面临大量术语。好的规范文档可以帮助硬件和软件工程师共同努力,以实现一个共同的目标。设备驱动程序的开发人员需要了解设备的工作方式。尽管不必了解设备电路实现的细节,但是如果您对设备技术有一定的了解,那绝对有帮助。例如,通用串行总线对数据包的大小有一定的限制,因此需要划分传输数量以满足这些要求。 wDM本身使用许多技术术语来描述其操作,编写设备驱动程序所需的所有结构和概念将在以后逐步介绍。每种技术都有其自己的术语。例如,usB总线具有中断传输(中断传输)的概念,与硬件中断无关。但这就是usB规范描述其操作的方式,因此您仍然必须在这里坚持正确的术语。可能引起混乱的一个领域是“阶级”一词。 Windows类驱动程序是用于访问特定类型的驱动程序(例如USB,HID或IEEE 1394)的标准驱动程序。
相反,usB设备被分为各种设备类,打印机有usB设备类,音频设备有另一个设备类(谢天谢地,我没有在源代码中使用c ++类,否则更加令人困惑))。为了帮助读者开始开发设备驱动程序,第24章列出了许多信息资源,书籍,新闻组和邮件列表。第24章概述了PC 99规范。这是新Windows计算机上应提供的硬件和软件的规范。最后,附录D“词汇表”解释了开发设备驱动程序时遇到的许多首字母缩写词。 ...
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-368867-1.html
目标清晰
也不是实心弹