win驱动开发笔记-驱动对象结构分析
DIRVER_OBJET
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
PDRIVER_OBJECT DriverObject;
PDEVICE_OBJECT NextDevice;
PDEVICE_OBJECT AttachedDevice;
PIRP CurrentIrp;
PIO_TIMER Timer;
ULONG Flags;
ULONG Characteristics;
__volatile PVPB Vpb;
PVOID DeviceExtension;
DEVICE_TYPE DeviceType;
CCHAR StackSize;
union {
LIST_ENTRY ListEntry;
WAIT_CONTEXT_BLOCK Wcb;
} Queue;
ULONG AlignmentRequirement;
KDEVICE_QUEUE DeviceQueue;
KDPC Dpc;
ULONG ActiveThreadCount;
PSECURITY_DESCRIPTOR SecurityDescriptor;
KEVENT DeviceLock;
USHORT SectorSize;
USHORT Spare1;
PDEVOBJ_EXTENSION DeviceObjectExtension;
PVOID Reserved;
} DEVICE_OBJECT, *PDEVICE_OBJECT;
DEVICE_OBJECT结构被操作系统用作代表一个设备对象。一个设备对象代表了一个为驱动程序处理IO请求包的逻辑上的、虚拟的或者物理的设备。
Type:被操作系统用作标识一个对象是设备对象。对于设备对象,这个成员的值是3。这是一个只读成员。
Size:设备对象的大小,按字节算。如果设备对象的扩展部分存在的话,这个大小不包括设备对象的扩展部分。这是一个只读成员。
ReferenceCount:被IO管理器用来跟踪与设备对象相关联的设备打开的句柄数。当驱动程序的设备对象还有未处理的句柄时避免IO管理器卸载一个驱动程序。这是一个只读成员。
DriverObject:一个指向驱动对象的指针,这个驱动对象代表着被输入到DriverEntry和AddDevice例程的驱动的载入映像。这个成员一经IoCreateDevice或者IoCreateDeviceSecure成功调用便被IO管理器设置。
NextDevice:一个指向被同一个驱动程序创建的下一个设备对象,如果存在的话。一个即插即用驱动程序在卸载时必须遍历设备对象链表并且删除它们。一个PNP驱动程序不必去遍历设备对象链表,取而代之的是,PNP驱动程序只要在设备移除PNP操作时执行清除操作。驱动程序在动态重新创建它们的设备对象时也会用到这个成员,这是一个可读/写成员。
AttachedDevice:指向附加的设备对象。如果没有附加的设备对象,这个成员为空。被AttachedDevice成员指向的设备对象典型的是过滤驱动的设备对象(过滤驱动是指拦截到达device object代表的设备原始IRP请求包的驱动程序)。了解更多信息,查看和。这是一个不透明的成员。
CurrentIrp:如果它的入口点被驱动对象设置或者驱动程序是当前正在处理的IRP
,CurrentIrp指向当前IRP如果驱动程序有一个例程。否则这个成员为空。了解更多的信息,查看 和 。这是一个只读成员。
Timer:指向定时器对象。它允许IO管理器每秒钟调用驱动程序提供的定时器。了解更多信息,查看。这是一个可读/写成员。
Flags:设备驱动程序在这个成员上提供按位与操作,新创建的设备驱动对象将使用以下系统定义的值中的一个或者多个。
DO_BUFFERED_IO or DO_DIRECT_IO:
指定缓冲类型,用于被IO管理器发送到设备栈的IO请求包。Higher-level驱动同设备栈中的下一个lower驱动程序在这个成员上具有相同的值,除了更高水平上的驱动程序。
DO_BUS_ENUMERATED_DEVICE
OS在每个物理设备对象(PDO)上设置这个标志。驱动程序不能修改这个标志。
DO_DEVICE_INITIALIZING
当创建设备对象时,IO管理器设置这个标志。在以下操作之后,一个设备功能驱动或者过滤驱动在AddDevice例程中清除这个标志:
(1) 附加设备对象到设备栈
(2) 建立设备电源状态
(3) 如果有必要,这个成员同电源标志执行按位与操作
在AddDevice例程返回之后PNP管理器检查这个标志是否清除。
DO_EXCLUSIVE
标识驱动程序服务于一个独占设备,例如视频、串行、并行或者声音设备。WDM驱动程序不能设置这个标志。了解更多信息,查看。
DO_MAP_IO_BUFFER
这个标志已不再使用。驱动程序不能设置这个标志。
设备驱动程序需要流入当前必须设置这个标志当设备打开时。一个驱动程序不能同DO_POWER_PAGABLE一起设置这个标志。
DO_POWER_PAGABLE
同windows2000以及以后版本的windows兼容,可分页驱动不是调页路径的一部分,不要流入当前不需要设置这个标志。系统在IRQL=PASSIVE_LEVEL调用这类驱动。驱动程序不能将此标志与DO_POWER_INRUSH一起设置。所有的WDM驱动程序,windows98和windows Millennium 版本必须设置DO_POWER_PAGABLE。
DO_SHUTDOWN_REGISTERED
被IO管理器用于标识驱动程序已经为设备对象注册了关机回调函数,这个标志不能被驱动程序使用。
DO_VERIFY_VOLUME
当它们处理传递请求的时候可移动的媒介驱动程序设置这个标志。这样的驱动程序同样需要在它们传递任何数据之前为传递请求核对这个标志。