カーネル モード ドライバーは、ドライバー オブジェクトに次のエントリ ポイントを指定する必要があります。
PnP、電源、および I/O 操作を要求する IRP を取得するために、少なくとも 1 つのディスパッチ ルーチンのエントリ ポイント。
AddDevice ルーチンのエントリ ポイント (DriverObject -> DriverExtension -> AddDevice)。
StartIo ルーチンのエントリ ポイント (IRP の独自のキューを管理する場合)。
ドライバーを動的に読み込んだり置き換えたりできる場合は、ドライバーが割り当てたシステム オブジェクトやメモリなどのシステム リソースを解放するための Unload エントリ ポイント (キーボード ドライバーなど、システムの実行中に置き換えることができないドライバーは、Unload ルーチンを指定する必要はありません)。
これらの要件は、対応するクラスまたはポート ドライバーがドライバー オブジェクトのエントリ ポイントを定義する一部のミニポート ドライバーには適用されません。 詳細については、デバイスの種類別のドキュメントを参照してください。
I/O マネージャーは、ドライバーによって作成されたデバイス オブジェクトに関する情報を、対応するドライバー オブジェクトに保持します。
ドライバーが読み込まれると、ドライバー オブジェクトへのポインターを使用して DriverEntry ルーチンが呼び出されます。 ドライバーの DriverEntry ルーチンが呼び出されると、Dispatch、StartIo (存在する場合)、および 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 マネージャーによってのみ使用されます。 他のメンバーもドライバー ライターによって使用されます。たとえば、AddDevice、Dispatch、StartIo、Unload エントリ ポイントを定義するには、特定のメンバー名を知っている必要があります。 文書化されていないメンバーを DRIVER_OBJECT 構造体内で使用したり、このドキュメントで指定されているドライバー オブジェクト メンバーの場所を想定したりしないでください。 それ以外の場合は、異なる Windows プラットフォーム間でドライバーの移植性を維持することはできません。