驅動層 完成獲取程序網路流量模組 總結

2021-06-27 13:47:27 字數 2544 閱讀 7632

xp平台下是使用tdi,win 7平台採用的是wfp的模式

wfp框架下思路

鍊錶中節點結構體如下:

wfp中是需要註冊callout函式的,程序id是在fwpm_layer_ale_flow_established_v4層來獲取,而udp和tcp流資料資訊(比如大小,內容)是在fwpm_layer_datagram_data_v4和fwpm_layer_stream_v4層來獲取的

,問題來了,在流註冊的callout函式中我們可以獲取到資料的大小,但是問題來了,怎麼樣把程序id和對應的程序資料相對應??? //

不斷的查詢資料,研究wdk文件,wdk示例,各種搜尋和qq群請教,(*^__^*) 嘻嘻…… //

目錄如下:c:\winddk\7600.16385.1\src\network\trans\msnmntr

主要是用到了乙個fwpsflowassociatecontext0函式,具體的用法看msdn或者示例**使用,很簡單

一定要很仔細的看哦,這個函式有個很需要注意的地方,不然就藍藍更健康了哦,(關於deletefn函式的註冊和寫法)

這個fwpsflowassociatecontext0

函式的作用就是把程序id從fwpm_layer_ale_flow_established_v4層傳遞到了fwpm_layer_datagram_data_v4和fwpm_layer_stream_v4層,然後我們就可以使用鍊錶結構把程序id和程序的資料關聯起來了.

解析layerdata中的streamdata,streamdata中有個標誌位,

上傳資料判斷:

和系統定義的巨集fwps_stream_flag_send和fwps_stream_flag_send_expedited與(&)操作一下,不就可以得到是否是上傳了嗎?

和上傳資料的方法類似.

最後說一句,在操作鍊錶的時候,記得加鎖.

xp下比win7下要簡單的多,而且tdi的資料也多.實現起來還是容易的多

void analyzenetworkirp(pirp irp)

if (iostacklocation->minorfunction == tdi_receive)        //    tdi_receive

else if (iostacklocation->minorfunction == tdi_send)    //tdi_send

else if (iostacklocation->minorfunction == tdi_receive_datagram)        //tdi_receive_datagram

else if (iostacklocation->minorfunction == tdi_send_datagram)            //tdi_send_datagram

else if (iostacklocation->minorfunction == tdi_connect) //本機向外界發起連線請求

else if (iostacklocation->minorfunction == tdi_accept)//外界向本機發起連線請求

// 更新程序的網路使用情況

updateprocessnetworkusage(process, &networkusageinformation);

return;

}void updateprocessnetworkusage(

__in peprocess process,

__in pnetwork_usage_information networkusageinformation

)void updateprocessnetworkusageunsafe(

__in peprocess process,

__in pnetwork_usage_information networkusageinformation

)(void)rtlinsertelementgenerictable(&networkusagegenerictable.table,

(pvoid)&tablenode, sizeof(network_usage_generic_table_node), null);

return;

}//網路使用情況結構體定義

typedef struct _network_usage_information network_usage_information, *pnetwork_usage_information;

typedef struct _network_usage_generic_table_node network_usage_generic_table_node, *pnetwork_usage_generic_table_node;

typedef struct _network_usage_generic_table network_usage_generic_table, *pnetwork_usage_generic_table;

network_usage_generic_table networkusagegenerictable;

思路如此,tdi的實現大家實現起來不難,我就不多說了,顯得很嘮叨煩人,嘿嘿

PHP 獲取網路介面檔案流

php開發呼叫各種介面在所難免,有時須要傳遞非常多引數。在傳遞引數過程中 有時會被 解析成 導致請求失敗 經過查詢資料和比較,發現php提供了多種方法 curl fopen file get contents等,就操作性 可靠性和高效來說 curl還是不錯的。參考案比例如以下 獲取網路介面裡面的檔案...

網路資料流分析 四層網路結構

本文內容不全,分析其中包含部分結構內容資訊 資料鏈路層結構 ethernet ii 總位元組數為14byte 目的mac 6 byte 源mac 6 byte type 2 byte 對於ipv6 的type ox86dd ip 層 資料段的總大小為40bytes 其中,version 佔1 byt...

hdu 1733 分層網路流

題目大意 有乙個類似於迷宮搜尋的圖,代表的是無人的路,x 代表有人的點,代表此點不可通過,代表門口。每個位置每一秒鐘只能站乙個人,每個位置到上下左右點的時間為1,問你所有人能不能出去,能出去輸出所有人都出去的最小時間,否則輸出 1.a 增加源點src,和匯點dest,然後根據每個時間點建出分層圖,每...