ネットワーク ドライバーの非同期 I/O と補完関数

待機時間は、一部のネットワーク操作に固有です。 この待機時間のため、ミニポート ドライバーとプロトコル ドライバーの下端関数によって提供される上端関数の多くは、非同期操作をサポートするように設計されています。 時間のかかるタスクの完了やハードウェア イベントの通知のためにループ内で待機している CPU サイクルを無駄にするのではなく、ネットワーク ドライバーはほとんどの操作を非同期的に処理する機能に頼っています。

非同期ネットワーク I/O は、完了関数を使用してサポートされます。 次の例は、ネットワーク送信操作に完了関数を使用する方法を示していますが、プロトコルまたはミニポート ドライバーによって実行される他の多くの操作にも同じメカニズムが存在します。

プロトコル ドライバーが NDIS を呼び出してパケットを送信して、ミニポート ドライバーの MiniportSendNetBufferLists 関数の呼び出しが発生すると、ミニポート ドライバーはすぐにこの要求を完了し、結果として適切な状態値を返すことができます。 同期操作の場合、送信の正常な完了を示す NDIS_STATUS_SUCCESS、NDIS_STATUS_RESOURCES、および何らかの障害を示す NDIS_STATUS_FAILURE のいずれかの応答が返る可能性があります。

ただし、ミニポート ドライバー (または NDIS) がパケットをキューに入れ、NIC が送信操作の結果を示すまで待っている間、送信操作が完了するまでに時間がかかる場合があります。 ミニポート ドライバーの MiniportSendNetBufferLists 関数は、NDIS_STATUS_PENDINGの状態値を返すことによって、非同期的にこの操作を処理できます。 ミニポート ドライバーは、送信操作を完了すると、完了関数 NdisMSendNetBufferListsComplete を呼び出し、送信されたパケット記述子へのポインターを渡します。 この情報はプロトコル ドライバーに渡され、シグナリングが完了します。

完了に時間を要する可能性があるほとんどのドライバー操作では、同様の完了関数を使用した非同期操作がサポートされます。 このような関数には、NdisMXxxComplete という形式の名前が付けられます。

完了関数は、次の場合にも提供されます。

  • 構成の設定とクエリ実行。

  • ハードウェアをリセットします。

  • 状態を示します。

  • 受信したデータを示します。

  • 受信したデータを転送します。