DriverEntry のオプションの役割

階層化されたドライバー チェーン内での特定のドライバーの位置、基になるデバイスの性質、およびドライバーの設計に応じて、DriverEntry ルーチンは次の処理も行うことができます。

  • ドライバーがドライバー全体のデータの記憶域を必要とする場合は、IoAllocateDriverObjectExtension を呼び出してドライバー オブジェクト拡張機能を作成および初期化します。 ドライバー オブジェクト拡張機能は、ドライバー固有のデータ構造です。 たとえば、ドライバーは、そのドライバー オブジェクト拡張機能を使用して、レジストリ パスまたはその他のグローバル情報を格納できます。

  • ドライバーがそのようなスレッドを使用する最上位レベルのドライバー (ファイル システム ドライバーなど) である場合は、PsCreateSystemThread を呼び出してエグゼクティブ ワーカー スレッドを作成します。 この場合、ドライバーには、単一の入力 PVOID パラメーターを受け取る WORKER_THREAD_ROUTINE 型のコールバック ルーチンも必要です。

  • Reinitialize ルーチンの登録 (「再初期化ルーチンの記述」を参照)。

  • デバイス固有のミニポートまたはミニクラス ドライバーがポートまたはクラス ドライバーと連携して動作する場合など、ここで説明したものとは異なるクラス固有の初期化要件を処理します。 詳細については、Windows Driver Kit (WDK) のデバイスの種類別のドキュメントを参照してください。

システム リソースの記憶域の提供

デバイスごとのオブジェクトは、DriverEntry ではなく、PnP IRP_MN_START_DEVICE 要求を処理する AddDevice ルーチンまたはディスパッチ ルーチンに割り当てる必要があります。

ただし、ドライバーは、他のドライバー全体の用途のために追加のシステム領域メモリの割り当てが必要になる場合があります。 その場合、DriverEntry ルーチンは、次のルーチンの 1 つ (または複数) を呼び出すことができます。

  • IoAllocateDriverObjectExtension: ドライバー オブジェクトに関連付けられたコンテキスト領域を作成する

  • ページまたは非ページ システム領域メモリの ExAllocatePoolWithTag

  • キャッシュアラインされた非ページ システム空間メモリの MmAllocateNonCachedMemory または MmAllocateContiguousMemory (I/O バッファーに使用)

すべての DriverEntry ルーチンは、IRQL = PASSIVE_LEVEL のシステム スレッドのコンテキストで実行されます。 したがって、ExAllocatePoolWithTag で割り当てられたメモリは、ドライバーがシステム ページ ファイルを保持するデバイスを制御しない限り、初期化時にのみ使用できます。 割り当てられたメモリは、DriverEntry の制御を返す前に、ExFreePool で解放する必要があります。 ただし、Reinitialize ルーチンを設定するドライバーは、IoRegisterDriverReinitialization を呼び出すときにこのメモリへのポインターを渡すことができるため、ドライバーの Reinitialize ルーチンがメモリ割り当ての解放を処理します。

ハードウェア リソースの要求

以前の PnP ドライバー以外のドライバーは、レジストリからリソースを要求しました。 一方、PnP ドライバーは、レジストリにデバイス リソースを要求したり、リソース要件を直接書き込んだりすることはありません。 代わりに、これらのドライバーは、PnP マネージャーの列挙プロセスの一部として、特定の PnP IRP に応答して要件を報告します。 PnP ドライバーは、PnP IRP_MN_START_DEVICE 要求で割り当てられたリソースを受け取ります。

PnP マネージャーと直接やり取りしないドライバー (特定のミニポート ドライバーなど) には、PnP マネージャーと対話するクラスまたはポート ドライバーによって課されるさまざまなレポート要件がある場合があります。 このような要件は、デバイス クラスに固有です。 デバイス固有およびクラス固有の詳細については、Windows Driver Kit (WDK) の関連するデバイス クラスのドキュメントを参照してください。

レジストリを使用する

DriverEntry ルーチンは、レジストリを使用して、ドライバーを初期化するために必要な情報の一部を取得したり、他のドライバーまたは保護されたサブシステムに使用する情報をレジストリに設定したりすることができます。 情報の性質は、デバイスの種類によって異なります。 ドライバーは、ZwXxx ルーチンと RtlXxx ルーチンを使用してレジストリにアクセスできます。 DriverEntry ルーチンの RegistryPath パラメーターは、ドライバーのレジストリ キー \Registry\Machine\System\CurrentControlSet\Services\*DriverName へのパスを指定するカウントされた Unicode 文字列を指します。*DriverEntry が返された後にポインターが有効ではなくなったため、ルーチンはポインター自体ではなく文字列のコピーを保存する必要があります。