設備對象用於保存設備特征和狀態的相關信息。一個設備對象表示一個邏輯的、虛擬的或物理的設備,設備對象的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:進行數據傳輸的時候,規范設備的地址對齊。