フィルター ドライバーでの送信要求のキャンセル
フィルター ドライバーは、フィルター ドライバーによって発生した、または上にあるドライバーによって発生した要求の送信を取り消すことができます。
フィルター ドライバーの送信要求の取り消し
次の図は、フィルター ドライバーによって送信された送信要求を取り消す方法を示しています。
フィルター ドライバーは、送信操作用に作成する各 NET_BUFFER_LIST 構造の NDIS_SET_NET_BUFFER_LIST_CANCEL_ID マクロを呼び出します。 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID 関数は、指定されたデータをキャンセル識別子でマークします。
キャンセル ID をネットワーク データに割り当てる前に、フィルター ドライバーは NdisGeneratePartialCancelId を呼び出して、割り当てる各キャンセル ID の上位バイトを取得する必要があります。 これにより、ドライバーがシステム内の他のドライバーによって割り当てられたキャンセル ID を重複して使用しないようにします。 ドライバーは通常、DriverEntry ルーチンから NdisGeneratePartialCancelId を 1 回呼び出します。 ただし、ドライバーは、NdisGeneratePartialCancelId を複数回呼び出 すことによって、複数の部分キャンセル識別子を 取得できます。
マークされた NET_BUFFER_LIST 構造内のデータの保留中の転送を取り消すために、フィルター ドライバーは NdisFCancelSendNetBufferLists 関数にキャンセル ID を渡します。 ドライバーは、NDIS_GET_NET_BUFFER_LIST_CANCEL_ID マクロを呼び出すことによって、NET_BUFFER_LIST 構造のキャンセル ID を取得できます。
フィルター ドライバーが同じキャンセル識別子ですべての NET_BUFFER_LIST 構造をマークした場合、NdisFCancelSendNetBufferLists への 1 回の呼び出しですべての保留中の転送を取り消すことができます。 フィルター ドライバーは、一意の識別子を持つ NET_BUFFER_LIST 構造のサブグループ内のすべての NET_BUFFER_LIST 構造をマークする場合、NdisFCancelSendNetBufferLists への 1 回の呼び出しで、そのサブグループ内のすべての保留中の送信を取り消すことができます。
NDIS は、基になるドライバーのキャンセル送信関数を呼び出します。 保留中の転送を中止した後、基になるドライバーは送信完了関数 (NdisMSendNetBufferListsComplete など) を呼び出して、完了状態が NDIS_STATUS_SEND_ABORTED の NET_BUFFER_LIST 構造を返します。 次に、NDIS は、フィルター ドライバーの FilterSendNetBufferListsComplete 関数を呼び出します。
FilterSendNetBufferListsComplete では、フィルター ドライバーは CancelId が NULL に設定された NDIS_SET_NET_BUFFER_LIST_CANCEL_ID を呼び出すことができます。 これにより、NET_BUFFER_LIST が誤って古いキャンセル ID で再び使用されるのを防ぐことができます。
上にあるドライバーによって送信された要求の送信を取り消す
次の図は、上にあるドライバーによって送信された送信要求を取り消す方法を示しています。
上にあるドライバーは、未処理の送信要求を取り消すために、キャンセル送信関数 (NdisFCancelSendNetBufferLists または NdisCancelSendNetBufferLists) を呼び出します。 これらの上にあるドライバーは、送信要求を行う前に、キャンセル ID で送信データをマークする必要があります。
NDIS は、フィルター ドライバーの FilterCancelSendNetBufferLists 関数を呼び出して、指定したキャンセル識別子でマークされているすべての NET_BUFFER_LIST 構造の転送を取り消します。
FilterCancelSendNetBufferLists は、次の操作を実行します。
指定したフィルター モジュールのキューに登録されている NET_BUFFER_LIST 構造のフィルター ドライバーの一覧を走査し、NDIS_GET_NET_BUFFER_LIST_CANCEL_ID マクロを呼び出して、各構造のキャンセル識別子を取得します。 フィルター ドライバーは、NDIS_GET_NET_BUFFER_LIST_CANCEL_ID に返されるキャンセル ID と NDIS が FilterCancelSendNetBufferLists に渡したキャンセル ID を比較します。
キャンセル識別子が指定されたキャンセル識別子と一致するすべての NET_BUFFER_LIST 構造 を送信キューから削除 (リンク解除) します。
リンクされていないすべての NET_BUFFER_LIST 構造に対して NdisFSendNetBufferListsComplete 関数を呼び出して構造を返します。 フィルター ドライバーは、NET_BUFFER_LIST 構造の状態フィールドを NDIS_STATUS_SEND_ABORTED に設定します。
NdisFCancelSendNetBufferLists 関数を呼び出して、基になるドライバーにキャンセル送信要求を渡します。 フィルター ドライバーは、上にあるドライバーから受信したキャンセル識別子を渡します。 取り消し操作は、フィルター ドライバーが発生したキャンセル送信操作と同様に続行されます。