次の方法で共有


送信操作のキャンセル

次の図は、送信操作の取り消しを示しています。

Diagram that shows the process of canceling a send operation.

ドライバーは、転送のために下位レベルのドライバーに渡す各 NET_BUFFER_LIST 構造の NDIS_SET_NET_BUFFER_LIST_CANCEL_ID マクロを呼び出します。 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID 関数は、指定されたパケットをキャンセル識別子でマークします。

キャンセル ID をパケットに割り当てる前に、ドライバーは NdisGeneratePartialCancelId を呼び出して、割り当てる各キャンセル ID の上位バイトを取得する必要があります。 これにより、ドライバーがシステム内の他のドライバーによって割り当てられたキャンセル ID を重複して使用しないようにします。 ドライバーは通常、NdisGeneratePartialCancelIdDriverEntry ルーチンから 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 関数では、プロトコル ドライバーは CancelIdNULL に設定して NDIS_SET_NET_BUFFER_LIST_CANCEL_ID を呼び出すことができます。 これにより、NET_BUFFER_LIST が誤って古いキャンセル ID で再び使用されるのを防ぐことができます。