WDM中的结构
---驱动程序对象
驱动程序对象(DRIVER_OBJECT)是装载后的驱动程序的映像。驱动程序对象的指针作为参数传递给DriverEntry例程和重初始化或卸载例程。驱动程序对象由I/O管理器在装载驱动程序时创建,并由其负责删除。在初始化期间,DriverEntry例程要负责把要把驱动程序函数(即Dispatch例程)指针装入到驱动程序对象的MajorFunction中,如DispatchPower、DispatchPnp等例程,I/O管理器根据驱动程序对象的Dispatch例程指针找到相应IRP的处理函数。
由于驱动程序对象是驱动程序装载后的映像,因此系统内每一个驱动程序都只由唯一的一个驱动程序对象。只有在DriverEntry例程中可以直接修改驱动程序对象的各个字段,没有其他方法(函数)可以修改驱动程序对象。
驱动程序对象也是半透明的,只有以下几个字段可以修改:
PDEVICE_OBJECT DeviceObject 驱动程序创建的设备对象的指针。在IoCreateDevice 函数中自动创建,通过它,驱动程序可以遍历设备对象列表。
PDRIVER_EXTENSION DriverExtension 驱动扩展指针。此结构唯一可访问的是DriverExtension->AddDevice字段,用来存储AddDevice例程指针。
PUNICODE_STRING HardwareDatabase 指向注册表/Registry/Machine/Hardware中硬件配置信息
PFAST_IO_DISPATCH FastIoDispatch 指向驱动的fast I/O进入点的指针
PDRIVER_INITIALIZE DriverInit 指向DriverEntry的指针,由I/O管理器设置
PDRIVER_STARTIO DriverStartIo 函数StartIO进入点指针,在DriverEntry 函数内设置
PDRIVER_UNLOAD DriverUnload 函数DriverUnload进入点指针,在DriverEntry函数内设置
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]
由IRP处理例程指针组成的数组,通过此数组分发IRP。数组的内容在DriverEntry函数内设置。
此结构在wdm.h和ntddk.h内定义。
另外,驱动程序进入点DriverEntry函数的名称最好不要改(当然,也不是不能改,但会很麻烦,因为要为连接器重定义入口点名称),否则系统找不到此函数的偏移地址。