共用方式為


從通訊協定驅動程式傳送數據

下圖說明通訊協定驅動程式傳送作業,其中牽涉到驅動程式堆疊中的通訊協定驅動程式、NDIS 和基礎驅動程式。

圖表,顯示通訊協定驅動程式在驅動程式堆疊中使用通訊協定驅動程式、NDIS 和基礎驅動程式傳送作業。

通訊協定驅動程式會呼叫 NdisSendNetBufferLists 函式,以傳送 NET_BUFFER_LIST 結構清單中定義的網路數據。

通訊協定驅動程式必須將每個NET_BUFFER_LIST結構的 SourceHandle 成員設定為傳遞給 NdisBindingHandle 參數的相同值。 綁定句柄提供了 NDIS 在基礎迷你端口驅動程式呼叫 NdisMSendNetBufferListsComplete後,將 NET_BUFFER_LIST 結構返回給協定驅動程式所需的資訊。

在呼叫 NdisSendNetBufferLists之前,協議驅動程式可以設定與傳送請求所附帶的資訊,這可透過 NET_BUFFER_LIST_INFO 巨集設定。 基礎驅動程式可以使用 NET_BUFFER_LIST_INFO 巨集來擷取此資訊。

一旦通訊協議驅動程式呼叫 NdisSendNetBufferLists,就會放棄NET_BUFFER_LIST結構和所有相關資源的擁有權。 NDIS 會呼叫 ProtocolSendNetBufferListsComplete 函式,將結構和數據傳回通訊協定驅動程式。 NDIS 可以將多個傳送要求的結構和數據收集到單一連結的NET_BUFFER_LIST結構清單,再將清單傳遞至 ProtocolSendNetBufferListsComplete

在 NDIS 呼叫 ProtocolSendNetBufferListsComplete之前,通訊協定驅動程式起始的傳送目前狀態不明。 在呼叫 NdisSendNetBufferLists時,通訊協議驅動程式會暫時釋放其配置給傳送要求的所有資源的擁有權。 在 NDIS 傳回結構至 protocolSendNetBufferListsComplete之前,通訊協定驅動程式不應該嘗試檢查NET_BUFFER_LIST結構或任何相關聯的數據。

ProtocolSendNetBufferListsComplete 會執行完成傳送作業所需的任何後續處理。 例如,通訊協定驅動程式可以通知用戶端,要求通訊協定驅動程式傳送網路數據,傳送作業已完成。

當 NDIS 呼叫 ProtocolSendNetBufferListsComplete時,通訊協定驅動程式會重新取得與 NetBufferLists 參數所指定之NET_BUFFER_LIST結構相關聯之所有資源的擁有權。 ProtocolSendNetBufferListsComplete 可以釋放這些資源(例如,藉由呼叫 NdisFreeNetBufferNdisFreeNetBufferList),或在後續呼叫 NdisSendNetBufferLists中重複使用它們。

雖然 NDIS 始終會以通訊協定決定的順序,將通訊協定提供的網路數據提交到基礎迷你埠驅動程式,正如在 NdisSendNetBufferLists中傳遞的那樣,但基礎驅動程式可以隨機完成傳送要求。 也就是說,每個系結的通訊協定驅動程式都可以依賴 NDIS,將通訊協定驅動程式傳遞給 NdisSendNetBufferLists 的網路數據, FIFO 順序傳送至基礎驅動程式。 不過,沒有任何通訊協定驅動程式會依賴基礎驅動程式按照相同的順序呼叫 NdisMSendNetBufferListsComplete