suerdj2k
驱动牛犊
驱动牛犊
  • 注册日期2004-12-28
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3836回复:1

[原创]passthruEx学习笔记之二(设置passthruEx过滤器)

楼主#
更多 发布于:2005-02-14 15:31
设置passthruEx过滤器



/**********用户态(begin)*************/

1. main函数通过:
   ReadIPv4BlockList( argv[ 2 ], //含有物理NIC和IP地址的文件名
                      &pszAdapterName, //取得物理NIC名称
                      &pIPv4BlockAddrArray  //取得要阻塞的IP地址列表
                     )
   从一个文本文件中取得物理NIC名称,和要阻塞的IP地址列表。

2. 接着,由SetIPv4BlockList函数设置过滤器;函数声明如下:
   BOOL SetIPv4BlockList(
   LPTSTR pszAdapterName,  //物理NIC名称
   PIPv4BlockAddrArray pIPv4BlockAddrArray // 要阻塞的IP地址列表
   )
  
   在该函数中:

2.1 通过PtOpenAdapter( pszAdapterName ) 取得虚拟NIC(passthruEx IM Driver)的handle;

2.2 调用PtSetIPv4BlockingFilter函数做下一步的工作;该函数声明如下:
    BOOL    PtSetIPv4BlockingFilter(
    HANDLE               hAdapter,  // 虚拟NIC的handle
    PIPv4BlockAddrArray  pIPv4BlockAddrArray  //要阻塞的IP地址列表
    )
    
    该函数通过DeviceIoControl与内核态的驱动进行沟通,由内核态的驱动完成其余的工作。
    bResult = DeviceIoControl(
        hAdapter,    //IM driver handle
        IOCTL_PTUSERIO_SET_IPv4_BLOCK_FILTER,  //major function code
        pIPv4BlockAddrArray,    //input data
        BlockingFilterLength,   //input data length
        NULL,
        0,
        &BlockingFilterLength,   //feedback
        NULL
        );


/***********用户态(end)***********/

用户态每次调用DeviceIoControl 都会导致I/O Manager产生一个IRP,发送给内核态中相应的驱动程序,由驱动程序中特定的模块(routine)处理这些IRP。

比如:PassthruEx中,是由DevIoControl这个模块接受并处理相关的IRP的。

/********** kernel-mode begin ****************/

1. DevIoControl模块接收到一个major function code为IOCTL_PTUSERIO_SET_IPv4_BLOCK_FILTER的IRP;
   该模块本身不对这个IRP做任何处理,转给FltDevIoControl去处理;

2. FltDevIoControl收到这个major function code为IOCTL_PTUSERIO_SET_IPv4_BLOCK_FILTER的IRP;
   它会作如下处理:

2.1 ioBuffer = pIrp->AssociatedIrp.SystemBuffer;  //取得input data:要阻塞的IP地址列表

2.2 pOpenContext = pIrpSp->FileObject->FsContext; //指向这个IRP的FileObject的上下文,为了获得Adapter指针;
  

2.3 pAdapt = pOpenContext->pAdapt;   // 获得虚拟NIC的handle。(详见《PassthruEX学习笔记之一》)

2.4 pFilterContext = (PADAPT_FILTER_RSVD )&pAdapt->FilterReserved;  //获得adapter中FilterReserved,并转化为PADAPT_FILTER_RSVD结构;

2.5 pOldIPv4BlockAddrArray = pFilterContext->pIPv4BlockAddrArray;  //获得旧的IP地址(以前设置的)

2.6 pNewIPv4BlockAddrArray = (PIPv4BlockAddrArray )ioBuffer;  //新的IP列表地址

2.7 nExpectedBufferSize = sizeof( ULONG ) * pNewIPv4BlockAddrArray->NumberElements;  //计算占用的缓冲空间
    nExpectedBufferSize += sizeof( ULONG );

2.8 pNewIPv4BlockAddrArray = NULL;  

2.9 nNdisStatus = NdisAllocateMemoryWithTag(      //allocates resident (nonpaged) system-space memory
                                    &pNewIPv4BlockAddrArray,   //输出:虚拟地址
                                    nExpectedBufferSize,       //输入:长度
                                    TAG  // 输入;这里的TAG 被宏定义为'ImPa',起什么作用还不清楚!
                                    );

2.10 NdisMoveMemory(
                      pNewIPv4BlockAddrArray, //输出:目标地址
                      ioBuffer,               //输入:源地址
                      nExpectedBufferSize     //输入:长度
                    );

2.11 pFilterContext->pIPv4BlockAddrArray = pNewIPv4BlockAddrArray;  //虚拟NIC的adapter就得到了要阻塞的IP地址列表



/************ kernel-mode end ***************/



以上过程简要描述了设置passthruEx过滤器的用户态和内核态的工作。

如果结合实际的例子可能会更容易看懂一些!

过滤器如何起作用?可能下一篇会推出来!

有不对的地方请各位大虾批评指正!





最新喜欢:

wingmanwingma...
============================== 苏州工业园区 NDIS驱动 软件研发
harry_chen
驱动牛犊
驱动牛犊
  • 注册日期2002-07-08
  • 最后登录2007-05-25
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-21 12:42
期待ing ....
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
游客

返回顶部