WFP开发学习笔记
自己在開發學習過程中得到的經驗,供新手參考,老鳥請指點不足之處:
1.如何關聯數據(路徑、進程ID等)到其他層?
答:使用函數FwpsFlowAssociateContext。
2.FlowContext關聯的數據是否可以關聯到FWPS_LAYER_*任意層?
答:經過實踐測試,發現數據可以關聯到TRANSPORT以上層,但不能關聯到IPPACKET層(原因未知,微軟沒有給出明確說明)。
3.TRANSPORT層是否包含了IP頭?
答:發送時MDL中部分包含IP頭,部分不包含IP頭(原因未知,也可能是數據從應用層往下傳時,系統還未加上IP頭信息)。接收時MDL中都包含有IP頭。
4.IPPACKET層是否包含了IP頭?
答:發送時OUTBOUND,MDL中全部包含了IP頭,MDL的偏移量與數據長度都正確。
接收時INBOUND,MDL中全部包含了IP頭,但MDL的偏移量與數據長度不匹配(原因未知)。且接收時微軟默認把IP頭給隱藏了(原因未知),可以通過修改偏移量來獲取有效IP頭。
具體變量為:NetBuffer->DataLength(真實長度),NetBuffer->CurrentMdlOffset(真實偏移地址,如果需要獲取IP頭,需要前移),Mdl->ByteCount(此數據接收時不準,需根據實際數據長度去獲取數據,類似UNICODE_STRING).
5.接收時MDL中的偏移量與數據長度不匹配該如何調整,獲取有效數據?
答:通過函數NdisRetreatNetBufferDataStart前移偏移地址。
通過函數NdisAdvanceNetBufferDataStart還原偏移地址。
通過函數NdisGetDataBuffer或者自己寫獲取數據函數。記得需要判斷偏移地址CurrentMdlOffset所在的MDL,和實際的數據長度。
6.FWPM_LAYER_ALE_AUTH_CONNECT_V4和FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4的區別。
答:FWPM_LAYER_ALE_AUTH_CONNECT_V4不帶數據包,只是一個發起連接的動作,里面不能進行數據攔截操作。
FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4帶有數據包,里面可以進行數據攔截操作。
7.可否修改IP數據包。
答:可以修改IP數據包。修改IP包信息,在IPPACKET層。修改TCP/UDP包信息,在TRANSPORT層。修改數據包體,在ALE層即可。
8.可否獲取整個IP包數據?
答:不能獲取MAC包數據,WFP只支持獲取IP頭以后的數據。后面的WDK版本可能支持獲取MAC包數據。
9.新接觸WFP該參考哪些資料?
答:參考D:\WinDDK\7600.16385.1\src\network\trans目錄下的工程,或者參考看雪上面的例子,還有寒江的第15章(入門用).
10.WFP啟動/結束流程圖:(圖1)
11.FlowContext操作流程和注意事項?
答:要關聯Context,注冊callout時必須帶有Deletion回調函數,否則關聯失效。
1.創建Context。2.添加到Context鏈表。3.關聯Context。
4.在指定層通過參數UINT64 flowContext獲取Context。
5.使用Context。6.Context生命周期結束時,系統會自動調用Deletion回調函數,你需要在此從鏈表刪除并釋放內存。7.驅動卸載時,通過指定FwpsFlowRemoveContext,將沒有銷毀的Context銷毀掉。調用FwpsFlowRemoveContext后,刪除過程還會出現在Deletion回調函數中(注意)。
12.個人對WFP的簡單理解:
注冊一組回調函數,所有進出網絡數據系統都會調用這組回調函數,你在里面進行邏輯判斷,得出結果BLOCK/PERMIT,系統根據你提供的結果進行攔截/放行。
13.WFP常用函數:
FwpsInjectionHandleCreate
FwpsInjectionHandleDestroy
FwpsQueryPacketInjectionState
FwpmEngineOpen
FwpmEngineClose
FwpmTransactionBegin
FwpmTransactionCommit
FwpmTransactionAbort
FwpsCalloutRegister
FwpmCalloutAdd
FwpmSubLayerAdd
FwpmFilterAdd
FwpsCalloutUnregisterById
FwpsFlowAssociateContext
FwpsFlowRemoveContext
MmGetSystemAddressForMdlSafe
(圖1)
?
?
總結
- 上一篇: Windows网络驱动、NDIS驱动(微
- 下一篇: CMake 用法