資源簡介
這個是TDI驅動,本來做這個驅動的目的,
是想在應用層程序實時動態獲得每個進程打開的網絡端口的變化情況。
因為想不到更好的辦法,同時也要兼容WIN7和WINXP,所以才使用TDI來實現。
代碼是自己開發的框架,沒借用tdifw等源碼,
代碼測試可在 64和32位位win7,winxp上運行。
除了實現獲得動態變化的端口之外,
還順便實現了每個進程的流量監控,以及每個進程的每個連接的流量情況,
還有簡單的禁止某個進程訪問網絡,至于每個進程限速的功能,暫時沒實現,
有興趣的朋友可在此基礎上做擴展,
等你做好之后就能把握理解360流量防火墻的限速的核心部分了。
應用層部分只提供了接口代碼,沒有做更詳細的開發,有興趣的朋友可開發。
做這驅動大概只用了10天時間,時間比較倉促,還望大牛們糾錯指出。

代碼片段和文件信息
///?By?Fanxiushu?2013-03-25
#include?
#include?
#include?
#include?“xtdi_api.h“
#include?“../driver/ioctl.h“
#pragma?comment(lib“ws2_32“)
#define?PORT_CHANGE_ARRAR_SIZE???????????500?
struct?_xtdi_h_t
{
HANDLE?hFile;
///
HANDLE?h_thr_portchange;
????PORT_CHANGE_CBK?port_change_cbk;
void*?cbk_param;
struct?xtdi_port_entry?port_array[?PORT_CHANGE_ARRAR_SIZE?];?
/////
};
#define?DRV_NAME???“xlantdi“
static?int?xtdi_start_driver()
{
SC_HANDLE?h_mgr;
SC_HANDLE?h_svc;
char?path[MAX_PATH];?
h_mgr?=?OpenSCManager(?NULL?NULL?SC_MANAGER_ALL_ACCESS?);
if(!h_mgr)return?-1;
h_svc?=?OpenService(?h_mgr?DRV_NAME??SERVICE_ALL_ACCESS?);?
if(?!h_svc?){
char*?p;?path[0]=0;
// printf(“OpenService?error.\n“);
GetModuleFileName(?NULL?path?MAX_PATH?);?
p?=?strrchr(path‘\\‘);?if(p)*p=0;?strcat(path“\\xlantdi.sys“);
h_svc?=?CreateService(h_mgr?DRV_NAME?DRV_NAME?SERVICE_ALL_ACCESSSERVICE_KERNEL_DRIVER
SERVICE_DEMAND_STARTSERVICE_ERROR_IGNORE?path?NULLNULLNULLNULLNULL?);
// CloseServiceHandle(?h_svc?);?h_svc?=?0;
}
h_svc?=?OpenService(?h_mgr?DRV_NAME??SERVICE_ALL_ACCESS?);?
if(?!h_svc){
printf(““);
return?-1;
}
if(?!StartService(?h_svc?0?NULL?)){
DWORD?dwRtn?=?GetLastError();
if(?dwRtn?!=?ERROR_IO_PENDING?&&?dwRtn?!=?ERROR_SERVICE_ALREADY_RUNNING?){
printf(“Start?Driver?Error.\n“);
}else{
///
}
}
CloseServiceHandle(?h_svc?);
CloseServiceHandle(?h_mgr?);
return?0;?
}
void*?xtdi_open()
{
struct?_xtdi_h_t*?tdi?=?(struct?_xtdi_h_t*)malloc(?sizeof(struct?_xtdi_h_t)?);
if(!tdi){
return?NULL;
}
tdi->cbk_param?=?0;?tdi->h_thr_portchange?=?NULL;
tdi->port_change_cbk?=?NULL;?
////
xtdi_start_driver();
///
tdi->hFile?=?CreateFile(“\\\\.\\xLanTdi“GENERIC_READ|GENERIC_WRITEFILE_SHARE_READ|FILE_SHARE_WRITE?NULL?
?????????????OPEN_EXISTING?FILE_FLAG_OVERLAPPED?NULL?);?
if(?tdi->hFile?==(HANDLE)-1){
free(?tdi?);
printf(?“Can?not?Open?Device?File?err=%d.\n“GetLastError()?);
return?NULL;
}
return?tdi;
}
void?xtdi_close(void*?handle?)
{
struct?_xtdi_h_t*?tdi?=?(struct?_xtdi_h_t*)handle;?
///
if(?!tdi)?return?;
xtdi_set_port_change(?handle?NULL?NULL?);
CloseHandle(?tdi->hFile?);
}
static?DWORD?__stdcall?__xtdi_port_change_thread(void*?_p)
{
struct?_xtdi_h_t*?tdi?=?(struct?_xtdi_h_t*)_p;
///
HANDLE?hEvent?=?CreateEvent(?NULL?FALSE?FALSE?NULL?);?
while(?1?){
DWORD?byte=0;?OVERLAPPED?ov;?BOOL?r;
int?count?=?0;?int?i;
memset(&ov0sizeof(ov));?ov.hEvent?=?hEvent;?
r?=?DeviceIoControl(?tdi->hFile?IOCTL_XTDI_CHANGE_PORT?NULL?0?tdi->port_array?
sizeof(struct?xtdi_port_entry)*PORT_CHANGE_ARRAR_SIZE?&byte?&ov?);
if(!r?){
if(?GetLastError()?!=?ERROR_IO_PENDING?){?Sleep(100);?continue;?}
r?=?GetOverlappedResult(?tdi->hFile?&ov?&byte?TRUE?);
if(?!r?)?{Sleep(100);?continue;?}
}
///
count?=?byte/siz
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????26624??2013-03-30?01:33??bin\xlantdi.sys
?????文件?????237622??2013-03-30?02:09??bin\xtdi_app.exe
?????文件???????5241??2013-03-30?01:33??driver\buildchk_win7_x86.log
?????文件???????6903??2013-03-30?00:47??driver\buildfre_win7_amd64.log
?????文件???????1803??2013-03-29?22:59??driver\ioctl.h
?????文件???????1698??2013-03-25?14:52??driver\main.cpp
?????文件????????537??2013-03-24?17:07??driver\makefile
?????文件??????31624??2013-03-30?01:33??driver\objchk_win7_x86\i386\main.obj
?????文件???????1489??2013-03-30?01:35??driver\objchk_win7_x86\i386\main.obj.oacr.root.x86chk.pft.xm
?????文件??????52198??2013-03-30?01:33??driver\objchk_win7_x86\i386\obj_mgr.obj
?????文件????????975??2013-03-30?01:35??driver\objchk_win7_x86\i386\obj_mgr.obj.oacr.root.x86chk.pft.xm
?????文件??????12106??2013-03-30?01:33??driver\objchk_win7_x86\i386\rbtree.obj
?????文件???????2037??2013-03-30?01:35??driver\objchk_win7_x86\i386\rbtree.obj.oacr.root.x86chk.pft.xm
?????文件?????159744??2013-03-30?01:33??driver\objchk_win7_x86\i386\vc90.pdb
?????文件??????49228??2013-03-30?01:33??driver\objchk_win7_x86\i386\xfilter.obj
?????文件???????2847??2013-03-30?01:35??driver\objchk_win7_x86\i386\xfilter.obj.oacr.root.x86chk.pft.xm
?????文件??????37164??2013-03-30?01:33??driver\objchk_win7_x86\i386\xf_connect.obj
?????文件???????1132??2013-03-30?01:35??driver\objchk_win7_x86\i386\xf_connect.obj.oacr.root.x86chk.pft.xm
?????文件??????40871??2013-03-30?01:33??driver\objchk_win7_x86\i386\xf_create.obj
?????文件????????609??2013-03-30?01:35??driver\objchk_win7_x86\i386\xf_create.obj.oacr.root.x86chk.pft.xm
?????文件??????39135??2013-03-30?01:33??driver\objchk_win7_x86\i386\xf_recv.obj
?????文件???????5374??2013-03-30?01:35??driver\objchk_win7_x86\i386\xf_recv.obj.oacr.root.x86chk.pft.xm
?????文件??????27658??2013-03-30?01:33??driver\objchk_win7_x86\i386\xf_send.obj
?????文件???????2436??2013-03-30?01:35??driver\objchk_win7_x86\i386\xf_send.obj.oacr.root.x86chk.pft.xm
?????文件??????36898??2013-03-30?01:33??driver\objchk_win7_x86\i386\xioctl.obj
?????文件???????4153??2013-03-30?01:35??driver\objchk_win7_x86\i386\xioctl.obj.oacr.root.x86chk.pft.xm
?????文件????????511??2013-03-30?01:33??driver\objchk_win7_x86\i386\_ob
?????文件??????82679??2013-03-30?00:47??driver\objfre_win7_amd64\amd64\main.obj
?????文件???????1489??2013-03-30?00:49??driver\objfre_win7_amd64\amd64\main.obj.oacr.root.amd64fre.pft.xm
?????文件?????102949??2013-03-30?00:47??driver\objfre_win7_amd64\amd64\obj_mgr.obj
............此處省略48個文件信息
- 上一篇:Qt常用圖標資源png
- 下一篇:基于51單片機的溫度控制系統.rar
評論
共有 條評論