shFileBuffers
FlushConsoleInputBuffer
PurgeComm
IRP_MJ_SHUTDOWN 系统关闭InitialSystemShutdown
和上面的驱动程序支持的功能代码相对应,一般的驱动程序看起来就象下面的样子。
DriverEntry(…) // 驱动程序入口
{
…
DeviceObject->MajorFunction[IRP_MJ_CREATE] = XXDriverCreateClose; //XX对应的是你自己给你的驱动程序的命名
DeviceObject->MajorFunction[IRP_MJ_CLOSE] = XXDriverCreateClose;
DeviceObject->MajorFunction[IRP_MJ_READ] = XXDriverReadWrite;
DeviceObject->MajorFunction[IRP_MJ_WRITE] = XXDriverReadWrite;
…
}
XXDriverCreateClose(…) // 对应IRP_MJ_CREATE和IRP_MJ_CLOSE的例程
{
//……….
}
XXDriverDeviceControl(…)// 对应IRP_MJ_DEVICE_CONTROL的例程
{
//……….
}
XXDriverReadWrite(…) // 对应IRP_MJ_READ和IRP_MJ_WRITE的例程
{
//……….
}
一个驱动程序并不需要支持所有的功能代码,比如如果一个驱动程序根本就不必要与用户模式客户程序交互,那么就不用支持IRP_MJ_CREATE和IRP_MJ_CLOSE。又如设备不支持设备读写,就不用支持IRP_MJ_READ和IRP_MJ_WRITE。 驱动程序对象是在操作系统启动驱动程序、在调用驱动程序 入口DriverEntry之前就已经创建好了的,并且作为DriverEntry 函数的参数传递给驱动程序。如果驱动程序启动失败,操作 系统将删除该对象。该对象的数据结构如下。注意下表并不是完整地列出了ntddk.h中的DEVICE_OBJECT结构体的所有数 据项,这里仅列出了一般驱动程序可能使用到的数据项。
Driver对象数据项 | 说明 |
PDEVICE_OBJECT DeviceObject | 由本驱动程序创建的Device对象的链表 |
ULONG Flags PDRIVER_INITIALIZE DriverInit | 驱动程序初始化例程(一般较少用) |
PDRIVER_STARTIO DriverStartIo | StartIo例程入口,一般该例程对低层设备驱动程序用得较多, 高层驱动程序较少使用本例程。 |
PDRIVER_UNLOAD DriverUnload | 卸载驱动程序例程,如果想在控制面版的设备里停止该设备,应该提供本例程。 |
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1] | 驱动程序的Dispatch例程表 |
在上面提到过驱动程序是管理同类型的所有设备,所以上面的 结构中DeviceObject指向的就不是单个的设备对象,而是一个对象链表,这个链表的维护在下面介绍Device对象时可以看到。 Device对象与Device Extension 驱动程序在调用IoCreateDevice函数成功后就创建了一个Device 对象。下面对Device对象几个比较重要的数据做一介绍。
Device对象数据项 | 说明 |
PVOID DeviceExtension | 指向Device Extension结构的指针 |
PDRIVER_OBJECT DriverObject | 指向这个设备的Driver对象的指针,IoCreateDevice会 自动填写本数据。 |
ULONG Flags | 指定这个设备的缓冲策略 |
PDEVICE_OBJECT NextDevice | 指向属于这个驱动程序的下一个设备对象,依靠本数据来维护设备对象链表 |
CCHAR StackSize | 发送到这个设备的IRP需要的I/O堆栈单元的最小数目,一般对分层驱动程序来说,本数据应该比其下层设备的大1 |
ULONG AlignmentRequirement | 缓冲区要求的内存对齐,一般对分层驱动程序来说,本值应该 和其下层设备的对齐一致 |
Device记录着设备的特徵和状态信息,对系统上的每个虚拟的、逻辑的和物