ミニポート ドライバーの初期化

ネットワーク デバイスが使用可能になると、システムは NDIS ミニポート ドライバーを読み込み、デバイスを管理します (ドライバーがまだ読み込まれていない場合)。 すべてのミニポート ドライバーは、DriverEntry 関数を提供する必要があります。 システムは、ドライバーを読み込んだ後に DriverEntry を呼び出します。 DriverEntry は、ミニポート ドライバーの特性を NDIS に登録します (サポートされている NDIS バージョンとドライバーのエントリ ポイントを含む)。

システムは DriverEntry に次の 2 つの引数を渡します。

  • I/O システムによって作成されたドライバー オブジェクトへのポインター。

  • ドライバー固有のパラメーターを格納する場所を指定するレジストリ パスへのポインター。

DriverEntry では、ミニポート ドライバーは、NdisMRegisterMiniportDriver 関数の呼び出しでこれらのポインターの両方を渡します。 ミニポート ドライバーは、エントリ ポイントを NDIS_MINIPORT_DRIVER_CHARACTERISTICS 構造体に格納し、その構造体を NdisMRegisterMiniportDriver に渡すことによって、標準の MiniportXxx 関数のセットをエクスポートします。

ミニポート ドライバーの DriverEntry は、NdisMRegisterMiniportDriver への呼び出しによって返される値を返します。

ミニポート ドライバーは、DriverEntry で必要なその他のドライバー固有の初期化も実行します。 ドライバーは、MiniportInitializeEx 関数でアダプター固有の初期化を実行します。 アダプターの初期化の詳細については、「アダプターの初期化」を参照してください 。

DriverEntry は、NDIS ライブラリが関連する情報を独自のストレージにコピーするため、スタックに NDIS_MINIPORT_DRIVER_CHARACTERISTICS 構造体を割り当てることができます。 DriverEntry は、そのメンバーにドライバーが指定した値を設定する前に、NdisZeroMemory でこの構造体のメモリをクリアする必要があります。 MajorNdisVersionMinorNdisVersion メンバーには、ドライバーがサポートする NDIS のメジャー バージョンとマイナー バージョンを含める必要があります。 特性構造体の各 Xxx Handler メンバーでは、DriverEntry は、ドライバーが提供する MiniportXxx 関数のエントリ ポイントを設定する必要があります。または、メンバーは NULL である必要があります。

ミニポート ドライバーが省略可能なサービスを構成できるようにするため、NDISは NdisMRegisterMiniportDriver へのミニポートドライバーの呼び出しのコンテキスト内で MiniportSetOptions 関数を呼び出します。 省略可能なサービスの詳細については、「オプションのミニポート ドライバー サービスの構成」を参照してください。

NdisMRegisterMiniportDriver を呼び出すドライバーは、DriverEntry が返された後いつでも、MiniportInitializeEx 関数を呼び出すために NDIS 用に準備する必要があります。 このようなドライバーには、ネットワーク I/O 操作を実行するために必要な NIC 固有のリソースを設定するために、レジストリに格納されている、または NdisXxx バスの種類固有の構成関数に対する呼び出しから使用できる、十分なインストールと構成情報が必要です。

ミニポート ドライバーは最終的に、NdisMDeregisterMiniportDriver を呼び出すことによって割り当てられたリソースを解放する NdisMRegisterMiniportDriver を呼び出す必要があります。 NdisMRegisterMiniportDriver への呼び出しが成功した後にドライバーの初期化が失敗した場合、ドライバーは DriverEntry 内から NdisMDeregisterMiniportDriver を呼び出すことができます。 それ以外の場合、ミニポート ドライバーは、MiniportDriverUnload 関数に割り当てるドライバー固有のリソースを解放する必要があります。 つまり、NdisMRegisterMiniportDriver が NDIS_STATUS_SUCCESS を返さない場合、 DriverEntry はコントロールを返す前に、割り当てられたリソースを解放する必要があります。 この場合、ドライバーは読み込まれません。 詳細については、「ミニポート ドライバーのアンロード」を参照してください。