每一个驱动对象代表着一个已经装载的内核模式下的驱动, 指向驱动对象的指针是驱动程序中以下例程的输入参数之一: DriverEntry, AddDevice, Reinitialize(可选例程),Unload(可选例程)。
驱动对象是一个半透明对象,驱动编写者必须熟悉它的某些成员对象,以实现驱动的初始化功能和卸载功能(如果该驱动能够卸载)。以下列出的是驱动对象中能被驱动访问的成员:
可访问成员
PDEVICE_OBJECT DeviceObject
指向一个由驱动创建的设备对象,当驱动程序调用IoCreateDevice成功时,该成员会自动更新。驱动程序可以利用该成员以及DEVICE_OBJECT对象中的NextDevice成员来实现对由该驱动创建的所有设备列表中设备的遍历。
PDRIVER_EXTENSION DriverExtension
驱动扩展对象指针,该对象唯一能访问的成员是DriverExtension-> AddDevice,对应的是驱动DriverEntry例程中的AddDevice例程。
PUNICODE_STRING HardwareDatabase
指向\Registry\Machine\Hardware,该路径指向的是注册表中包含该硬件的配置信息。
PFAST_IO_DISPATCH FastIoDispatch
指向快速I/O入口地址,该成员之用于FSD(文件系统驱动)已经网络传输驱动。
PDRIVER_INITIALIZE DriverInit
DriverEntry例程的入口点,由I\O管理器设置。
PDRIVER_STARTIO DriverStarIo
驱动程序中StartIo例程的入口地址(如果有的话),当驱动初始化时,DriverEntry例程负责设置它,如果驱动程序没有StartIo,该成员为NULL。
PDRIVER_UNLOAD DriverUnload
驱动程序中Unload例程的入口地址(如果有的话),当驱动初始化时,DriverEntry例程负责设置它,如果驱动程序没有StartIo,该成员为NULL。
PDRIVER_DISPATCHMajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]
派遣例程表,该表包含了驱动中DispatchXxx routines等所有派遣例程的入口地址。该数组的索引值为IRP_MJ_Xxx,该值代表每一个IRP的主功能函数代码(IRP major function code), 任何驱动都必须为IRP_MJ_Xxx请求设置入口地址。每一个DispatchXxx例程的定义如下所示:
NTSTATUS
(*PDRIVER_DISPATCH) (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
备注:
每一个内核模式的驱动的初始化例程都必须命名为DriverEntry,这样系统才可以自动将驱动加载进来。如果例程的名字为其他,则驱动编写者必须为链接器指定对应的初始化例程的名字,否则,系统的加载器或者I/O管理器将无法找到驱动的传递地址。其他标准驱动的名字可以由驱动编写者自行决定。
一个驱动必须在驱动对象中设置DispatchXxx的入口地址,在驱动加载之后,该驱动对象将传递给DriverEntry。一个设备的驱动必须为每一个IRP_MJ_XXX设置一个或者多个DispatchXxx的入口地址,对同一类型的设备来说,该IRP_MJ_XXX都将被处理。一个上层的驱动必须为所有的IRP_MJ_XXX设置一个或者多个DispatchXxx入口点,这些IRP_MJ_XXX将被发送到下一级的设备驱动,否则,驱动无法给没有设置DispatchXxx例程
发送任何IRP_MJ_XXX。
DriverEntry例程设置了的驱动的AddDevice,StartIO 以及Unload等函数的入口地址。
当驱动加载时,设备驱动可以利用HardWareDatabase 字符串来从注册表中获取硬件的配置信息。该字符串对驱动来说只读。
驱动对象中没有列出的成员是无法访问的。
注:该文章原文出自msdn。