共用方式為


在篩選驅動程式中接收資料

篩選驅動程式可以起始接收指示,或篩選來自基礎驅動程式的接收指示。 當迷你埠驅動程式呼叫 NdisMIndicateReceiveNetBufferLists 函式時,NDIS 會將指定的 NET_BUFFER_LIST 結構提交至驅動程式堆疊中最低的過度使用篩選模組。

接收篩選驅動程式起始的指示

下圖說明篩選驅動程式起始的接收指示。

說明篩選驅動程式起始之接收指示的圖表。

篩選驅動程式會呼叫 NdisFIndicateReceiveNetBufferLists 函式來指出已接收的資料。 NdisFIndicateReceiveNetBufferLists函式會將堆疊上NET_BUFFER_LIST結構的指示清單傳遞至超載驅動程式。 篩選驅動程式會從在初始化期間建立的集區配置結構。

如果篩選驅動程式在NdisFIndicateReceiveNetBufferListsReceiveFlags參數中設定NDIS_RECEIVE_FLAGS_RESOURCES旗標,這表示篩選驅動程式必須立即重新取得NET_BUFFER_LIST結構的擁有權。 在此情況下,NDIS 不會呼叫篩選驅動程式的 FilterReturnNetBufferLists 函式,以傳回 NET_BUFFER_LIST 結構。 篩選驅動程式會在 NdisFIndicateReceiveNetBufferLists 傳回之後立即重新取得擁有權。

如果篩選驅動程式未在NdisFIndicateReceiveNetBufferListsReceiveFlags參數中設定NDIS_RECEIVE_FLAGS_RESOURCES旗標,NDIS 會將指定的NET_BUFFER_LIST結構傳回至篩選驅動程式的FilterReturnNetBufferLists函式。 在此情況下,篩選驅動程式會放棄所指示結構的擁有權,直到 NDIS 將它們傳回 FilterReturnNetBufferLists為止。

注意 篩選驅動程式應該追蹤其起始的接收指示,並確定它不會在接收作業完成時呼叫 NdisFReturnNetBufferLists 函式。

篩選接收指示

下圖說明基礎驅動程式起始的篩選接收指示。

說明基礎驅動程式起始之篩選接收指示的圖表。

NDIS 會呼叫篩選驅動程式的 FilterReceiveNetBufferLists 函式,以處理來自基礎驅動程式的指示。 NDIS 會在基礎驅動程式呼叫接收指示函式之後呼叫 FilterReceiveNetBufferLists (例如 ,NdisMIndicateReceiveNetBufferLists) 來表示收到的網路資料或回送資料。

如果未設定FilterReceiveNetBufferListsReceiveFlags參數中的NDIS_RECEIVE_FLAGS_RESOURCES旗標,則篩選驅動程式會保留NET_BUFFER_LIST結構的擁有權,直到呼叫NdisFReturnNetBufferLists函式為止。

如果已設定ReceiveFlags參數中的NDIS_RECEIVE_FLAGS_RESOURCES旗標,篩選驅動程式就無法保留NET_BUFFER_LIST結構和相關聯的基礎驅動程式配置資源。 此旗標可以指出基礎驅動程式在接收資源上執行不足。 FilterReceiveNetBufferLists函式應該儘快傳回。

注意 如果 已設定NDIS_RECEIVE_FLAGS_RESOURCES 旗標,篩選驅動程式必須保留連結清單中的原始 NET_BUFFER_LIST 結構集。 例如,當設定此旗標時,驅動程式可能會處理結構,並一次指出堆疊一次,但在函式傳回之前,它必須還原原始連結的清單。

篩選驅動程式可以在接收的資料上執行篩選作業,再將資料指示為過度處理驅動程式。 針對提交至 FilterReceiveNetBufferLists 函式的每個緩衝區,篩選驅動程式可以執行下列動作:

  • 藉由呼叫 NdisFIndicateReceiveNetBufferLists將它傳遞至下一個超載驅動程式。 驅動程式可以修改緩衝區的內容。 NDIS 保證內容空間的可用性 (請參閱 NET_BUFFER_LIST_CONTEXT結構) 。

    篩選驅動程式可以變更傳遞至 FilterReceiveNetBufferLists 的 NDIS 狀態,或直接將它傳遞至 NdisFIndicateReceiveNetBufferLists

    注意即使 NDIS 在FilterReceiveNetBufferListsReceiveFlags參數中設定NDIS_RECEIVE_FLAGS_RESOURCES旗標,篩選驅動程式仍可傳遞具有NdisFIndicateReceiveNetBufferLists的緩衝區。 在此情況下,篩選驅動程式不得從 FilterReceiveNetBufferLists 傳回,直到重新取得緩衝區的擁有權為止。

  • 捨棄緩衝區。 如果 NDIS 在FilterReceiveNetBufferListsReceiveFlags參數中清除NDIS_RECEIVE_FLAGS_RESOURCES旗標,請呼叫NdisFReturnNetBufferLists函式來捨棄緩衝區。 如果 NDIS 在FilterReceiveNetBufferListsReceiveFlags參數中設定NDIS_RECEIVE_FLAGS_RESOURCES旗標,則不採取任何動作並從FilterReceiveNetBufferLists傳回以捨棄緩衝區。

  • 將本機資料結構中的緩衝區排入佇列,以供稍後處理。 如果 NDIS 在FilterReceiveNetBufferListsReceiveFlags參數中設定NDIS_RECEIVE_FLAGS_RESOURCES旗標,篩選驅動程式必須先建立複本,再從FilterReceiveNetBufferLists傳回。

  • 複製緩衝區,並使用複本產生接收指示。 接收指示類似于篩選驅動程式起始的接收指示。 在此情況下,驅動程式必須將原始緩衝區傳回至基礎驅動程式。

NdisFIndicateReceiveNetBufferLists函式會將驅動程式堆疊上NET_BUFFER_LIST結構的指示清單傳遞至過度配置驅動程式。 接收作業與篩選驅動程式起始的接收作業類似。

如果過度配置驅動程式保留緩衝區的擁有權,NDIS 會呼叫篩選模組的 FilterReturnNetBufferLists 函式。 在其 FilterReturnNetBufferLists 函式中,篩選驅動程式會復原它在接收指示路徑上緩衝區上執行的作業。

當最低層篩選模組指出它是使用緩衝區完成時,NDIS 會將緩衝區傳回至迷你埠驅動程式。 如果 NDIS 在FilterReceiveNetBufferListsReceiveFlags參數中清除NDIS_RECEIVE_FLAGS_RESOURCES旗標,篩選驅動程式會呼叫NdisFReturnNetBufferLists以傳回緩衝區。 如果 NDIS 在FilterReceiveNetBufferListsReceiveFlags參數中設定NDIS_RECEIVE_FLAGS_RESOURCES旗標,則從FilterReceiveNetBufferLists傳回會傳回緩衝區。