共用方式為


接收網路資料

下圖說明基本接收作業,其中包含迷你埠驅動程式、NDIS 和通訊協定驅動程式。

說明基本網路接收作業的圖表。

迷你埠驅動程式會呼叫 NdisMIndicateReceiveNetBufferLists 函式,以向較高層級驅動程式指出 NET_BUFFER 結構。 每個NET_BUFFER結構通常應該附加至個別 NET_BUFFER_LIST 結構。 這可讓通訊協定驅動程式建立原始NET_BUFFER_LIST結構清單的子集,並將其轉送到不同的用戶端。 某些驅動程式,例如原生 IEEE 802.11 迷你埠驅動程式,可能會將多個NET_BUFFER結構附加至NET_BUFFER_LIST結構。

連結所有NET_BUFFER_LIST結構之後,迷你埠驅動程式會將清單中的第一個NET_BUFFER_LIST結構的指標傳遞至 NdisMIndicateReceiveNetBufferLists 函式。 NDIS 會檢查NET_BUFFER_LIST結構,並呼叫與NET_BUFFER_LIST結構相關聯之每個通訊協定驅動程式的 ProtocolReceiveNetBufferLists 函式。 NDIS 會傳遞清單的子集,其中包含與每個通訊協定驅動程式正確系結相關聯的NET_BUFFER_LIST結構。 NDIS 會比對NET_BUFFER_LIST 結構中指定的 NetBufferListFrameType 值,與每個通訊協定驅動程式註冊的框架類型相符。

如果傳遞至通訊協定驅動程式ProtocolReceiveNetBufferLists函式的ReceiveFlags參數中的NDIS_RECEIVE_FLAGS_RESOURCES旗標已設定,NDIS 會在ProtocolReceiveNetBufferLists呼叫傳回之後,重新取得NET_BUFFER_LIST結構的擁有權。

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

如果未設定傳遞至通訊協定驅動程式ProtocolReceiveNetBufferLists函式之ReceiveFlags參數中的NDIS_RECEIVE_FLAGS_RESOURCES旗標,通訊協定驅動程式可以保留NET_BUFFER_LIST結構的擁有權。 在此情況下,通訊協定驅動程式必須呼叫 NdisReturnNetBufferLists 函式,以傳回NET_BUFFER_LIST結構。

如果迷你埠驅動程式在接收資源上執行不足,它可以在呼叫 NdisMIndicateReceiveNetBufferListsReceiveFlags參數中設定NDIS_RECEIVE_FLAGS_RESOURCES旗標。 在此情況下,當NdisMIndicateReceiveNetBufferLists傳回時,驅動程式可以回收所有指示NET_BUFFER_LIST結構和內嵌NET_BUFFER結構的擁有權。 指出具有NDIS_RECEIVE_FLAGS_RESOURCES旗標集的NET_BUFFER結構會強制通訊協定驅動程式複製資料,因此應該避免。 迷你埠驅動程式應該會偵測何時即將用盡接收資源,並採取任何避免這種情況的必要步驟。

NDIS 會在通訊協定驅動程式呼叫NdisReturnNetBufferLists之後呼叫迷你埠驅動程式的MiniportReturnNetBufferLists函式。

注意 如果迷你埠驅動程式指出已設定NDIS_RECEIVE_FLAGS_RESOURCES旗標的NET_BUFFER_LIST結構,這並不表示 NDIS 會將NET_BUFFER_LIST結構指出為具有相同狀態的通訊協定驅動程式。 例如,NDIS 可以複製具有NDIS_RECEIVE_FLAGS_RESOURCES旗標集的NET_BUFFER_LIST結構,並指出已清除旗標的通訊協定驅動程式複本。

NDIS 可以依任意順序和任意組合,將 NET_BUFFER_LIST 結構傳回至迷你埠驅動程式。 也就是說,透過呼叫 MiniportReturnNetBufferLists 函式傳回至迷你埠驅動程式的NET_BUFFER_LIST結構連結清單,可以有不同先前呼叫 NdisMIndicateReceiveNetBufferLists的NET_BUFFER_LIST結構。

Miniport 驅動程式應該將 NET_BUFFER_LIST 結構中的 SourceHandle 成員設定為 MiniportAdapterHandle ,NDIS 在 MiniportInitializeEx 函式中提供給 miniport 驅動程式。 篩選驅動程式必須設定篩選驅動程式產生至FilterAttach函式中篩選驅動程式提供給篩選驅動程式之NdisFilterHandle的每個NET_BUFFER_LIST結構SourceHandle成員。 篩選驅動程式不得修改任何不是由篩選驅動程式所產生之NET_BUFFER_LIST結構中的 SourceHandle 成員。

中繼驅動程式也會將 NET_BUFFER_LIST 結構中的SourceHandle成員設定為 NDIS 提供給MiniportInitializeEx函式中中繼驅動程式的MiniportAdapterHandle值。 如果中繼驅動程式轉送接收指示,驅動程式必須先儲存基礎驅動程式所提供的 SourceHandle 值,才能寫入 SourceHandle 成員。 當 NDIS 傳回轉送NET_BUFFER_LIST結構給中繼驅動程式時,中繼驅動程式必須還原儲存的 SourceHandle