ミニポート ドライバー停止ハンドラー
NDIS ミニポート ドライバーは、NdisMRegisterMiniportDriver に MiniportHaltEx 関数を提供する必要があります。
MiniportHaltEx は、MiniportInitializeEx が行ったことをすべてを元に戻す必要があります。 たとえば、NDIS ミニポート ドライバーは次のことを行います:
ポートを開放します。 (詳細については、「NDIS ポートの解放」を参照してください。)
MiniportInitializeEx が要求したすべてのハードウェア リソースを解放します。
NdisMDeregisterInterruptEx を呼び出して、割り込みリソースを解放します。
MiniportInitializeEx が割り当てたメモリを解放します。
MiniportShutdownEx 関数が既に NIC を初期状態に復元していない限り、NIC を停止します。
次の図は、ミニポート ドライバーのアンロードを示しています。
MiniportHaltEx は、戻る前にドライバーをアンロードするために必要な操作を完了する必要があります。 ミニポート ドライバーに未処理の受信表示がある場合 (つまり、NDIS に指示したものの、NDIS がまだ返していない受信ネットワークデータ)、このようなデータがミニポート ドライバーの MiniportReturnNetBufferLists 関数に返されるまで、MiniportHaltEx は戻ってはなりません。
上の図は、MiniportHaltEx 関数によって実行できる一連の呼び出しを示しています。 これらの呼び出しは、実行できる呼び出しのサブセットにすぎません。 呼び出しの実際のセットは、ミニポート ドライバーの以前のアクションによって異なります。 ミニポート ドライバーは、ハードウェアの問題のために、または必要なリソースを取得できないためにネットワーク アダプターを正常に初期化できない場合は、MiniportInitializeEx でこれらの同じ呼び出しを行うことができます。 このような場合、MiniportInitializeEx は、以前のアクションを元に戻して、ドライバーをアンロードする必要があります。 それ以外の場合は、MiniportHaltEx は、MiniportInitializeEx のアクションを元に戻します。
次の一覧では、ミニポート ドライバーが実行する可能性がある特定のアクションを元に戻すために必要な呼び出しについて説明します:
ミニポート ドライバーが割り込みを登録した場合は、NdisMDeregisterInterruptEx を呼び出す必要があります。
ミニポート ドライバーがタイマーを設定する場合は、作成したタイマーごとに NdisCancelTimerObject を呼び出す必要があります。 NdisCancelTimerObject の呼び出しが失敗した場合は、タイマーが既に発生している可能性があります。 この場合、ミニポート ドライバーは、MiniportHaltEx から戻る前に、タイマー ハンドラーが完了するまで待機する必要があります。
ミニポート ドライバーが NdisAllocateMemoryWithTagPriority を使用してメモリを割り当てた場合は、NdisFreeMemory を呼び出してそのメモリを解放する必要があります。
ミニポート ドライバーが NdisMAllocateSharedMemory、または NdisMAllocateSharedMemoryAsyncEx を使用してメモリを割り当てた場合は、そのメモリを解放するために NdisMFreeSharedMemory を呼び出す必要があります。
NdisAllocateNetBufferPool でパケット記述子のプールのストレージを割り当てて初期化した場合、そのストレージを解放する NdisFreeNetBufferPool を呼び出す必要があります。
ミニポート ドライバーが、ハードウェア リソースを割り当てたか予約した場合は、それらを返す必要があります。 たとえば、ミニポート ドライバーが NIC の I/O ポート範囲をマップした場合、NdisMDeregisterIoPortRange を呼び出してポートを解放する必要があります。