取消篩選驅動程式中的傳送要求
篩選驅動程式可以取消傳送由篩選驅動程式所產生或由過度處理驅動程式所產生的要求。
取消篩選驅動程式傳送要求
下圖說明取消由篩選驅動程式產生的傳送要求。
篩選驅動程式會針對它針對傳送作業所建立的每個NET_BUFFER_LIST結構呼叫NDIS_SET_NET_BUFFER_LIST_CANCEL_ID宏。 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID函式會標示具有取消識別碼的指定資料。
將取消識別碼指派給網路資料之前,篩選驅動程式必須呼叫 NdisGeneratePartialCancelId ,以取得其指派之每個取消識別碼的高序位元組。 這可確保驅動程式不會重複系統中其他驅動程式指派的取消識別碼。 驅動程式通常會從DriverEntry常式呼叫NdisGeneratePartialCancelId一次。 不過,驅動程式可以多次呼叫 NdisGeneratePartialCancelId 來取得多個部分取消識別碼。
若要取消標示NET_BUFFER_LIST結構中的資料暫止傳輸,篩選驅動程式會將取消識別碼傳遞至 NdisFCancelSendNetBufferLists 函式。 驅動程式可以藉由呼叫 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 宏來取得NET_BUFFER_LIST結構的取消識別碼。
如果篩選驅動程式以相同的取消識別碼標記所有NET_BUFFER_LIST結構,它可以取消所有擱置的傳輸,並透過單一呼叫 NdisFCancelSendNetBufferLists。 如果篩選驅動程式以唯一識別碼標記NET_BUFFER_LIST結構子群組內的所有NET_BUFFER_LIST結構,則可以取消該子群組內所有擱置中的傳輸,並透過單一呼叫 NdisFCancelSendNetBufferLists。
NDIS 會呼叫基礎驅動程式的取消傳送函式。 中止擱置傳輸之後,基礎驅動程式會呼叫傳送完整函式 (例如 NdisMSendNetBufferListsComplete) ,以傳回NDIS_STATUS_SEND_ABORTED完成狀態NET_BUFFER_LIST結構。 NDIS 接著會呼叫篩選驅動程式的 FilterSendNetBufferListsComplete 函式 。
在 FilterSendNetBufferListsComplete中,篩選驅動程式可以使用 CancelId 設定為 Null呼叫NDIS_SET_NET_BUFFER_LIST_CANCEL_ID。 這可防止NET_BUFFER_LIST意外再次搭配過時的取消識別碼使用。
取消透過過度處理驅動程式產生的傳送要求
下圖說明取消源自過度驅動程式的傳送要求。
過度處理驅動程式會呼叫取消傳送函式 ( NdisFCancelSendNetBufferLists 或 NdisCancelSendNetBufferLists) 取消未處理傳送要求。 這些過度套用的驅動程式必須在發出傳送要求之前,先以取消識別碼標記傳送資料。
NDIS 會呼叫篩選驅動程式的 FilterCancelSendNetBufferLists 函式,以取消以指定取消識別碼標示的所有 NET_BUFFER_LIST 結構傳輸。
FilterCancelSendNetBufferLists 會執行下列作業:
針對指定的篩選模組周遊篩選驅動程式的佇列NET_BUFFER_LIST結構清單,並呼叫 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 宏,以取得每個結構的取消識別碼。 篩選驅動程式會比較NDIS_GET_NET_BUFFER_LIST_CANCEL_ID傳回的取消識別碼與 NDIS 傳遞至 FilterCancelSendNetBufferLists的取消識別碼。
從傳送佇列中移除 (取消連結) 取消識別碼符合指定取消識別碼的所有NET_BUFFER_LIST結構。
針對所有未連結NET_BUFFER_LIST結構呼叫 NdisFSendNetBufferListsComplete 函式,以傳回結構。 篩選驅動程式會將NET_BUFFER_LIST結構的狀態欄位設定為NDIS_STATUS_SEND_ABORTED。
呼叫 NdisFCancelSendNetBufferLists 函式,將取消傳送要求傳遞至基礎驅動程式。 篩選驅動程式會傳遞它從過度顯示驅動程式收到的取消識別碼。 取消作業會繼續,如同篩選驅動程式產生的取消傳送作業一樣。