送信操作のキャンセル
次の図は、送信操作の取り消しを示しています。
ドライバーは、転送のために下位レベルのドライバーに渡す各 NET_BUFFER_LIST 構造の NDIS_SET_NET_BUFFER_LIST_CANCEL_ID マクロを呼び出します。 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID 関数は、指定されたパケットをキャンセル識別子でマークします。
キャンセル ID をパケットに割り当てる前に、ドライバーは NdisGeneratePartialCancelId を呼び出して、割り当てる各キャンセル ID の上位バイトを取得する必要があります。 これにより、ドライバーがシステム内の他のドライバーによって割り当てられたキャンセル ID を重複して使用しないようにします。 ドライバーは通常、NdisGeneratePartialCancelId を DriverEntry ルーチンから 1 回呼び出します。ただし、ドライバーは NdisGeneratePartialCancelId を複数回呼び出すことによって、複数の部分キャンセル識別子を取得できます。
マークされた NET_BUFFER_LIST 構造内のデータの保留中の転送を取り消すために、ドライバーは NdisCancelSendNetBufferLists 関数にキャンセル ID を渡します。 ドライバーは、NDIS_GET_NET_BUFFER_LIST_CANCEL_ID マクロを呼び出すことによって、NET_BUFFER_LIST 構造のキャンセル ID を取得できます。
ドライバーが同じキャンセル識別子ですべての NET_BUFFER_LIST 構造をマークした場合、NdisCancelSendNetBufferLists への 1 回の呼び出しですべての保留中の転送を取り消すことができます。 ドライバーは、一意の識別子を持つ NET_BUFFER_LIST 構造のサブグループ内のすべての NET_BUFFER_LIST 構造をマークする場合、NdisCancelSendNetBufferLists への 1 回の呼び出しで、そのサブグループ内のすべての保留中の送信を取り消すことができます。
NDIS は、バインドの適切な下位レベルのドライバーの MiniportCancelSend 関数を呼び出します。 保留中の転送を中止した後、基になるミニポート ドライバーは NdisMSendNetBufferListsComplete 関数を呼び出して、NET_BUFFER_LIST構造と NDIS_STATUS_SEND_ABORTED の完了状態を返します。 NDIS は、次に、適切なドライバーの ProtocolSendNetBufferListsComplete 関数を呼び出します。
ProtocolSendNetBufferListsComplete 関数では、プロトコル ドライバーは CancelId を NULL に設定して NDIS_SET_NET_BUFFER_LIST_CANCEL_ID を呼び出すことができます。 これにより、NET_BUFFER_LIST が誤って古いキャンセル ID で再び使用されるのを防ぐことができます。