win驱动开发笔记-驱动对象结构分析

DIRVER_OBJET

typedef struct
{
PDEVICE_OBJECT DeviceObject;//驱动程序创建的设备对象。调用IoCreateDevice的时候会自动赋予正确的设备对象指针。
PUNICODE_STRING HardwareDatabase;//设备的硬件数据库名(Unicode字符串)。一般为HKEY_LOCAL_MACHINE\Hardware\DESCRIPTION\System,是一个注册表路径
PFAST_IO_DISPATCH FastIoDispatch;//文件驱动中用到的派遣函数。指向这个驱动程序的FastIO入口点定义的一个结构。这个成员只能通过FSDs和网络传输驱动来使用。
PDRIVER_INITIALIZE DriverInit;//指向DriverEntry函数的,这是通过IO管理器来建立的。
PDRIVER_STARTIO DriverStartIo;//记录StartIO例程的函数地址,用于串行化操作,如果一个驱动程序没有StartIo函数,这个成员将是NULL
PDRIVER_UNLOAD DriverUnload;//指定驱动卸载时所用的回调函数地址,如果驱动程序没有卸载函数,这个成员将是NULL。
PDRIVER_DISPATCH MajorFunction[IRP_MJ_NUM+1];//指向驱动程序的DispatchXXX函数指针数组。每个驱动程序至少要设置一个DispatchXXX函数指针在这个数组里来处理这个驱动程序IRP请求包 处理函数原型
         NTSTATUS DispatchXXX(IN PDEVICE_OBJECT DeviceObjec, IN PIRP Irp);
}DRIVER_OBJECT,*PDRIVER_OBJECT
DEVICE_OBJECT结构体
typedef struct _DEVICE_OBJECT {
   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

当它们处理传递请求的时候可移动的媒介驱动程序设置这个标志。这样的驱动程序同样需要在它们传递任何数据之前为传递请求核对这个标志。

win驱动开发笔记-驱动对象结构分析,布布扣,bubuko.com

win驱动开发笔记-驱动对象结构分析

上一篇:数据类型-sorted_set类型基本操作和扩展操作


下一篇:在windows和linux下如何查看80端口占用情况?是被哪个进程占用?如何终止等