DRIVER_OBJECT 構造体 (wdm.h)
各ドライバー オブジェクトは、読み込まれたカーネル モード ドライバーのイメージを表します。 ドライバー オブジェクトへのポインターは、ドライバーの DriverEntry、 AddDevice、および省略可能な 再初期化 ルーチンへの入力パラメーターであり、存在する場合は 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 メンバー型を定義します。
Size
CSHORT メンバーサイズを定義します。
DeviceObject
ドライバーによって作成されたデバイス オブジェクトへのポインター。 ドライバーが IoCreateDevice を正常に呼び出すと、このメンバーは自動的に更新されます。 ドライバーは、このメンバーと DEVICE_OBJECT の NextDevice メンバーを使用して、ドライバーが作成したすべてのデバイス オブジェクトの一覧をステップ実行できます。
Flags
ULONG メンバーフラグを定義します。
DriverStart
PVOID メンバー DriverStart を定義します。
DriverSize
ULONG メンバー DriverSize を定義します。
DriverSection
PVOID メンバー DriverSection を定義します。
DriverExtension
ドライバー拡張機能へのポインター。 ドライバー拡張機能のアクセス可能なメンバーは DriverExtension-AddDevice> のみです。ドライバーの DriverEntry ルーチンは、ドライバーの AddDevice ルーチンを格納します。
DriverName
UNICODE_STRING メンバー DriverName を定義します。
HardwareDatabase
レジストリ内のハードウェア構成情報への \Registry\Machine\Hardware パスへのポインター。
FastIoDispatch
ドライバーの高速 I/O エントリ ポイントを定義する構造体へのポインター。 このメンバーは、FSD とネットワーク トランスポート ドライバーでのみ使用されます。
DriverInit
I/O マネージャーによって設定される DriverEntry ルーチンのエントリ ポイント。
DriverStartIo
ドライバーの StartIo ルーチン (ある場合) のエントリ ポイント。ドライバーの初期化時に DriverEntry ルーチンによって設定されます。 ドライバーに StartIo ルーチンがない場合、このメンバーは NULL です。
DriverUnload
ドライバーの Unload ルーチン (存在する場合) のエントリ ポイント。ドライバーの初期化時に DriverEntry ルーチンによって設定されます。 ドライバーに Unload ルーチンがない場合、このメンバーは NULL です。
MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]
ドライバーの DispatchXxx ルーチンのエントリ ポイントの配列で構成されるディスパッチ テーブル。 配列のインデックス値は、各 IRP メジャー関数コードを表すIRP_MJ_XXX 値です。 各ドライバーは、ドライバーが処理する 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 マネージャーは、ドライバーの転送アドレスを見つけることができません。 他の標準ドライバー ルーチンの名前は、ドライバー ライターの裁量で選択できます。
ドライバーは、ドライバーが読み込まれるときに DriverEntry ルーチンに渡されるドライバー オブジェクトの DispatchXxx エントリ ポイントを設定する必要があります。 デバイス ドライバーは、同じ種類のデバイスのドライバーが処理するために必要なIRP_MJ_XXX の 1 つ以上の DispatchXxx エントリ ポイントを設定する必要があります。 上位レベルのドライバーは、基になるデバイス ドライバーに渡す必要があるすべてのIRP_MJ_XXX に対して 1 つ以上の DispatchXxx エントリ ポイントを設定する必要があります。 それ以外の場合、ドライバーは、ドライバー オブジェクトで DispatchXxx ルーチンを設定していないIRP_MJ_XXX の IRP は送信されません。 さまざまな種類の基になるデバイスのドライバーを処理するために必要な IRP_MJ_XXX のセットの詳細については、「 IRP の主要な機能コード」を参照してください。
DriverEntry ルーチンは、ドライバー オブジェクトにドライバーの AddDevice、StartIo、Unload エントリ ポイント (存在する場合) も設定します。
HardwareDatabase 文字列は、ドライバーの読み込み時に、デバイス ドライバーがレジストリからハードウェア構成情報を取得するために使用できます。 ドライバーには、この文字列への読み取り専用アクセス権が付与されます。
DriverEntry ルーチンへの RegistryPath 入力は、\Registry\Machine\System\CurrentControlSet\Services\DriverName キーを指します。ここで、DriverName の値エントリはドライバーを識別します。 入力ドライバー オブジェクトの HardwareDatabase に関しては、ドライバーにはこの文字列への読み取り専用アクセス権が付与されます。
ドライバー オブジェクト内の文書化されていないメンバーは、アクセスできないと見なす必要があります。 オブジェクト メンバーの場所または文書化されていないメンバーへのアクセスに依存するドライバーは、移植性が維持されず、時間の経過と共に他のドライバーと相互運用できない可能性があります。
要件
要件 | 値 |
---|---|
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |