共用方式為


從通訊協定驅動程式傳送資料

下圖說明通訊協定驅動程式傳送作業,其中包含驅動程式堆疊中的通訊協定驅動程式、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 可以在將清單傳遞至 ProtocolSendNetBufferListsComplete之前,先將多個傳送要求的結構和資料收集到單一連結NET_BUFFER_LIST結構清單。

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

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

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

雖然 NDIS 一律會以通訊協定決定的順序,將通訊協定提供的網路資料提交至基礎迷你埠驅動程式,如傳遞至 NdisSendNetBufferLists,基礎驅動程式可以隨機順序完成傳送要求。 也就是說,每個系結通訊協定驅動程式都可以依賴 NDIS 將通訊協定驅動程式傳遞給 FIFO 中的 NdisSendNetBufferLists 的網路資料提交給基礎驅動程式。 不過,沒有通訊協定驅動程式可以依賴基礎驅動程式,以相同順序呼叫 NdisMSendNetBufferListsComplete