微型端口驅動程序處理來自過度驅動程序的發送請求,并發出接收指示。 在單個函數調用中,NDIS 微型端口驅動程序可以指示具有多個接收 NET_BUFFER_LIST 結構的鏈接列表。 微型端口驅動程序可以處理對每個NET_BUFFER_LIST結構上具有多個 NET_BUFFER 結構的多個NET_BUFFER_LIST結構列表的發送請求。
微型端口驅動程序必須管理接收緩沖池。 大多數微型端口驅動程序創建池,這些池使用每個NET_BUFFER_LIST結構預分配單個NET_BUFFER結構。
緩沖池管理
微型端口驅動程序通常從 MiniportInitializeEx 調用 NdisAllocateNetBufferListPool 來創建NET_BUFFER_LIST結構的池。 微型端口驅動程序使用這些結構來指示接收的數據。
通常,分配NET_BUFFER_LIST結構的微型端口驅動程序會在該NET_BUFFER_LIST結構上分配一個 NET_BUFFER 結構并將其排隊。 在分配NET_BUFFER_LIST結構池時預分配NET_BUFFER結構比單獨分配NET_BUFFER_LIST結構和NET_BUFFER結構更有效。
微型端口驅動程序可以調用 NdisAllocateNetBufferListPool 并將 AllocateNetBuffer 參數設置為 TRUE ,以指示 預分配NET_BUFFER 結構。 在這種情況下,NET_BUFFER結構預分配了驅動程序從池中分配的每個NET_BUFFER_LIST結構。 此類驅動程序必須調用 NdisAllocateNetBufferAndNetBufferList 才能從此池分配結構。
通常,微型端口驅動程序從 MiniportInitializeEx 調用 NdisAllocateNetBufferAndNetBufferList,以分配后續接收操作所需的任意數量的緩沖區。 在這種情況下,驅動程序管理可用緩沖區的內部列表。
MiniportReturnNetBufferLists 函數可以準備返回的 NET_BUFFER_LIST 結構,以便在后續接收指示中重復使用。 例如,盡管 MiniportReturnNetBufferLists 可以將NET_BUFFER_LIST結構返回到池 (,但它可以調用 NdisFreeNetBufferList) ,但重復使用結構而不將它們返回到池可能更有效。
當 NDIS 停止適配器時,微型端口驅動程序應釋放所有NET_BUFFER_LIST結構和關聯的數據。 驅動程序可以調用 NdisFreeNetBufferList 來釋放結構,并調用 NdisFreeNetBufferListPool 函數來釋放NET_BUFFER_LIST池。?
數據發送
這部分可以參考NDIS驅動開發-NET_BUFFER體系,下圖演示了微型端口驅動程序發送操作:
NDIS 調用微型端口驅動程序的 MiniportSendNetBufferLists 函數來傳輸由 NET_BUFFER_LIST 結構鏈接列表描述的網絡數據。
微型端口驅動程序調用 NdisMSendNetBufferListsComplete 函數,以將NET_BUFFER_LIST結構的鏈接列表返回到過度的驅動程序,并返回發送請求的最終狀態。
取消發送
下圖演示了微型端口驅動程序取消發送操作:
協議、Filter和中間驅動程序可以調用 NdisCancelSendNetBufferLists 來取消未完成的發送請求。 在發出發送請求之前,這些過度的驅動程序必須使用取消 ID 標記發送數據。
NDIS 調用微型端口驅動程序的 MiniportCancelSend 函數來取消所有標有指定取消標識符的 NET_BUFFER_LIST 結構的傳輸。
微型端口驅動程序的 MiniportCancelSend 函數執行以下操作:
- 遍歷指定適配器的未完成發送請求列表,并調用 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 以獲取每個NET_BUFFER_LIST結構的取消標識符。 微型端口驅動程序將NDIS_GET_NET_BUFFER_LIST_CANCEL_ID返回的取消 ID 與 NDIS 傳遞給 MiniportCancelSend 的取消 ID 進行比較;
- 從其取消標識符與未完成發送請求列表中指定的取消標識符匹配的所有NET_BUFFER_LIST結構中刪除;
- 為所有已取消的NET_BUFFER_LIST結構調用 NdisMSendNetBufferListsComplete 函數以返回結構。微型端口驅動程序將NET_BUFFER_LIST結構的狀態字段設置為NDIS_STATUS_SEND_ABORTED;
數據接收
?這部分可以參考NDIS驅動開發-NET_BUFFER體系?,下圖演示了微型端口驅動程序接收指示
微型端口驅動程序調用 NdisMIndicateReceiveNetBufferLists 函數來指示從網絡接收數據。 NdisMIndicateReceiveNetBufferLists 函數將指示的NET_BUFFER_LIST結構列表傳遞到堆棧上方的驅動程序。
如果微型端口驅動程序在 NdisMIndicateReceiveNetBufferLists 的 ReceiveFlags 參數中設置NDIS_RECEIVE_FLAGS_RESOURCES標志,則表示微型端口驅動程序必須立即重新獲得NET_BUFFER_LIST結構的所有權。 在這種情況下,NDIS 不調用微型端口驅動程序的 MiniportReturnNetBufferLists 函數來返回 NET_BUFFER_LIST 結構。 微型端口驅動程序在 NdisMIndicateReceiveNetBufferLists 返回后立即重新獲得所有權。
如果微型端口驅動程序未在 NdisMIndicateReceiveNetBufferLists 的 ReceiveFlags 參數中設置NDIS_RECEIVE_FLAGS_RESOURCES標志,則 NDIS 會將指示NET_BUFFER_LIST結構返回到微型端口驅動程序的 MiniportReturnNetBufferLists 函數。 在這種情況下,微型端口驅動程序放棄所指示結構的所有權,直到 NDIS 將它們返回到 MiniportReturnNetBufferLists 為止。