阅读:3899回复:1
[原创]passthruEx学习笔记之二(设置passthruEx过滤器)
设置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过滤器的用户态和内核态的工作。 如果结合实际的例子可能会更容易看懂一些! 过滤器如何起作用?可能下一篇会推出来! 有不对的地方请各位大虾批评指正! |
|
最新喜欢:wingma...
|
沙发#
发布于:2005-03-21 12:42
期待ing ....
|
|
|