共用方式為


接收網路數據

下圖說明基本接收作業,其中包含迷你埠驅動程式、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 值,與每個通訊協定驅動程式註冊的框架類型相符。

如果將參數 ReceiveFlags 中的 NDIS_RECEIVE_FLAGS_RESOURCES 旗標設置為傳遞至通訊協議驅動程式的 ProtocolReceiveNetBufferLists 函式時,那麼在 ProtocolReceiveNetBufferLists 呼叫返回後,NDIS 立即重新獲得 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 之後,呼叫 miniport 驅動程式的 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 提供給 miniport 驅動程式的 MiniportInitializeEx 函式。 篩選驅動程式必須將其來源的每個 NET_BUFFER_LIST 結構中的 SourceHandle 成員設置為 NDIS 在 FilterAttach 函式中提供給篩選驅動程式的 NdisFilterHandle。 篩選驅動程式不得修改任何不是由篩選驅動程式所產生之任何NET_BUFFER_LIST結構中的 SourceHandle 成員。

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