DRIVER_OBJECT結構 (wdm.h)
每個驅動程式物件都代表已載入內核模式驅動程式的映像。 驅動程式物件的指標是驅動程式 DriverEntry、AddDevice的輸入參數,以及選擇性的 Reinitialize 例程,以及其 Unload 例程,如果有的話。
驅動程式物件部分不透明。 驅動程式寫入器必須知道驅動程序物件的特定成員,才能初始化驅動程式,並在驅動程式可卸載時卸除驅動程式。 驅動程式物件的下列成員可供驅動程式存取。
語法
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch;
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT, *PDRIVER_OBJECT;
成員
Type
定義 CSHORT 成員 Type。
Size
定義 CSHORT 成員 大小。
DeviceObject
驅動程式所建立之裝置物件的指標。 當驅動程式成功呼叫 ioCreateDevice 時,會自動更新此成員。 驅動程式可以使用這個成員和 NextDeviceDEVICE_OBJECT 成員,逐步執行驅動程式建立的所有裝置物件清單。
Flags
定義 ULONG 成員 旗標。
DriverStart
DriverStart定義 PVOID 成員。
DriverSize
定義 ULONG 成員 DriverSize。
DriverSection
定義 PVOID 成員 DriverSection。
DriverExtension
驅動程式延伸模組的指標。 驅動程式擴充功能的唯一可存取成員是 DriverExtension->AddDevice,驅動程式的 DriverEntry 例程會儲存驅動程式的 AddDevice 例程。
DriverName
定義 DriverName 成員 UNICODE_STRING 成員。
HardwareDatabase
\Registry\Machine\Hardware 登錄中硬件組態信息的路徑指標。
FastIoDispatch
定義驅動程式快速 I/O 進入點之結構的指標。 此成員只能由 FSD 和網路傳輸驅動程式使用。
DriverInit
DriverEntry 例程的進入點,由 I/O 管理員設定。
DriverStartIo
驅動程式 StartIo 例程的進入點,如果有任何,驅動程式初始化時,DriverEntry 例程所設定。 如果驅動程式沒有 StartIo 例程,此成員會 NULL。
DriverUnload
驅動程式 卸除 例程的進入點,如果有的話,驅動程式初始化時,DriverEntry 例程所設定。 如果驅動程式沒有 Unload 例程,此成員會 NULL。
MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]
分派數據表,其中包含驅動程式 DispatchXxx 例程的進入點陣列。 數位列的索引值是 IRP_MJ_XXX 值,代表每個 IRP 主要函式程式碼 。 每個驅動程式都必須設定此陣列中的進入點,IRP_MJ_XXX 驅動程序處理的要求。 如需詳細資訊,請參閱 撰寫分派例程。
為了協助 驅動程式的程式代碼分析、靜態驅動程序驗證器 (SDV) 和其他驗證工具,每個 DispatchXxx 例程都會使用 DRIVER_DISPATCH 類型宣告,如下列程式代碼範例所示:
DRIVER_DISPATCH DispatchXxx;
然後,回呼例程會實作如下:
_Use_decl_annotations_
NTSTATUS
DispatchXxx(
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp
)
{
// Function body
}
DRIVER_DISPATCH函式類型定義於 Wdm.h 頭檔中。 若要在執行程式代碼分析工具時更準確地識別錯誤,請務必將 _Use_decl_annotations
_ 批註新增至函式定義。
_Use_decl_annotations_
批注可確保在頭檔中套用至DRIVER_DISPATCH函式類型的批注。 如需函式宣告需求的詳細資訊,請參閱 使用 WDM 驅動程式的函式角色類型來宣告函式。 如需 _Use_decl_annotations_
的相關信息,請參閱 批注函式行為。
言論
每個內核模式驅動程式的初始化例程都應該命名為 DriverEntry,讓系統會自動載入驅動程式。 如果這個例程的名稱是別的,驅動程式寫入器必須定義連結器初始化例程的名稱;否則,系統載入器或 I/O 管理員找不到驅動程式的傳輸位址。 其他標準驅動程式例程的名稱可以由驅動程式寫入器自行決定選擇。
驅動程式必須設定其 DispatchXxx 驅動程式物件中的進入點,該進入點會在載入驅動程式時傳入 DriverEntry 例程。 裝置驅動程式必須為 IRP_MJ_XXX 設定一或多個 DispatchXxx 進入點, 需要相同類型裝置的任何驅動程式才能處理。 較高層級的驅動程式必須設定一或多個 DispatchXxx 進入點,讓所有 IRP_MJ_XXX 都必須傳遞至基礎設備驅動器。 否則,驅動程式不會針對驅動程序物件中未設定 DispatchXxx 例程的任何 IRP_MJ_XXX 傳送 IRP。 如需一組 IRP_MJ_XXX 需要不同類型基礎裝置驅動程式才能處理的詳細資訊,請參閱 IRP 主要函式程式碼。
DriverEntry 例程也會在驅動程式對象中設定驅動程式的 AddDevice、StartIo 和/或 Unload 進入點。
設備驅動器可以使用 HardwareDatabase 字串,在載入驅動程式時從登錄取得硬體組態資訊。 驅動程式會獲得此字串的唯讀存取權。
RegistryPath 輸入 DriverEntry 例程會指向 \Registry\Machine\System\CurrentControlSet\Services\DriverName 機碼,其中 driverName 的值 專案會識別驅動程式。 至於輸入驅動程序物件中的 HardwareDatabase,驅動程式會獲得此字串的只讀存取權。
驅動程式物件內的未記載成員應該視為無法存取。 具有對象成員位置相依性的驅動程式,或存取未記載成員的驅動程式可能無法在一段時間內保持可攜式且與其他驅動程式互通。
要求
要求 | 價值 |
---|---|
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |