次の方法で共有


DRIVER_OBJECT構造体 (wdm.h)

各ドライバー オブジェクトは、読み込まれたカーネル モード ドライバーのイメージを表します。 ドライバー オブジェクトへのポインターは、ドライバーの DriverEntryAddDevice、およびオプションの ルーチンを再初期化し、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

Type CSHORT メンバー定義します。

Size

CSHORT メンバー Sizeを定義します。

DeviceObject

ドライバーによって作成されたデバイス オブジェクトへのポインター。 ドライバーが IoCreateDevice を正常に呼び出すと、このメンバー 自動的に更新されます。 ドライバーは、このメンバーと NextDeviceDEVICE_OBJECT のメンバーを使用して、ドライバーが作成したすべてのデバイス オブジェクトの一覧をステップ実行できます。

Flags

ULONG メンバー Flagsを定義します。

DriverStart

DriverStart PVOID メンバー定義します。

DriverSize

DriverSize ULONG メンバー を定義します。

DriverSection

DriverSection PVOID メンバー定義します。

DriverExtension

ドライバー拡張機能へのポインター。 ドライバー拡張機能の唯一のアクセス可能なメンバーは 、DriverExtension->AddDeviceです。ドライバーの DriverEntry ルーチンには、ドライバーの AddDevice ルーチンが格納されます。

DriverName

DriverName UNICODE_STRING メンバーを定義します。

HardwareDatabase

レジストリ内のハードウェア構成情報への \Registry\Machine\Hardware パスへのポインター。

FastIoDispatch

ドライバーの高速 I/O エントリ ポイントを定義する構造体へのポインター。 このメンバーは、FSD とネットワーク トランスポート ドライバーによってのみ使用されます。

DriverInit

I/O マネージャーによって設定される、DriverEntry ルーチンのエントリ ポイント。

DriverStartIo

ドライバーの StartIo ルーチンのエントリ ポイント (ある場合)、ドライバーの初期化時に DriverEntry ルーチンによって設定されます。 ドライバーに StartIo ルーチンがない場合、このメンバーは NULL

DriverUnload

ドライバーの アンロード ルーチンのエントリ ポイント (存在する場合)、ドライバーの初期化時に 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 ルーチンは、ドライバー オブジェクトにドライバーの AddDeviceStartIo、または Unload エントリ ポイント (存在する場合) を設定します。

HardwareDatabase 文字列は、ドライバーの読み込み時にデバイス ドライバーがレジストリからハードウェア構成情報を取得するために使用できます。 ドライバーには、この文字列への読み取り専用アクセス権が付与されます。

RegistryPathDriverEntry ルーチンへの入力は、driverName の値エントリがドライバーを識別する、\Registry\Machine\System\CurrentControlSet\Services\DriverName キー 指します。 入力ドライバー オブジェクトの HardwareDatabase に関しては、ドライバーには、この文字列への読み取り専用アクセス権が与えられています。

ドライバー オブジェクト内の文書化されていないメンバーは、アクセス不可と見なす必要があります。 オブジェクト メンバーの場所または文書化されていないメンバーへのアクセスに依存するドライバーは、移植性が維持されず、時間の経過と共に他のドライバーと相互運用できない可能性があります。

必要条件

要件 価値
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)

関連項目

DriverEntry

IoCreateDevice

IoDeleteDevice

StartIo

アンロード