- 浏览: 958132 次
- 性别:
- 来自: 珠海
文章分类
最新评论
-
Yunjey:
Yunjey 写道这样子的话、grid中的editable如何 ...
Flex创建可编辑以及分页的DataGrid -
Yunjey:
这样子的话、grid中的editable如何设置啊?!
Flex创建可编辑以及分页的DataGrid -
di1984HIT:
写的很好~~
JCalendar组件 -
sanny81:
此文真棒!感谢一路风尘的奉献!
但我有一疑 ...
Filter发送自定义数据详解 -
umgsai:
求完整demo umgsai@126.com
Flex和Jsp创建用户登入系统
这里介绍如何从创建数据到最后发送数据的一个过程。
首先要做准你要发送的数据,注意你的数据大小至少要不少于64Byte。我们这里设置数据包的大小为80Byte.里面的内容包含一个14Byte的Ethernet Header,其他空位用无用数据填充。下面是具体流程:
一、创建缓冲区----用于保存自定义的数据
Ndis中创建新的一块内存的函数是:NdisAllocateMemoryWithTagPriority(),其他函数自行参考MSDN. 下面是用例:
pWriteBuf = (PUCHAR)NdisAllocateMemoryWithTagPriority(pFilter->FilterHandle,BufferSize,FILTER_ALLOC_TAG, LowPoolPriority);
其中BufferSize等于80(比这个大也可以!根据需要。)
二、封装自定义数据
因为Ethernet Header是一个Struct结构,定义如下:
typedef struct _TESTPROV_ETH_HEADER
{
UCHAR DstAddr[TESTPROV_MAC_ADDR_LEN];
UCHAR SrcAddr[TESTPROV_MAC_ADDR_LEN];
USHORT EthType;
} TESTPROV_ETH_HEADER;
所以我们要把这些成员变量都赋值。首先申明一个TESTPROV_ETH_HEADER的一个指针变量,然后指向PwriteBuf所指的那块内存:
pEthHeader = (PTESTPROV_ETH_HEADER)pWriteBuf;
然后开始给TESTPROV_ETH_HEADER中的每个成员函数赋值,其中EthType= 0x8e88.
三、创建MDL
由于我们最终要把自定义的数据封装成NBL,然后发送出去。如果了解NBL结构,知道NBL由一个或者多个NB构成,每个NB又由一个或者多个MDL构成。所以这里我们先分配一个MDL,用来保存自定义的数据。
pMdl = NdisAllocateMdl(pFilter->FilterHandle,
pEthFrameNew,
BufferSize);
注意这里pEthFrameNew是一个Virtual Address.指向的是MDL缓冲区的基地址。需要事先分配:
pEthFrameNew = (PUCHAR)NdisAllocateMemoryWithTagPriority(pFilter->FilterHandle,BufferSize,FILTER_ALLOC_TAG, LowPoolPriority);
四、拷贝数据到MDL,并且释放pWriteBuf
如果你的MDL创建成功之后,MDL中是没有内容的,需要把之前自定义在pWriteBuf中的数据拷贝到MDL中:
NdisMoveMemory(pEthFrameNew,pEthHeader, BufferSize);
之后释放pWriteBuf(勿忘)
NdisFreeMemory(pWriteBuf,BufferSize,0);
五、创建NBL
在创建NBL之前,有一件很重要的工作,那就是要分配好NetBufferListsPool.因为之后所有从Filter创建的NBL都要建立在这个Pool之上。从方便和多次利用考虑,我们把Pool分配工作在FilterAttach中完成:
NdisZeroMemory(&PoolParameters, sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));
PoolParameters.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
PoolParameters.Header.Revision = NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;
PoolParameters.Header.Size = sizeof(PoolParameters);
PoolParameters.ProtocolId = NDIS_PROTOCOL_ID_DEFAULT ;
PoolParameters.ContextSize = sizeof(FILTER_SEND_NETBUFLIST_RSVD);
PoolParameters.fAllocateNetBuffer = TRUE;
PoolParameters.PoolTag = FILTER_ALLOC_TAG;
pFilter->SendNetBufferListPool = NdisAllocateNetBufferListPool(
NdisFilterHandle,
&PoolParameters);
需要注意的是,Ndis为每个Filter module instance 各自分配一个Pool. 还有sizeof(FILTER_SEND_NETBUFFER_RSVD)的值必须为8的整数倍(0亦可)
这里我们采用函数NdisAllocateNetBufferAndNetBufferList()来创建NBL,因为它不需要事先创建NB就可以直接跳过这一步创建NBL,有兴趣可以参考NdisAllocateNetBufferList().需要的参数为之前创建的Pool,以及预分配的MDL等。
pNetBufferList = NdisAllocateNetBufferAndNetBufferList(
pFilter->SendNetBufferListPool,
sizeof(FILTER_SEND_NETBUFLIST_RSVD),
0, // back fill size
pMdl,
0, // Data offset
BufferSize);
注意:如果没有成功创建NBL,需要释放MDL.免得内存泄露。
六、发送NBL
发送之前需要制定NBL的SourceHandle,为了后面处理需要,以辨别是自己定义的数据。其次制定发送的Dispatch_level.
pNetBufferList->SourceHandle = pFilter->FilterHandle;
//NDIS_MDL_LINKAGE(pMdl) = NULL;
SendFlags = NDIS_SEND_FLAGS_DISPATCH_LEVEL;
NdisFSendNetBufferLists(
pFilter->FilterHandle,
pNetBufferList,
NDIS_DEFAULT_PORT_NUMBER,
SendFlags);
七、处理NdisFSengNetBufferListComplete
这里需要注意:如果不是你自己发送的数据,需要通知Protocol层,该数据已经提交给底层了。如果是自己的创建和发送的,需要额外处理,销毁证据,因为上层Protocol没有让Filter发送该数据,如果也通知发送完毕就会出事,最显而易见的就是Blue Screen. 所以你要做的:
1. 判断是否是自己发送的数据:
if(NetBufferLists->SourceHandle == pFilter->FilterHandle){}
2. 如果是,销毁自定义数据
pMdl = NET_BUFFER_FIRST_MDL(NET_BUFFER_LIST_FIRST_NB(NetBufferLists));
FILTER_ASSERT(pMdl != NULL);
NdisQueryMdl(
pMdl,
(PVOID *)&pCopyData,
&BufferLength,
NormalPagePriority);
FILTER_ASSERT(pCopyData != NULL);
FILTER_DEREF_SEND_NBL(NetBufferLists, DispatchLevel);
NdisFreeMdl(pMdl);
pCopyData = NULL;
3. 如果不是,调用NdisFSendNetBufferListsComplete()通知上层驱动
NdisFSendNetBufferListsComplete(pFilter->FilterHandle, NetBufferLists, SendCompleteFlags);
到这里,该数据包发送完毕!
八、卸载释放Pool
这里是题外话:你在FilterAttach分配的Pool,你需要在FilterDetach时释放:
if(pFilter->SendNetBufferListPool !=NULL)
{
NdisFreeNetBufferListPool(pFilter->SendNetBufferListPool);
pFilter->SendNetBufferListPool = NULL;
}
不要担心,各自的Filter Module Instance都会各自释放自己的Pool.
九、整理暂时结束
一路风尘 整理
- Filter发送自定义数据详解.pdf (150.9 KB)
- 下载次数: 40
评论
但我有一疑问想在此请教:
pFilter->SendNetBufferListPool、FILTER_SEND_NETBUFLIST_RSVD是否为自己定义的结构?能否也给出其定义?万分感谢!
发表评论
-
Filter驱动:过滤(修改)接受数据包
2010-04-20 16:18 9215Filter驱动可以实现简单的防火墙功能。它可以过滤所有接收到 ... -
Ndis过滤驱动:拷贝NetBufferList数据
2010-04-19 22:40 9449今天我们来看看如何拷贝NBL中的数据。有时候需要更改数据包中的 ... -
在Filter驱动内核中获取IP地址
2010-04-18 01:48 3845项目开发中有时候需要在Filter驱动中获取有效地Unic ... -
如何在内核中获得当前系统时间
2010-04-16 15:08 2659在 Windows NT 内核中你是无法使用 tim ... -
DebugPrint 格式说明符
2010-04-13 19:46 17241) 直接打印字符串。 DbgPrint(“Hello ... -
WDK+Visual Studio 2008配置编译驱动
2010-04-12 23:36 5519Introduction As it is known, ... -
疑问:关于内存释放
2010-04-12 21:33 1408今天碰到一个比较棘手的内存处理问题。 首先来看一个数据结构: ... -
Windows NT 驱动程序开发人员提示 -- 应注意避免的事项
2010-04-10 11:32 2284原讨论链接: http://community.cs ... -
关于DeviceIoControl实现异步的笔记【2】
2010-04-09 23:17 5040前面我们谈到了关于异步I/O的实现:关于DeviceIoCon ... -
关于DeviceIoControl实现异步的笔记【1】
2010-04-08 22:26 11634一直所做的都是同步实现的。当然很多情况这并不是很好的解决问题。 ... -
驱动和应用层的异步通信
2010-04-08 20:55 5337作 者: sislcb时 间: 2008-01-28,11:1 ... -
Windows系统编程之异步I/O和完成端口
2010-04-08 19:40 2222一、 同步I/O和异步I/O ... -
纵横捭阖C++之从异步谈起
2010-04-08 19:31 3138一般来说,简单的异步(Asynchronous)调用是这样一种 ... -
使用DeviceIoControl通信
2010-04-04 22:53 7844在很多时候,某些用户需要与底层驱动有一个交互式的操作,所 ... -
在驱动中使用链表
2010-04-03 14:06 3238文章作者:grayfox 作 ... -
疑问:数据包Length增大的原因
2010-04-01 14:35 1326现象: 自己定义一个仅含有Ethernet Header的数 ... -
疑问:为何无线网卡无法发送数据?
2010-03-30 22:42 4481所有的测试流程表明,程序已经成功的创建新的数据包,然后调用Nd ... -
InsertHeadList和CONTAINING_RECORD
2010-03-29 16:36 3718LIST_ENTRY定义一个双向链表的数据结构: typed ... -
如何区分不同的Filter Module Instance
2010-03-29 14:50 1504前文 说到如何区分不同Filter Module Inst ... -
大数据是否需要封装在多个MDL中发送
2010-03-27 21:40 2462前段时间,我们已经解决如何发送自定义的网络数据。那么接下来要做 ...
相关推荐
9.4 自定义的StartIO 9.4.1 多个串行化队列 9.4.2 示例 9.5 中断服务例程 9.5.1 中断操作的必要性 9.5.2 中断优先级 9.5.3 中断服务例程(ISR) 9.6 DPC例程 9.6.1 延迟过程调用例程(DPC...
9.4 自定义的StartIO 9.4.1 多个串行化队列 9.4.2 示例 9.5 中断服务例程 9.5.1 中断操作的必要性 9.5.2 中断优先级 9.5.3 中断服务例程(ISR) 9.6 DPC例程 9.6.1 延迟过程调用例程(DPC...
自定义filter 自定义分页 Cookie是什么鬼 基于Cookie实现用户登录 基于cookie实现定制显示数据条数 带签名的Cookie CBV和FBV用户认证装饰器 本周作业 第22周 上节回顾 Django之url、Views Django之Model操作 ...
07 通过form向server端发送数据 08 form表单之select标签 09 table标签 第38章 01 css的四种引入方式 02 css的四种基本选择器 03 css的组合选择器 04 css的属性选择器 05 css的伪类 06 css的选择器优先级 07 css的...
与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable 与DotNet数据对象结合的自定义数据对象设计 (一) 数据对象与DataRow ASP.NET中大结果集的分页[翻译] .net 2.0 访问Oracle --与Sql Server的...
5.1 Intent对象详解 197 5.1.1 使用Intent启动系统组件 197 5.2 Intent的属性及intent-filter 配置 198 5.2.1 Component属性 198 5.2.2 Action、Category属性与 intent-filter配置 200 5.2.3 指定...
5.1 Intent对象详解 197 5.1.1 使用Intent启动系统组件 197 5.2 Intent的属性及intent-filter 配置 198 5.2.1 Component属性 198 5.2.2 Action、Category属性与 intent-filter配置 200 5.2.3 指定Action、Category...
5.1 Intent对象详解 197 5.1.1 使用Intent启动系统组件 197 5.2 Intent的属性及intent-filter 配置 198 5.2.1 Component属性 198 5.2.2 Action、Category属性与 intent-filter配置 200 5.2.3 指定Action、Category...