從篩選驅動程式傳送資料
篩選驅動程式可以起始傳送要求,或篩選傳送過度啟動驅動程式的要求。 當通訊協定驅動程式呼叫 NdisSendNetBufferLists 函式時,NDIS 會將指定的 NET_BUFFER_LIST 結構提交至驅動程式堆疊中最上層的篩選模組。
傳送篩選驅動程式起始的要求
下圖說明篩選驅動程式起始的傳送作業。
篩選驅動程式會呼叫 NdisFSendNetBufferLists 函式,以傳送 NET_BUFFER_LIST 結構清單中定義的網路資料。
篩選驅動程式必須設定其所建立之每個NET_BUFFER_LIST結構的SourceHandle成員,其傳遞給NdisFSendNetBufferLists之 NdisFilterHandle參數的值相同。 NDIS 驅動程式不應該修改驅動程式未產生之NET_BUFFER_LIST結構的 SourceHandle 成員。
在呼叫 NdisFSendNetBufferLists之前,篩選驅動程式可以設定傳送要求隨附 NET_BUFFER_LIST_INFO 宏的資訊。 基礎驅動程式可以使用 NET_BUFFER_LIST_INFO 宏來擷取此資訊。
一旦篩選驅動程式呼叫 NdisFSendNetBufferLists,就會放棄NET_BUFFER_LIST結構和所有相關聯資源的擁有權。 NDIS 可以處理傳送要求,或將要求傳遞至基礎驅動程式。
NDIS 會呼叫 FilterSendNetBufferListsComplete 函式,以將結構和資料傳回至篩選驅動程式。 NDIS 可以在將清單傳遞至FilterSendNetBufferListsComplete之前,先將多個傳送要求的結構和資料收集到單一連結的 NET_BUFFER_LIST 結構清單
在 NDIS 呼叫 FilterSendNetBufferListsComplete之前,傳送要求的目前狀態為未知。 在 NDIS 將結構傳回FilterSendNetBufferListsComplete之前,篩選驅動程式不應該嘗試檢查NET_BUFFER_LIST結構或任何相關聯的資料。
FilterSendNetBufferListsComplete 會執行完成傳送作業所需的任何後置處理。
當 NDIS 呼叫 FilterSendNetBufferListsComplete時,篩選驅動程式會重新取得 與 NetBufferLists 參數所指定之NET_BUFFER_LIST結構相關聯的所有資源的擁有權。 FilterSendNetBufferListsComplete 可以釋出這些資源 (,例如呼叫 NdisFreeNetBuffer 和 NdisFreeNetBufferList 函式) ,或準備在 後續呼叫 NdisFSendNetBufferLists時重複使用。
NDIS 一律會將篩選提供的網路資料提交至篩選驅動程式決定順序中傳遞至 NdisFSendNetBufferLists的基礎驅動程式。 不過,在以指定的順序傳送資料之後,基礎驅動程式可以依任何順序傳回緩衝區。
篩選驅動程式可以要求回送給其來源的傳送要求。 若要要求回送,驅動程式會在NdisFSendNetBufferLists的SendFlags參數中設定 NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK 旗標。 NDIS 表示已接收的封包,其中包含傳送資料。
注意 篩選驅動程式應該追蹤其來源的傳送要求,並確定它不會在這類要求完成時呼叫 NdisFSendNetBufferListsComplete 函式。
篩選傳送要求
下圖說明篩選過度驅動程式起始的傳送要求。
NDIS 會呼叫篩選驅動程式的 FilterSendNetBufferLists 函式,以篩選過度配置驅動程式的傳送要求。
篩選驅動程式不得修改它從其他驅動程式收到的NET_BUFFER_LIST結構中的 SourceHandle 成員。
篩選驅動程式可以篩選資料,並將篩選的資料傳送至基礎驅動程式。 針對提交至 FilterSendNetBufferLists的每個NET_BUFFER結構,篩選驅動程式可以執行下列動作:
呼叫 NdisFSendNetBufferLists 函式,將緩衝區傳遞至下一個基礎驅動程式。 NDIS 保證內容空間的可用性 (請參閱 篩選驅動程式NET_BUFFER_LIST_CONTEXT結構) 。 篩選驅動程式可以在呼叫 NdisFSendNetBufferLists之前修改緩衝區內容。 篩選資料的處理會繼續,如同篩選驅動程式起始的傳送作業一樣。
呼叫 NdisFSendNetBufferListsComplete 函式來卸載緩衝區。
將本機資料結構中的緩衝區排入佇列,以供稍後處理。 篩選驅動程式的設計會指定導致驅動程式處理佇列緩衝區的原因。 某些範例包括在收到特定緩衝區後逾時或處理之後的處理。
注意 如果驅動程式佇列傳送要求以供稍後處理,它必須支援傳送取消要求。 如需傳送取消要求的詳細資訊,請參閱 取消篩選驅動程式中的傳送要求。
複製緩衝區,並使用複本產生傳送要求。 傳送作業類似于篩選驅動程式起始的傳送要求。 在此情況下,驅動程式必須藉由呼叫 NdisFSendNetBufferListsComplete 函式,將原始緩衝區傳回至過度使用的驅動程式。
完成傳送要求會繼續執行驅動程式堆疊。 當迷你埠驅動程式呼叫 NdisMSendNetBufferListsComplete 函式時,NDIS 會針對最低過度篩選模組呼叫 FilterSendNetBufferListsComplete 函式。
完成傳送作業之後,篩選驅動程式會反轉篩選驅動程式在 FilterSendNetBufferLists中所做的過度驅動程式緩衝區描述元的修改。 驅動程式會呼叫 NdisFSendNetBufferListsComplete 函式,將NET_BUFFER_LIST結構的連結清單傳回至過度配置驅動程式,並傳回傳送要求的最終狀態。
當最上層的篩選模組呼叫 NdisFSendNetBufferListsComplete時,NDIS 會呼叫原始通訊協定驅動程式的 ProtocolSendNetBufferListsComplete 函式。
未提供 FilterSendNetBufferLists 函式的篩選驅動程式仍然可以起始傳送要求。 如果這類驅動程式確實起始傳送要求,它必須提供 FilterSendNetBufferListsComplete 函式,而且不得將完整事件傳遞至驅動程式堆疊。
篩選驅動程式可以傳遞或篩選過度處理驅動程式的回送要求。 若要傳遞回送要求,如果 NDIS 在FilterSendNetBufferLists的SendFlags參數中設定NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK,則篩選驅動程式會在呼叫NdisFSendNetBufferLists時,在SendFlags參數中設定NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK。 NDIS 表示已接收的封包,其中包含傳送資料。
一般而言,如果篩選驅動程式以 NDIS 無法提供標準服務的方式修改任何行為, (例如回送) ,篩選驅動程式就必須為 NDIS 提供服務。 例如,修改硬體位址要求的篩選驅動程式 (請參閱 OID_802_3_CURRENT_ADDRESS) ,應該處理導向至新硬體位址的緩衝區回送。 在此情況下,NDIS 無法提供它通常提供的回送服務,因為篩選已改變位址。 此外,如果篩選驅動程式 (看到OID_GEN_CURRENT_PACKET_FILTER ) ,則不應該將接收的額外資料傳遞給過度佔用驅動程式。