资源简介
这个是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
评论
共有 条评论