wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
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中本身就提供的??
谢谢
wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
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 中操作哪一个比较好???
谢谢
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
22楼#
发布于:2007-08-09 12:23
1.这个是安装TDI_EVENT_CONNECT函数,tcp协议会在收到第一个syn包的时候,调用这个回调.你在这里替换这个函数,你就可以实现hook tdi_event_connect的目的了
2.监听外部访问请求,处理TDI_EVENT_CONNECT,就够了
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
23楼#
发布于:2007-08-09 14:14
EventType,EventHandler,EventContext指的是你回调的函数类型,函数地址,及参数。
TDI_REQUEST_KERNEL_SET_EVENT是给你安装Event回调使用的,具体查DDK。
gettcpportbyfile一看就知道不是TDI提供的了.
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
24楼#
发布于:2007-08-09 14:16
RemoteAddressLength, RemoteAddress, 在EventConnect中,通过这二个参数获取Remote的IP,Port
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
25楼#
发布于:2007-08-09 14:18
,我是路过的。。。
人不靓仔心灵美,版头不正红花仔!
wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2007-08-09 14:31
cool~~~~
谢谢二位前辈~~~~再去学习一下~~~~
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
27楼#
发布于:2007-08-09 14:34
。。。那么快就回贴了。。。我在测试中,路过。。。
人不靓仔心灵美,版头不正红花仔!
wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
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....
}
wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
29楼#
发布于:2007-08-09 17:59
引用第24楼ProPlayboy于2007-08-09 14:16发表的  :
RemoteAddressLength, RemoteAddress, 在EventConnect中,通过这二个参数获取Remote的IP,Port


to ProPlayboy
您能把这里将得再细一些吗?如果您有时间的话,您能写几行代码吗?我理解起来太抽象了,当然我会去查ddk的~~~有劳您啦!!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
30楼#
发布于:2007-08-09 23:39
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
31楼#
发布于:2007-08-09 23:43
连最基本的DriverEntry()都不懂,你怎么写啊?  
人不靓仔心灵美,版头不正红花仔!
wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
32楼#
发布于:2007-08-10 10:05
您说我要都会了,我还这么着急干吗???
DriverEntry()是入口函数我知道,就想问您一下后面那个参数的意义?
如果对您小菜一碟的话,希望您能指点我。
我初学tdi,有很多很幼稚的问题,希望您能帮我,谢谢
wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
33楼#
发布于:2007-08-10 10:15
ok
我知道了,RegistryPath是驱动在注册表里的路径是吧?
入口函数是由系统调用的,不用管它的参数。分派函数也是这样对吧??

to ProPlayboy
麻烦您指导我一下关于RemoteAddressLength, RemoteAddress这方面的东西可以吗?
wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
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)
wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
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);

            //......要控制自己的回调函数返回值还是原回调函数返回值????
        }
    }
}
wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
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;
}
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
37楼#
发布于:2007-08-10 23:04
我再回答一次,这个贴子。以后靠你自己了。你并没有去搜索以前的贴子,也没有去认真的看资料,这种态度不行的!这也是其它的牛不想回答的原因!我不是好心,纯粹路过,兼测试驱动!所以不必谢我!
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
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);
人不靓仔心灵美,版头不正红花仔!
wuxo84_temp
驱动牛犊
驱动牛犊
  • 注册日期2007-08-05
  • 最后登录2007-08-15
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
39楼#
发布于:2007-08-13 11:07

谢谢各位,我从新开贴,探讨一些与驱动有关的,比较基本的问题,希望大家多来参与,任何人都可以发问题,大家一起探讨。
希望大家首先心态要好,本着共同学习共同进步的原则。
游客

返回顶部