NDIS小端口驅動開發(三)

微型端口驅動程序處理來自過度驅動程序的發送請求,并發出接收指示。 在單個函數調用中,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 為止。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15696.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA -- > 初識JAVA

初始JAVA 第一個JAVA程序詳解 public class Main {public static void main(String[] args) {System.out.println("Hello world");} }1.public class Main: 類型,作為被public修飾的類,必須與文件名一致 2.public static 是JAVA中main函數準寫法,記住該格式即可 …

python皮卡丘動畫代碼

在Python中,我們可以使用多種方法來創建皮卡丘的動畫,例如使用matplotlib庫。 解決方案1:使用matplotlib庫 以下是一個使用matplotlib庫創建皮卡丘動畫的例子: import matplotlib.pyplot as plt import matplotlib.animation …

Slash后臺管理系統代碼閱讀筆記 如何實現環形統計圖表卡片?

目前&#xff0c;工作臺界面的上半部分已經基本梳理完畢了。 接下來&#xff0c;我們看看這個環形圖卡片是怎么實現的&#xff1f; 具體代碼如下&#xff1a; {/*圖表卡片*/} <Row gutter{[16, 16]} className"mt-4" justify"center">{/*環形圖表…

U盤引導盤制作Rufus v4.5.2180

軟件介紹 Rufus小巧實用開源免費的U盤系統啟動盤制作工具和格式化U盤的小工具&#xff0c;它可以快速將ISO鏡像文件制作成可引導的USB啟動安裝盤&#xff0c;支持Windows或Linux啟動&#xff0c;堪稱寫入鏡像速度最快的U盤系統制作工具。 軟件截圖 更新日志 github.com/pbat…

嵌入式全棧開發學習筆記---C語言筆試復習大全24

目錄 內存管理 內存分配 堆和棧的區別&#xff1f;&#xff08;面試重點&#xff09; 申請內存的函數 malloc realloc free gcc工具鏈 編譯的過程&#xff08;面試重點&#xff09; 第一步&#xff0c;預處理&#xff1a; 第二步&#xff0c;編譯&#xff1a; 第三…

【Spring Boot】使用 Redis + Cafeine 實現二級緩存

使用 Redis Caffeine 實現二級緩存可以有效提升應用的性能和緩存的命中率。Caffeine 是一個高效的 Java 本地緩存庫&#xff0c;而 Redis 是一個分布式緩存解決方案。通過將兩者結合&#xff0c;Caffeine 作為一級緩存用于快速訪問常用數據&#xff0c;Redis 作為二級緩存用于…

解決LabVIEW通過OPC Server讀取PLC地址時的錯誤180121602

在使用LabVIEW通過OPC Server讀取PLC地址時&#xff0c;若遇到錯誤代碼180121602&#xff0c;建議檢查網絡連接、OPC Server和PLC配置、用戶權限及LabVIEW設置。確保網絡暢通&#xff0c;正確配置OPC變量&#xff0c;取消緩沖設置以實時讀取數據&#xff0c;并使用診斷工具驗證…

簡述vue常用指令

Vue.js 提供了許多內置指令&#xff0c;這些指令用于在模板中添加特殊功能。以下是一些 Vue 的常用內置指令的簡要說明&#xff1a; v-text&#xff1a; 更新元素的 textContent。示例&#xff1a;<span v-text"message"></span> v-html&#xff1a; 更…

2 使用香橙派AIpro報錯 No module named ‘acllite utils‘

當使用jupyter運行香橙派的notebooks下面的案例的時候啟動使用jupyter lab 然后自動跳轉到jupyter頁面。如下圖: 這是自動跳轉過來的。然后運行下面的包的導入后報錯: 報錯為No module named ‘acllite utils’,那么我們打開notebooks文件夾下面的start_notebooks.sh文件:…

【C++練級之路】【Lv.21】C++11——列表初始化和聲明

快樂的流暢&#xff1a;個人主頁 個人專欄&#xff1a;《算法神殿》《數據結構世界》《進擊的C》 遠方有一堆篝火&#xff0c;在為久候之人燃燒&#xff01; 文章目錄 引言一、列表初始化1.1 內置類型1.2 結構體或類1.3 容器 二、聲明2.1 auto2.2 decltype2.3 nullptr 三、STL的…

A*算法搜索的路徑是最優的么?

