次の方法で共有


ドライバー オブジェクト内のドライバー エントリ ポイント

カーネル モード ドライバーは、ドライバー オブジェクトに次のエントリ ポイントを指定する必要があります。

  • PnP、電源、および I/O 操作を要求する IRP を取得するために、少なくとも 1 つのディスパッチ ルーチンのエントリ ポイント。

  • AddDevice ルーチンのエントリ ポイント (DriverObject -> DriverExtension -> AddDevice)。

  • StartIo ルーチンのエントリ ポイント (IRP の独自のキューを管理する場合)。

  • ドライバーを動的に読み込んだり置き換えたりできる場合は、ドライバーが割り当てたシステム オブジェクトやメモリなどのシステム リソースを解放するための Unload エントリ ポイント (キーボード ドライバーなど、システムの実行中に置き換えることができないドライバーは、Unload ルーチンを指定する必要はありません)。

これらの要件は、対応するクラスまたはポート ドライバーがドライバー オブジェクトのエントリ ポイントを定義する一部のミニポート ドライバーには適用されません。 詳細については、デバイスの種類別のドキュメントを参照してください。

I/O マネージャーは、ドライバーによって作成されたデバイス オブジェクトに関する情報を、対応するドライバー オブジェクトに保持します。

ドライバーが読み込まれると、ドライバー オブジェクトへのポインターを使用して DriverEntry ルーチンが呼び出されます。 ドライバーの DriverEntry ルーチンが呼び出されると、DispatchStartIo (存在する場合)、および Unload (存在する場合) エントリ ポイントがドライバー オブジェクト内に次のように直接設定されます。

DriverObject->MajorFunction[IRP_MJ_xxx] = DDDispatchXxx; 
              :    : 
DriverObject->MajorFunction[IRP_MJ_yyy] = DDDispatchYyy; 
              :    : 
DriverObject->DriverStartIo = DDStartIo; 
DriverObject->DriverUnload = DDUnload; 
              :    : 

DriverEntry ルーチンは、次のように、そのドライバー オブジェクトの DriverExtension 内の AddDevice ルーチンのエントリ ポイントも設定します。

DriverObject->DriverExtension->AddDevice = DDAddDevice; 

DriverEntry ルーチンまたはオプションの Reinitialize ルーチンは、「ドライバー オブジェクトの概要」の図に示されていないドライバー オブジェクトのフィールドを使用して、構成マネージャーのレジストリ データベースから情報を取得したり、情報を設定したりすることもできます。 詳細については、「デバイスとドライバーのレジストリ ツリー」を参照してください。

I/O マネージャーが、DRIVER_OBJECT 構造体であるドライバー オブジェクトを操作するためのサポート ルーチンをエクスポートすることはありません。 ドライバー オブジェクトは、現在読み込まれているドライバーを追跡するために I/O マネージャーによって使用されます。 ドライバー オブジェクトの一部のメンバーは、I/O マネージャーによってのみ使用されます。 他のメンバーもドライバー ライターによって使用されます。たとえば、AddDeviceDispatchStartIoUnload エントリ ポイントを定義するには、特定のメンバー名を知っている必要があります。 文書化されていないメンバーを DRIVER_OBJECT 構造体内で使用したり、このドキュメントで指定されているドライバー オブジェクト メンバーの場所を想定したりしないでください。 それ以外の場合は、異なる Windows プラットフォーム間でドライバーの移植性を維持することはできません。