3.1.2 设备对象(DEVICE_OBJECT)
设备对象用于保存设备特征和状态的相关信息。一个设备对象表示一个逻辑的、虚拟的或物理的设备,设备对象的I/O请求由一个驱动对象操控着。每一个内核模式的驱动必须创建设备对象,它通过调用IoCreateDevice函数一次或多次来创建。
设备对象用结构体DEVICE_OBJECT表示。每个设备对象有一个指针(NextDevice)指向下一个设备对象,从而形成一个设备对象链表。该链表的第一个设备是由驱动对象结构体中的DeviceObject成员指明的。
设备对象结构体DEVICE_OBJECT的具体定义如下:
typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT)_DEVICE_OBJECT
{
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
/指向驱动程序中驱动对象的指针/
struct_DRIVER_OBJECT*DriverObject;
/指向下一个设备对象的指针/
struct_DEVICE_OBJECT*NextDevice;
struct_DEVICE_OBJECT*AttachedDevice;
/当前IRP结构/
struct_IRP*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;
struct_DEVOBJ_EXTENSION*DeviceObjectExtension;
PVOID Reserved;
}DEVICE_OBJECT;
typedef struct_DEVICE_OBJECT*PDEVICE_OBJECT;
下面分别描述设备对象中驱动程序可访问成员的具体含义。
❑PDRIVER_OBJECT DriverObject:指向驱动程序中的驱动对象。同属一个驱动程序的驱动对象指针都指向同一个驱动对象。
❑PDEVICE_OBJECT NextDevice:指向下一个设备对象。这里的下一个设备对象是同一个驱动程序创建的若干设备对象中的一个。每个设备对象会根据NextDevice成员形成链表,从而遍历每个设备对象。在每次成功调用IoCreateDevice后,I/O管理器就会更新该链表。当驱动被卸载时,需要遍历该链表,删除每个设备对象。
❑PIRP CurrentIrp:如果驱动使用StartIO例程,此成员将指向当前的IRP结构,否则为NULL。
❑ULONG Flags:此成员是一个32位的无符号整型变量,每个位有不同的含义。可通过按位取“或”操作为新创建的设备对象设置不同的特性。
❑ULONG Characteristics:此成员说明设备对象的特性,当驱动程序调用IoCreate-Device时,可设置FILE_REMOVABLE_MEDIA(表示存储设备支持可移动介质)、FILE_READ_ONLY_DEVICE(表示设备不能写)、FILE_FLOPPY_DISKETTE(表示设备是软盘设备)等值。
❑PVOID DeviceExtension:指向设备扩展对象。
❑DEVICE_TYPE DeviceType:指明设备的类型,由IoCreateDevice设置,根据设备的需要填写相应的设备类型。
❑CCHAR StackSize:在多层驱动的情况下,驱动与驱动之间形成类似堆栈的结构。IRP会依次从最高层传递到最底层。StackSize就是用于指定发送到该驱动的IRP在堆栈位置的最小层数的。IoCreateDevice在一个新创建的设备对象中设置该成员。
❑ULONG AlignmentRequirement:进行数据传输的时候,规范设备的地址对齐。