20楼#
发布于:2007-08-09 11:02
to zhaock (班主) & ProPlayboy
您们能帮我解释一下这个三个语句分别要取什么东西吗? (TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventType, ((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventHandler, ((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventContext TDI_REQUEST_KERNEL_SET_EVENT这个宏代表什么? 书上说Parameters(union)是几个子结构的联合,每个请求类型都有自己专用的参数,而每个子结构就是一种参数。但我不是很理解,子结构、参数在这里代表什么? stat=gettcpportbyfile(irpsp->FileObject);这句话是不是通过irp包中的FileObject得到对方要访问的端口?gettcpportbyfile这个函数是要自己编写还是tdi中本身就提供的?? 谢谢 |
|
21楼#
发布于:2007-08-09 11:12
to zhaock(版主)
您最早的提到的TDI_EVENT_CONNECT回调问题是不是大概是以下这个意思???? switch(((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventType){ case TDI_EVENT_CONNECT: tmpstrptr="TDI_EVENT_CONNECT"; stat=gettcpportbyfile(irpsp->FileObject); #ifdef bydbg DbgPrint("bytdiflt:**********TDI_EVENT_CONNECT port:%d.***********\n",stat); #endif if(stat==0 || stat==-1){break;}//non-tcp or internal error if(denyport[(unsigned short)stat]==1)//我这里是完成请求但不做事情,如果要想关掉连接是不是就通过刚才得到的端口在这个if结构里做文章???您是这个意思吧??? { #ifdef bydbg DbgPrint("bytdiflt:*********port %d blocked!!*********\n",stat); //DbgBreakPoint(); #endif stat=STATUS_SUCCESS; irp->IoStatus.Status=stat; irp->IoStatus.Information=0; IoCompleteRequest(irp, IO_NO_INCREMENT); return stat; } break; 还想问您,如果我要监听外部访问请求。TDI_LISTEN,TDI_EVENT_CONNECT,TDI_ACCESS,TDI_ACCEPT ,TDI_SET_EVENT_HANDLER 中操作哪一个比较好??? 谢谢 |
|
22楼#
发布于:2007-08-09 12:23
1.这个是安装TDI_EVENT_CONNECT函数,tcp协议会在收到第一个syn包的时候,调用这个回调.你在这里替换这个函数,你就可以实现hook tdi_event_connect的目的了
2.监听外部访问请求,处理TDI_EVENT_CONNECT,就够了 |
|
23楼#
发布于:2007-08-09 14:14
EventType,EventHandler,EventContext指的是你回调的函数类型,函数地址,及参数。
TDI_REQUEST_KERNEL_SET_EVENT是给你安装Event回调使用的,具体查DDK。 gettcpportbyfile一看就知道不是TDI提供的了. |
|
|
24楼#
发布于:2007-08-09 14:16
RemoteAddressLength, RemoteAddress, 在EventConnect中,通过这二个参数获取Remote的IP,Port
![]() |
|
|
25楼#
发布于:2007-08-09 14:18
![]() |
|
|
26楼#
发布于:2007-08-09 14:31
cool~~~~
谢谢二位前辈~~~~再去学习一下~~~~ |
|
27楼#
发布于:2007-08-09 14:34
![]() |
|
|
28楼#
发布于:2007-08-09 15:50
二位前辈,我大致的写了一些代码,您们帮我看看我理解的对不对,或者是不是靠近了,至少没走偏~~~
DRIVER_OBJECT RealTDIDriverObject; //TDI入口函数 NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) //以上的两个形参是从什么地方传递进来的?代表什么意思呢-尤其是后面那个?直接这么写就可以了? { NTSTATUS ntStatus=STATUS_SUCCESS; UNICODE_STRING myDriverName; PDRIVER_OBJECT DriverObjectToHookPtr; UINT i; RtlInitUnicodeString(&myDriverName,L"\\Driver\\Tcpip"); Status = ObReferenceObjectByName( &myDriverName, OBJ_CASE_INSENSITIVE, NULL, 0, IoDriverObjectType, KernelMode, NULL, &DriverObjectToHookPtr ); if(Status != STATUS_SUCCESS) return Status; for(i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) { RealTDIDriverObject.MajorFunction = DriverObjectToHookPtr->MajorFunction; DriverObjectToHookPtr->MajorFunction = hook_disp(DriverObjectToHookPtr,...); //以上实参是应该填DriverObjectToHookPtr吧?第二个参数irp怎么得到? } return STATUS_SUCCESS; } //TDI派遣函数 NTSTATUS hook_disp(IN PDEVICE_OBJECT DriverObject, IN PIRP irp) { PIO_STACK_LOCATION irps= IoGetCurrentIrpStackLocation(irp); //case.... case IRP_MJ_INTERNAL_DEVICE_CONTROL: switch(irps->MinorFunction) { //case.... case TDI_SET_EVENT_HANDLER: switch(((TDI_REQUEST_KERNEL_SET_EVENT*)&(irps->Parameters))->EventType) { case TDI_EVENT_CONNECT: //自己的判断逻辑代码 //case.... } break; //case.... } //case.... } |
|
29楼#
发布于:2007-08-09 17:59
引用第24楼ProPlayboy于2007-08-09 14:16发表的 : to ProPlayboy 您能把这里将得再细一些吗?如果您有时间的话,您能写几行代码吗?我理解起来太抽象了,当然我会去查ddk的~~~有劳您啦!! |
|
30楼#
发布于:2007-08-09 23:39
![]() |
|
|
31楼#
发布于:2007-08-09 23:43
连最基本的DriverEntry()都不懂,你怎么写啊?
![]() |
|
|
32楼#
发布于:2007-08-10 10:05
您说我要都会了,我还这么着急干吗???
DriverEntry()是入口函数我知道,就想问您一下后面那个参数的意义? 如果对您小菜一碟的话,希望您能指点我。 我初学tdi,有很多很幼稚的问题,希望您能帮我,谢谢 |
|
33楼#
发布于:2007-08-10 10:15
ok
我知道了,RegistryPath是驱动在注册表里的路径是吧? 入口函数是由系统调用的,不用管它的参数。分派函数也是这样对吧?? to ProPlayboy 麻烦您指导我一下关于RemoteAddressLength, RemoteAddress这方面的东西可以吗? |
|
34楼#
发布于:2007-08-10 14:12
请问版主:
在得知TDI_EVENT_CONNECT请求之后,如何写自己的回调函数?逻辑是要先获得对方的IP,然后与我写的一个值对比,比如192.168.0.1,如果相同返回STATUS_MORE_PROCESSING_REQUIRED ,如果不是这台机器返回STATUS_CONNECTION_REFUSED,之后调用原有的回调函数。 自己的回调函数是应该定义成这种格式么?直接提取RemoteAddress???怎么比对呢???谢谢~ NTSTATUS mytdi_event_connect( IN PVOID TdiEventContext, IN LONG RemoteAddressLength, IN PVOID RemoteAddress, IN LONG UserDataLength, IN PVOID UserData, IN LONG OptionsLength, IN PVOID Options, OUT CONNECTION_CONTEXT OUT PIRP *AcceptIrp) |
|
35楼#
发布于:2007-08-10 14:51
目前我所能完成的代码,麻烦斑竹帮我看一下吧,谢谢
//定义了一个上下文信息结构,为了保存需要的信息 typedef struct{ PFILE_OBJECT fileobj; //address object PVOID old_handler; //old event handler PVOID old_context; //old event handler context }TDI_EVENT_CONTEXT; DRIVER_OBJECT RealTDIDriverObject; //TDI入口函数 NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { NTSTATUS ntStatus=STATUS_SUCCESS; UNICODE_STRING myDriverName; PDRIVER_OBJECT DriverObjectToHookPtr; UINT i; RtlInitUnicodeString(&myDriverName,L"\\Driver\\Tcpip"); Status = ObReferenceObjectByName( &myDriverName, OBJ_CASE_INSENSITIVE, NULL, 0, IoDriverObjectType, KernelMode, NULL, &DriverObjectToHookPtr ); if(Status != STATUS_SUCCESS) { KdPrint(("failed on: ObReferenceObjectByName\n")); return Status; } for(i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) { RealTDIDriverObject.MajorFunction = DriverObjectToHookPtr->MajorFunction; DriverObjectToHookPtr->MajorFunction = TDIDeviceDispatch; } return STATUS_SUCCESS; } //TDI派遣函数 NTSTATUS TDIDeviceDispatch(IN PDEVICE_OBJECT DriverObject, IN PIRP irp) { PIO_STACK_LOCATION irps= IoGetCurrentIrpStackLocation(irp); if(irps->MajorFunction == IRP_MJ_INTERNAL_DEVICE_CONTROL && irps->MinorFunction == TDI_SET_EVENT_HANDLER) { TDI_REQUEST_KERNEL_SET_EVENT r = (TDI_REQUEST_KERNEL_SET_EVENT)&irps->Parameters; if(r->EventType == TDI_EVENT_CONNECT && r->EventHandler != NULL) { TDI_EVENT_CONTEXT cxt; cxt->fileobj = irps->FileObject; //这么写对么??? cxt->old_handler = r->EventHandler; ctx->old_context = r->EventContext; r->EventHandler = my_handler; //my_handler大致应该怎么写??? r->EventContext = ctx->old_context; //自己的调用函数处理完毕后,调用原来的回调函数 status = ((PTDI_IND_CONNECT)(ctx->old_handler)) (ctx->old_context, RemoteAddressLength, RemoteAddress, UserDataLength, UserData, OptionsLength, Options, ConnectionContext, AcceptIrp); //......要控制自己的回调函数返回值还是原回调函数返回值???? } } } |
|
36楼#
发布于:2007-08-10 17:49
代码最新版,请执教,谢谢
#include <ntddk.h> #include <tdikrnl.h> //定义了一个上下文信息结构,为了保存需要的信息 typedef struct{ PFILE_OBJECT fileobj; //address object PVOID old_handler; //old event handler PVOID old_context; //old event handler context }TDI_EVENT_CONTEXT; //自己的回调函数 NTSTATUS mytdi_event_connect( IN PVOID TdiEventContext, IN LONG RemoteAddressLength, IN PVOID RemoteAddress, IN LONG UserDataLength, IN PVOID UserData, IN LONG OptionsLength, IN PVOID Options, OUT CONNECTION_CONTEXT *ConnectionContext, OUT PIRP *AcceptIrp) { KdPrint(("oh? someone is coming~ no way~!!!\n")); return STATUS_CONNECTION_REFUSED; } //TDI派遣函数 NTSTATUS TDIDeviceDispatch(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { NTSTATUS status; PIO_STACK_LOCATION irps= IoGetCurrentIrpStackLocation(irp); if(irps->MajorFunction == IRP_MJ_INTERNAL_DEVICE_CONTROL && irps->MinorFunction == TDI_SET_EVENT_HANDLER) { TDI_REQUEST_KERNEL_SET_EVENT r = (TDI_REQUEST_KERNEL_SET_EVENT)&irps->Parameters; if(r->EventType == TDI_EVENT_CONNECT && r->EventHandler != NULL) { TDI_EVENT_CONTEXT cxt; cxt->fileobj = irps->FileObject; //这么写对么??? cxt->old_handler = r->EventHandler; ctx->old_context = r->EventContext; r->EventHandler = mytdi_event_connect; r->EventContext = ctx; //自己的调用函数处理完毕后,调用原来的回调函数 status = ((PTDI_IND_CONNECT)(ctx->old_handler)) (ctx->old_context, RemoteAddressLength, RemoteAddress, UserDataLength, UserData, OptionsLength, Options, ConnectionContext, AcceptIrp); } } } ////卸载驱动 NTSTATUS ReleaseTDIDevices(void) { NTSTATUS Status; UNICODE_STRING usDriverName; PDRIVER_OBJECT DriverObjectToHookPtr; UINT i; RtlInitUnicodeString(&usDriverName,L"\\Driver\\Tcpip"); Status = ObReferenceObjectByName(&usDriverName,OBJ_CASE_INSENSITIVE,NULL,0,IoDriverObjectType,KernelMode,NULL,&DriverObjectToHookPtr); if(Status != STATUS_SUCCESS) return Status; for(i = 0;i < IRP_MJ_MAXIMUM_FUNCTION;i++) DriverObjectToHookPtr->MajorFunction = RealTDIDriverObject.MajorFunction; return STATUS_SUCCESS; } //TDI入口函数 NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { NTSTATUS ntStatus=STATUS_SUCCESS; DRIVER_OBJECT RealTDIDriverObject; UNICODE_STRING myDriverName; PDRIVER_OBJECT DriverObjectToHookPtr; UINT i; RtlInitUnicodeString(&myDriverName,L"\\Driver\\Tcpip"); Status = ObReferenceObjectByName( &myDriverName, OBJ_CASE_INSENSITIVE, NULL, 0, IoDriverObjectType, KernelMode, NULL, &DriverObjectToHookPtr ); if(Status != STATUS_SUCCESS) { KdPrint(("failed at: ObReferenceObjectByName\n")); return Status; } for(i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) { RealTDIDriverObject.MajorFunction = DriverObjectToHookPtr->MajorFunction; DriverObjectToHookPtr->MajorFunction = TDIDeviceDispatch; } return STATUS_SUCCESS; } |
|
37楼#
发布于:2007-08-10 23:04
我再回答一次,这个贴子。以后靠你自己了。你并没有去搜索以前的贴子,也没有去认真的看资料,这种态度不行的!这也是其它的牛不想回答的原因!我不是好心,纯粹路过,兼测试驱动!所以不必谢我!
|
|
|
38楼#
发布于:2007-08-10 23:09
TRANSPORT_ADDRESS *pTransAddr=(TRANSPORT_ADDRESS*)pRemoteAddress;
TDI_ADDRESS_IP *pIPAddress=(TDI_ADDRESS_IP*)(unsigned char*)&pTransAddr->Address[0].Address; ulRemoteIP=htonl(pIPAddress->in_addr); nRemotePort=ntohs(pIPAddress->sin_port); |
|
|
39楼#
发布于:2007-08-13 11:07
好
谢谢各位,我从新开贴,探讨一些与驱动有关的,比较基本的问题,希望大家多来参与,任何人都可以发问题,大家一起探讨。 希望大家首先心态要好,本着共同学习共同进步的原则。 |
|