NDIS6缓冲相关实验和经验
NET_BUFFER 用來描述一個數據包
NET_BUFFER_LIST 用來描述共享元數據(OOB帶外數據)的多個數據包
NET_BUFFER_LIST 可以是一個鏈表,即多個NBL連接在一起
NET_BUFFER 由多個MDL連接在一起構成,為什么這樣設計的,通常構造一個數據包的方法是自下而上,就是先構造包體,再構造包頭,包頭,包頭……
由于是這樣一個自下而上的過程,就有了 Retreat Advance 兩個動作,詳解請參考
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/net-buffer-list-structure
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/net-buffer-structure
WFP callout每種回調場景的offset都不一樣,參考資料
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/data-offset-positions
關于收發包NBL和NB的相關資料
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/indicating-received-ethernet-frames
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/sending-ethernet-frames
關于WFP callout包的資料
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/packet-indication-format
簡單總結下來基本就是
1.WFP callout 除了STREAM path和FORWARD path,只會在回調中給一個NBL,而不是NBL?chain。
2.如果NBL中有多個NB,那么這些NB具有完全相同的2、3層地址。
?
不得不說自從微軟收購了github并將其應用在自己的msdn之后,微軟的文檔友好多了。而且微軟還有專門的職位叫"內容開發者",就專職寫文檔的。以前想寫個WFP賊費勁,啥啥沒有全靠猜,現在每個場景每個API文檔非常清晰。
?
另外關于MDL是否可以修改的問題,搜索了一些內容
https://community.osr.com/discussion/284088/netbufferlist-chain-using-same-mdl
https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/a63fef1c-c7e6-451d-adc5-16de1e8c0b62/ndis-51-intermediate-driver-for-packet-encryptiondecryption-not-working-with-httpsys?forum=wdk
OSR中的以為NDIS架構師大神說在內核里都是假設MDL是可寫的,完全無視NBL中只讀標志。
然而第二個msdn論壇的有人反饋http.sys在作出錯誤回應時會使用只讀內存。
我之前給別人做NDIS驅動時就遇到這個問題,當時是在服務器上部署NDISFilter總是過一段時間莫名其妙出現寫Readonly故障,當時是Rebuild解決的,今天終于明白了,原來是這么回事。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的NDIS6缓冲相关实验和经验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做了个EMMC分析治具
- 下一篇: 兼容单片机的CRC32查表计算程序的C语