DEVICE_OBJECT結構 (wdm.h)
操作系統會使用 DEVICE_OBJECT 結構來表示裝置物件。 裝置物件代表驅動程序處理 I/O 要求的邏輯、虛擬或實體裝置。
語法
typedef struct _DEVICE_OBJECT {
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
struct _DRIVER_OBJECT *DriverObject;
struct _DEVICE_OBJECT *NextDevice;
struct _DEVICE_OBJECT *AttachedDevice;
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, *PDEVICE_OBJECT;
成員
Type
由操作系統用來指出對像是裝置物件。 針對裝置對象,這個成員的值是 3。 這是唯讀成員。
Size
指定裝置物件的大小,以位元組為單位。 此大小包含 DeviceExtension 成員指向的驅動程式指定裝置擴充功能,但不包含 DeviceObjectExtension 成員所指向的不透明裝置物件延伸模組。 Size 是唯讀成員。
ReferenceCount
由 I/O 管理員用來追蹤與裝置對象相關聯之裝置的開啟句柄數目。 這可讓 I/O 管理員避免在驅動程式的裝置有未處理的句柄 () 時卸除驅動程式。 這是唯讀成員。
DriverObject
驅動程式物件的指標 (DRIVER_OBJECT) ,代表輸入至 DriverEntry 和 AddDevice 例程之驅動程式的載入影像。 此成員是由 I/O 管理員在 成功呼叫 IoCreateDevice 或 IoCreateDeviceSecure 時設定。 這是唯讀成員。
NextDevice
下一個裝置物件的指標,如果有的話,由同一個驅動程式所建立。 I/O 管理員會在每次成功呼叫 IoCreateDevice 或 IoCreateDeviceSecure 時更新此列表。
正在卸除的非 隨插即用 (PnP) 驅動程式必須周遊 (「逐步執行」) 其裝置物件清單並加以刪除。 PnP 驅動程式不需要逐步執行此裝置物件清單。 相反地,PnP 驅動程式會在裝置移除 PnP 作業期間執行其清除作業 , (IRP_MN_REMOVE_DEVICE) 。
動態重新建立其裝置對象的驅動程式也會使用此成員。 這是讀取/寫入成員。
AttachedDevice
附加裝置物件的指標。 如果沒有連結的裝置物件,此成員為 NULL。 AttachedDevice 成員指向的裝置物件通常是篩選驅動程式的裝置物件,它會攔截原本以裝置物件表示之裝置為目標的 I/O 要求。 如需詳細資訊,請參閱 IoAttachDevice 和 IoAttachDeviceByPointer 主題。 這是不透明的成員。
CurrentIrp
如果驅動程式在驅動程式對象中設定進入點的 StartIo 例程,而且驅動程式目前正在處理 IRP () ,則為目前 IRP 的指標。 否則,此成員為 NULL。 如需詳細資訊,請參閱 IoStartPacket 和 IoStartNextPacket 主題。 這是唯讀成員。
Timer
定時器物件的指標。 這可讓 I/O 管理員每秒呼叫驅動程式提供的定時器例程。 如需詳細資訊,請參閱 IoInitializeTimer。 這是讀取/寫入成員。
Flags
設備驅動器會使用下列一或多個系統定義值,在其新建立的裝置物件中執行位 OR 作業。
如需如何設定 Flags 成員的詳細資訊,請參閱 初始化 Device 物件。
值 | 意義 |
---|---|
DO_VERIFY_VOLUME (0x00000002) | 卸除式媒體驅動程式會在處理傳輸要求時設定此旗標。 這類驅動程式也應該在目標中檢查此旗標是否有傳輸要求,再傳輸任何數據。 如需詳細資訊,請參閱 支援卸除式媒體 主題。 |
DO_BUFFERED_IO (0x00000004) | 指定 I/O 管理員針對傳送至裝置堆疊的 I/O 要求所使用的緩衝類型。 較高層級的驅動程式或此成員的值與堆疊中下一個較低驅動程式的值相同,但可能適用於最高層級的驅動程式。 |
DO_EXCLUSIVE (0x00000008) | 表示驅動程式會服務專屬裝置,例如視訊、序列、平行或音效裝置。 WDM 驅動程式不得設定此旗標。 如需詳細資訊,請參閱 指定裝置對象的獨佔存取 權主題。 |
DO_DIRECT_IO (0x00000010) | 請參閱DO_BUFFERED_IO。 |
DO_MAP_IO_BUFFER (0x00000020) | 不再使用此旗標。 驅動程式不應該設定此旗標。 |
DO_DEVICE_INITIALIZING (0x00000080) | I/O 管理員會在建立裝置物件時設定此旗標。 裝置函式驅動程式或篩選驅動程式會在它之後清除其 AddDevice 例程中的旗標: (1) 將裝置物件附加至裝置堆疊。 (2) 建立裝置電源狀態。 (3) ) 如有必要,請在成員上執行位 OR 運算,其中一個電源旗標 (。 隨插即用 (PnP) 管理員會在 AddDevice 例程傳回之後檢查旗標是否已清除。 |
DO_SHUTDOWN_REGISTERED (0x00000800) | 由 I/O 管理員用來指出驅動程式已註冊裝置對象以進行關機通知。 驅動程式不應使用此旗標。 |
DO_BUS_ENUMERATED_DEVICE (0x00001000) | 操作系統會在每個實體裝置物件中設定此旗標, (PDO) 。 驅動程式不得修改此旗標。 |
DO_POWER_PAGABLE (0x00002000) | 與 Microsoft Windows 2000 和更新版本的 Windows 相容的可分頁驅動程式不是分頁路徑的一部分,而且不需要目前啟動的驅動程式必須設定此旗標。 系統會在 IRQL = PASSIVE_LEVEL呼叫這類驅動程式。 驅動程式無法同時設定此旗標和DO_POWER_INRUSH。 WDM、Microsoft Windows 98 和 Windows 版的所有驅動程式都必須設定DO_POWER_PAGABLE。 |
DO_POWER_INRUSH (0x00004000) | 開啟裝置時需要目前啟動之裝置的驅動程序必須設定此旗標。 驅動程式無法同時設定此旗標和DO_POWER_PAGABLE。 |
DO_DEVICE_TO_BE_RESET (0x04000000) | I/O 管理員會將此旗標設定為總線驅動程式重設裝置的訊號。 其他驅動程式不應該使用此旗標。 |
DO_DAX_VOLUME (0x10000000) | 表示磁碟區是 DAX 磁碟區。 |
Characteristics
指定一或多個系統定義的常數,結合位 OR 作業,以提供驅動程式裝置的其他資訊。 這些常數包括下列各項:
值 | 意義 |
---|---|
FILE_AUTOGENERATED_DEVICE_NAME | 指示 I/O 管理員產生裝置的名稱,而不是呼叫者在呼叫此例程時指定 DeviceName 。 I/O 管理員可確保名稱是唯一的。 此特性通常是由 PnP 總線驅動程式指定,以產生實體裝置對象的名稱, (相同總線上子裝置的 PDO) 。 |
FILE_CHARACTERISTIC_PNP_DEVICE | 表示裝置對像是 隨插即用 (PnP) 堆疊的一部分。 如果總線驅動程式 (或總線篩選驅動程式) 註冊尚未收到 IRP_MN_START_DEVICE 要求的裝置物件 WMI 支援,則需要此特性。 如果函式或篩選驅動程式在附加至其裝置堆疊 之前 註冊 WMI,也需要FILE_CHARACTERISTIC_PNP_DEVICE。 |
FILE_CHARACTERISTIC_TS_DEVICE | 表示裝置對像是終端機服務裝置堆疊的一部分。 驅動程式不應該設定這個特性。 |
FILE_CHARACTERISTIC_WEBDAV_DEVICE | 指出 Web 型分散式撰寫和版本控制 (WebDAV) 檔系統掛接在裝置上。 驅動程式不應該設定這個特性。 |
FILE_DEVICE_IS_MOUNTED | 指出文件系統已掛接在裝置上。 驅動程式不應該設定這個特性。 |
FILE_DEVICE_SECURE_OPEN | 指示 I/O 管理員將裝置物件的安全性描述元套用至相對開啟,並開啟裝置的尾端檔名。 如需詳細資訊,請參閱 控制裝置命名空間存取 主題。 |
FILE_FLOPPY_DISKETTE | 指出裝置是磁碟驅動器裝置。 |
FILE_READ_ONLY_DEVICE | 表示無法寫入裝置。 |
FILE_REMOTE_DEVICE | 表示裝置是遠端的。 |
FILE_REMOVABLE_MEDIA | 表示儲存裝置支援抽取式媒體。 請注意,這個特性表示抽取 式媒體,而不是抽取式 裝置。 例如,JAZ 磁碟驅動器裝置的驅動程式應該指定這個特性,但PCMCIA快閃磁碟的驅動程式不應該。 |
FILE_VIRTUAL_VOLUME | 表示磁碟區是虛擬的。 驅動程式不應該設定這個特性。 |
FILE_WRITE_ONCE_MEDIA | 表示裝置支援寫入一次媒體。 驅動程式不會直接設定此成員。 如需如何設定裝置特性的詳細資訊,請參閱 指定裝置特性 主題。 |
FILE_CHARACTERISTIC_CSV | 指出裝置是叢集共用磁碟區 (CSV) 。 |
FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL | IO 管理員通常會在用戶端是應用程式容器時,在每個開啟的檔案上執行完整安全性檢查,以周遊存取權。 此旗標的設定會略過這個強制周遊存取權檢查用戶端令牌是否已經有周遊許可權。 |
FILE_PORTABLE_DEVICE | 表示基礎堆疊會考慮裝置可攜式。 儲存堆疊會使用這一點,表示裝置不在本機計算機容器中,而且不在固定總線類型上。 |
Vpb
磁碟區參數區塊的指標, (與裝置對象相關聯的 VPB) 。 針對文件系統驅動程式,VPB 可以提供任何未命名邏輯裝置對象的連線,代表掛接磁碟區的實例。 這是不透明的成員。
DeviceExtension
裝置延伸模組的指標。 裝置延伸模組的結構和內容是驅動程式定義的。 大小是由驅動程序決定,在驅動程式對 IoCreateDevice 或 IoCreateDeviceSecure的呼叫中指定。 如需裝置擴充功能的詳細資訊,請參閱 裝置延伸模組。 這是唯讀成員。 不過,成員指向的物件可由驅動程式修改。
DeviceType
使用針對該例程的 DeviceType 參數指定的值,由 IoCreateDevice 和 IoCreateDeviceSecure 設定。 如需詳細資訊,請參閱 指定裝置類型 主題。
StackSize
指定要傳送至此驅動程式之 IRP 中的堆疊位置數目下限。 IoCreateDevice 和 IoCreateDeviceSecure 會將新建立裝置物件中的這個成員設定為 1;因此,最低層級驅動程式可以忽略這個成員。 如果驅動程式呼叫IoAttachDevice或IoAttachDeviceToDeviceStack,I/O 管理員會自動將較高層級驅動程式裝置物件中的StackSize成員設定為適當的值。 只有具有 IoGetDeviceObjectPointer 之另一個驅動程式的較高層級驅動程序必須明確地將 StackSize 的值設定在其自己的裝置物件中, (s) 為 1 + 下一個較低驅動程式裝置物件的 StackSize 值。
Queue
I/O 管理員在內部使用,以在需要時將裝置物件排入佇列。 這是不透明的成員。
Queue.ListEntry
LIST_ENTRY 結構,其中包含多倍連結清單的向前和向後指標。
Queue.Wcb
I/O 管理員所使用的裝置內容資訊。
AlignmentRequirement
指定裝置的數據傳輸位址對齊需求。 此值必須是 Wdm.h 中定義的其中一個FILE_XXX_ALIGNMENT值。 如需詳細資訊,請參閱 初始化 Device Object、 GetDmaAlignment 和 ZwQueryInformationFile 主題。
DeviceQueue
裝置物件的裝置佇列物件。 裝置佇列物件包含任何等候與裝置對象相關聯之驅動程序處理的 IRP。 如需詳細資訊,請參閱 驅動程式管理的 IRP 佇列 主題。 這是不透明的成員。
Dpc
延遲的程式調用 (裝置物件的 DPC) 物件。 如需詳細資訊,請參閱 DPC 物件簡介 主題。 這是不透明的成員。
ActiveThreadCount
保留供未來使用。 這是不透明的成員。
SecurityDescriptor
指定建立裝置物件時,裝置對象的安全性描述元 (SECURITY_DESCRIPTOR) 。 如果此成員為 NULL,則裝置物件會收到預設的安全性設定。 這是只讀成員,雖然成員可以透過 ZwSetSecurityObject 函式進行修改。
DeviceLock
由 I/O 管理員配置的同步處理事件物件。 I/O 管理員會先取得其事件物件,再將掛接或掛接驗證要求分派給文件系統驅動程式。 這是不透明的成員。
SectorSize
如果裝置物件不代表磁碟區,此成員會設定為零。 如果裝置物件代表磁碟區,此成員會以位元組為單位指定磁碟區的扇區大小。 I/O 管理員會使用此成員來確保停用中繼緩衝時,發出的所有讀取作業、寫入作業和設定檔案位置作業都會正確對齊。 建立裝置物件時,會使用預設系統位元組個別扇區值,不過,檔系統驅動程式;和較罕見的舊版和迷你篩選驅動程式,可以在掛接發生時,根據基礎磁碟區硬體的幾何來更新此值。 其他驅動程式不應該修改此成員。
Spare1
保留供系統使用。 這是不透明的成員。
DeviceObjectExtension
I/O 管理員和 PnP 管理員用來儲存裝置狀態相關信息的裝置物件延伸模組指標。 這是不透明的成員。
Reserved
保留供系統使用。 這是不透明的成員。
備註
操作系統會依裝置物件代表裝置。 如需詳細資訊,請參閱 裝置物件和裝置堆疊 主題。
驅動程式會使用 IoCreateDevice 和 IoCreateDeviceSecure 例程來建立裝置物件。 如需如何建立裝置對象的詳細資訊,請參閱 建立裝置物件。
裝置物件部分不透明。 除非另有記載,否則驅動程式不會直接設定裝置對象的成員。 如需驅動程式可以直接修改的成員詳細資訊,請參閱 初始化 Device 物件。 如需其他裝置物件屬性的詳細資訊,請參閱 Device Objects 的屬性。
裝置物件內的不透明成員必須視為無法存取。 具有對象成員位置相依性或不透明成員存取權的驅動程式可能無法在一段時間內保持可攜且可與其他驅動程式互通。
系統提供的視訊埠驅動程式會設定其代表 視訊迷你埠驅動程式所建立之裝置物件的欄位。
系統提供的 SCSI 埠驅動程式會設定它代表 SCSI 迷你埠驅動程式所建立之裝置物件的欄位。
系統提供的 NDIS 連結庫會設定代表 NDIS 迷你埠驅動程式所建立之裝置物件的欄位。
規格需求
需求 | 值 |
---|---|
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h) |