取消傳送作業
下圖說明取消傳送作業。
驅動程式會針對傳遞給較低層級驅動程式的每個NET_BUFFER_LIST結構呼叫NDIS_SET_NET_BUFFER_LIST_CANCEL_ID宏以進行傳輸。 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID函式會以取消識別碼標記指定的封包。
將取消識別碼指派給封包之前,驅動程式應該呼叫 NdisGeneratePartialCancelId ,以取得其指派之每個取消識別碼的高序位元組。 這可確保驅動程式不會重複系統中其他驅動程式指派的取消識別碼。 驅動程式通常會從DriverEntry常式呼叫NdisGeneratePartialCancelId一次;不過,驅動程式可以多次呼叫NdisGeneratePartialCancelId來取得多個部分取消識別碼。
若要取消標示NET_BUFFER_LIST結構中暫止的資料傳輸,驅動程式會將取消識別碼傳遞給 NdisCancelSendNetBufferLists 函 式。 驅動程式可以藉由呼叫 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 宏來取得NET_BUFFER_LIST結構的取消識別碼。
如果驅動程式將所有 NET_BUFFER_LIST 結構標示為相同的取消識別碼,則可以使用單一呼叫 NdisCancelSendNetBufferLists來取消所有擱置的傳輸。 如果驅動程式以唯一識別碼標記NET_BUFFER_LIST結構子群組內的所有NET_BUFFER_LIST結構,則可以取消該子群組內所有擱置中的傳輸,並單一呼叫 NdisCancelSendNetBufferLists。
NDIS 會在系結上呼叫適當較低層級驅動程式的 MiniportCancelSend 函式。 中止擱置的傳輸之後,基礎迷你埠驅動程式會呼叫 NdisMSendNetBufferListsComplete 函式,以傳回NET_BUFFER_LIST結構和完成狀態NDIS_STATUS_SEND_ABORTED。 NDIS 接著會呼叫適當的驅動程式 ProtocolSendNetBufferListsComplete 函式。
在其 ProtocolSendNetBufferListsComplete 函式中,通訊協定驅動程式可以呼叫 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID,並將 CancelId 設定為 Null。 這可防止NET_BUFFER_LIST不小心再次搭配過時的取消識別碼使用。