A * 算法&#xff08;A* Search Algorithm&#xff09;是一種啟發式搜索算法&#xff0c;它旨在找到從起點到終點的最短路徑。在滿足以下條件時&#xff0c;A*算法能夠保證找到最優路徑&#xff1a; 啟發式函數的一致性&#xff08;Consistency&#xff09;或可采納性&#xf…

從“反超”到“引領”,中國衛浴品牌憑何遙遙領先?

作者 | 曾響鈴 文 | 響鈴說 前不久&#xff0c;第28屆中國國際廚房、衛浴設施展覽會(以下簡稱“中國國際廚衛展”)在上海如期舉行&#xff0c;就結果來說真的讓人大開眼界。 沖水聲比蚊子聲更小的馬桶、能化身無感交互平臺的魔鏡柜、可以語音交互的淋浴器&#xff0c;這些“…

Keli5燒寫STM32程序時出現ST-LINK USB communication error錯誤(USB 通信錯誤)

1錯誤原圖 2錯誤原因 前提驅動安裝正確 原因1 usb接觸不良&#xff08;極少出現&#xff09; 解決方法 更換USB線 還不行連下載器一起更換 原因2&#xff08;出現概率比較大&#xff09; 下載器的固件出現問題或下載器固件版本與Keli5的版本不匹配 解決方法 在Keli5的…

[音視頻]ffmepg常用命令

ffmpeg 在音視頻的世界里&#xff0c;ffmpeg可是如雷貫耳的存在&#xff0c;學習音視頻開發&#xff0c;ffmpeg是必須掌握的技能 常用命令 保存m3u8文件 ffmpeg -i http://xxxxx/test.m3u8 -c copy result.mp4

今日早報 每日精選15條新聞簡報 每天一分鐘 知曉天下事 5月26日,星期日

每天一分鐘&#xff0c;知曉天下事&#xff01; 2024年5月26日 星期日 農歷四月十九 1、 醫保局&#xff1a;支持將符合條件的村衛生室納入醫保定點&#xff0c;方便農村居民就醫。 2、 網傳養老金儲備嚴重不足&#xff1f;央視辟謠&#xff1a;這筆錢二十多年來從未動用過&a…

搭建企業級AI應用的流程

搭建企業級AI應用的流程是一個復雜且系統化的工程&#xff0c;它需要從多個維度出發&#xff0c;確保最終的應用既符合企業的業務需求&#xff0c;也具備高效、穩定和可擴展的特性。以下是詳細的步驟&#xff1a; 初步接觸與需求分析是整個項目的基礎。在這一階段&#xff0c;我…

【C++題解】1698. 請輸出帶有特殊尾數的數

問題&#xff1a;1698. 請輸出帶有特殊尾數的數 類型&#xff1a; 題目描述&#xff1a; 請輸出1~n 中所有個位為 1、3、5、7中任意一個數的整數&#xff0c;每行 1 個。( n<1000 ) 比如&#xff0c;假設從鍵盤讀入 20&#xff0c;輸出結果如下&#xff1a; 1 3 5 7 11 1…

LLMs之PEFT之Llama-2:《LoRA Learns Less and Forgets LessLoRA學得更少但遺忘得也更少》翻譯與解讀

LLMs之PEFT之Llama-2&#xff1a;《LoRA Learns Less and Forgets LessLoRA學得更少但遺忘得也更少》翻譯與解讀 導讀&#xff1a;該論文比較了LoRA與完全微調在代碼與數學兩個領域的表現。 背景問題&#xff1a;微調大規模語言模型需要非常大的GPU內存。LoRA這一參數高效微調方…

OpenStack平臺Keystone組件的使用

1. 規劃節點 安裝基礎服務的服務器規劃 IP地址 主機名 節點 192.168.100.10 controller Openstack控制節點 2. 基礎準備 使用機電云共享的單節點的openstack系統&#xff0c;自行修改虛擬網絡編輯器、網絡適配器&#xff0c;系統用戶名&#xff1a;root&#xff0c;密…

【Basic】Upload-Labs-Linux

文章目錄 前言Pass-01Pass-02Pass-03Pass-04Pass-05Pass-06Pass-07Pass-08Pass-09Pass-10Pass-11Pass-12Pass-13Pass-14Pass-15Pass-16解題感悟 前言 美好的一天從刷題開始 Pass-01 我淦20道題&#xff1f;&#xff1f;&#xff1f;一道一道來吧 先看第一道題 先在home里搞一…