傳送網路資料
下圖說明基本的傳送作業,其中包含通訊協定驅動程式、NDIS 和迷你埠驅動程式。
通訊協定驅動程式會呼叫 NdisSendNetBufferLists 函式,以在系結上傳送 NET_BUFFER_LIST 結構。 NDIS 會呼叫迷你埠驅動程式的 MiniportSendNetBufferLists 函式,將NET_BUFFER_LIST結構轉送到基礎迷你埠驅動程式。
所有以NET_BUFFER為基礎的傳送作業都是非同步。 迷你埠驅動程式會在完成時呼叫具有適當狀態碼的 NdisMSendNetBufferListsComplete 函式。 您可以個別完成每個NET_BUFFER_LIST結構的傳送。 每次迷你埠驅動程式呼叫NdisMSendNetBufferListsComplete函式時,NDIS 會呼叫通訊協定驅動程式的ProtocolSendNetBufferListsComplete。
通訊協定驅動程式可以在 NDIS 呼叫通訊協定驅動程式的 ProtocolSendNetBufferListsComplete 函式時,立即回收NET_BUFFER_LIST結構和所有相關聯的結構和資料。
迷你埠驅動程式或 NDIS 可以依任何順序傳回 NET_BUFFER_LIST 結構。 通訊協定驅動程式保證附加至每個NET_BUFFER_LIST結構的 NET_BUFFER 結構清單尚未修改。
任何 NDIS 驅動程式都可以分隔NET_BUFFER_LIST結構中的NET_BUFFER結構。 任何 NDIS 驅動程式也可以分隔NET_BUFFER結構中的 MDL。 不過,驅動程式一律必須以原始形式傳回具有NET_BUFFER結構和 MDL 的NET_BUFFER_LIST結構。 例如,中繼驅動程式可能會將NET_BUFFER_LIST分成兩個新的NET_BUFFER_LIST結構,並將原始資料的一部分傳遞給下一個驅動程式。 不過,當中繼驅動程式完成原始NET_BUFFER_LIST時,必須使用原始NET_BUFFER結構和 MDL 傳回完整NET_BUFFER_LIST。
通訊協定驅動程式會將 NET_BUFFER_LIST 結構中的 SourceHandle 成員設定為 NdisBindingHandle , NDIS 在呼叫 NdisOpenAdapterEx 函式時所提供的 NdisBindingHandle。 NDIS 會使用 SourceHandle 成員,將NET_BUFFER_LIST結構傳回傳送NET_BUFFER_LIST結構的通訊協定驅動程式。
中繼驅動程式也會將 NET_BUFFER_LIST 結構中的SourceHandle成員設定為呼叫NdisOpenAdapterEx中提供的NdisBindingHandle值。 如果中繼驅動程式轉送傳送要求,則驅動程式必須先儲存超載驅動程式所提供的 SourceHandle 值,才能寫入 SourceHandle 成員。 當 NDIS 傳回轉送NET_BUFFER_LIST結構給中繼驅動程式時,中繼驅動程式必須還原儲存的 SourceHandle 。