当 I/O 管理器加载一个设备驱动程序时,它会创建一个驱动程序对象,该对象在对象管理器目录中的路径为:\Driver\<DriverName>或\FileSystem\<DriverName>。如果是文件系统类型的驱动程序,则该对象被放置在 "\FileSystem"目录下,否则放在"\Driver"目录下。因此,驱动程序可粗略地分为文件系统驱动程序和非文件系统驱动程序。
与驱动程序相关的另一种对象是设备对象。每个设备对象代表了系统中的一个设备,包括逻辑设备和物理设备。正常情况下,有两种途径可创建设备对象:即插即用管理器在检测到设备时,通过调用驱动程序的AddDevice 例程来创建设备对象;或者,非即插即用驱动程序在它们的初始化例程中创建设备对象。每个设备对象都必定有一个为它负责的驱动程序。对设备对象的各种操作实际上是由为它负责的驱动程序中的例程来完成的。一个驱动程序可以支持多个设备,所以,驱动程序对象中有一个链表记录了它所负责的所有设备对象。
在Windows中,设备对象的创建是通过 I/O 管理器的IoCreateDevice函数来完成的,函数原型如下:
DriverObject 参数指向负责该设备的驱动对象;DeviceExtensionSize 参数定义了待创建设备对象的扩展部分大小,此扩展部分是由驱动程序来指定和使用的;DeviceName 可选参数指定了设备的名称。DeviceType 参数定义了设备的类型,DEVICE_TYPE 是无符号整数类型, Microsoft 已经预定义了所有常用的设备,它们的整数值小于 32767, 若创建者需要使用自定义的设备类型,可以使用大于 32767 的值。关于这些预定义值,参见 public\sdk\inc\devioctl.h 文件中的常量定义。DeviceCharacteristics参数指定了设备的特征; Exclusive 参数指定了在创建设备对象时是否使用互斥标志;DeviceObject 参数是一个输出参数,用于存放所创建的设备对象。
IoCreateDevice函数,首先根据参数中指定的要求,构造出设备的名称,并且创建一个安全描述符,用于对该设备的访问控制。然后,调用