- 浏览: 959297 次
- 性别:
- 来自: 珠海
文章分类
最新评论
-
Yunjey:
Yunjey 写道这样子的话、grid中的editable如何 ...
Flex创建可编辑以及分页的DataGrid -
Yunjey:
这样子的话、grid中的editable如何设置啊?!
Flex创建可编辑以及分页的DataGrid -
di1984HIT:
写的很好~~
JCalendar组件 -
sanny81:
此文真棒!感谢一路风尘的奉献!
但我有一疑 ...
Filter发送自定义数据详解 -
umgsai:
求完整demo umgsai@126.com
Flex和Jsp创建用户登入系统
Filter驱动可以实现简单的防火墙功能。它可以过滤所有接收到的包,然后进行分析处理,最后根据情况决定是否网上传递给Protocol层,最后给应用程。
我们的原则是不能在接收到的NBL修改数据,因为后面我们还会需要这个完整的包结构,尤其是在调用NdisFReturnNetBufferLists释放NBL的owership的时候。所以第一步要做的就是拷贝数据:拷贝NetBufferList数据
拷贝好了数据之后,我们需要做的是:
- 首先通知底层驱动,可能是Miniport driver,意思是:Filter已经收到数据,现在归还NBL的所有权,甚至说Miniport Driver可以继续往NBL写数据了。
//Call return function to info the underlying driver of releasing ownership of NBL NDIS_SET_RETURN_FLAG(ReturnFlags, NDIS_RETURN_FLAGS_DISPATCH_LEVEL); NdisFReturnNetBufferLists(pFilter->FilterHandle, NetBufferLists, ReturnFlags);
- 其次就是把自己刚才拷贝好的数据,根据需要更改数据,比如更改port number等。
- 发送已经更改好的NBL
NdisFIndicateReceiveNetBufferLists( pFilter->FilterHandle, pCopyNetBufferLists, PortNumber, NumberOfNetBufferLists, ReceiveFlags);
- 最后一步,别忘记了,往上发自己创建的NBL,是不能调用NdisFReturnNetBufferLists的,因为这个是Filter创建的,不是由底层发上来的,如果调用了,就会出错了。所以在FilterReturnNetBufferLists中拦截销毁自己定义的NBL,因为这是protocol已经把NBL中的数据拷贝好了~
if(NetBufferLists->SourceHandle == pFilter->FilterHandle) { //Please just free this NBL ReadNetBuffer(NetBufferLists);//print out something... result = FreeMdlAndNetBufferList(NetBufferLists); if(result == TRUE) { DEBUGP(DL_TEST, ("Free my own NBL ======ReturnNetBufferLists\n")); } } else { NdisFReturnNetBufferLists(pFilter->FilterHandle, NetBufferLists, ReturnFlags); }
- 关于释放NBL,这里贴出来:
BOOLEAN FreeMdlAndNetBufferList ( PNET_BUFFER_LIST NetBufferLists ) { BOOLEAN result = FALSE; PNET_BUFFER_LIST CurrNbl,nextNbl= NULL; PNET_BUFFER Currbuff; PMDL mdl,pMdl; UINT BufferLength; PUCHAR pCopyData = NULL; //Free all the NBLs allocate by myself CurrNbl = NetBufferLists; while(CurrNbl) { Currbuff =NET_BUFFER_LIST_FIRST_NB(CurrNbl); while(Currbuff) { pMdl = NET_BUFFER_FIRST_MDL(Currbuff); FILTER_ASSERT(pMdl != NULL); NdisQueryMdl( pMdl, (PVOID *)&pCopyData, &BufferLength, NormalPagePriority); FILTER_ASSERT(pCopyData != NULL); NdisFreeMdl(pMdl);//Free MDL pCopyData = NULL; Currbuff = NET_BUFFER_NEXT_NB(Currbuff); } nextNbl = NET_BUFFER_LIST_NEXT_NBL(CurrNbl);//get Next MBL NdisFreeNetBufferList(CurrNbl);//Free CurrentNBL CurrNbl = nextNbl; } result = TRUE; return result; }
展示运行结果:
首先是拷贝数据结构:
写道
00000066 10.77174854 ===============>copyNetBufferList
00000067 10.77175713 NDISLWF:
00000068 10.77176189 ==============>allocateNetBuffAndNetBufferList
00000069 10.77177429 NDISLWF:
00000070 10.77178001 <==============allocateNetBuffAndNetBufferList
00000071 10.77178478 NDISLWF:
00000072 10.77179432 newBufferLength is 231, mdlOffset is 18 and Current mdl offset 18
00000073 10.77179909 NDISLWF:
00000074 10.77180481 There are 1 NB in this list---_---
00000075 10.77180958 NDISLWF:
00000076 10.77181625 There are 1 NBLs
00000077 10.77182007 <============copyNetBufferList
00000067 10.77175713 NDISLWF:
00000068 10.77176189 ==============>allocateNetBuffAndNetBufferList
00000069 10.77177429 NDISLWF:
00000070 10.77178001 <==============allocateNetBuffAndNetBufferList
00000071 10.77178478 NDISLWF:
00000072 10.77179432 newBufferLength is 231, mdlOffset is 18 and Current mdl offset 18
00000073 10.77179909 NDISLWF:
00000074 10.77180481 There are 1 NB in this list---_---
00000075 10.77180958 NDISLWF:
00000076 10.77181625 There are 1 NBLs
00000077 10.77182007 <============copyNetBufferList
最后是往上发送的:
写道
00000079 10.77193928 ===>ReturnNetBufferLists, NetBufferLists is 890D5540.
00000080 10.77194309 NDISLWF:
00000081 10.77194786 ==============>ReadNetBuffer
00000082 10.77195263 NDISLWF:
00000083 10.77195644 ---Read From NBL: Ethernet Header info:
00000084 10.77198792 NDISLWF:
00000085 10.77200031 00-19-e0-e0-2d-30 -> 00-1d-0f-af-50-b0 Mac地址
00000086 10.77200699 NDISLWF:
00000087 10.77201366 DestIPAddr: 221.5.88.88 -> 192.168.1.105 ip地址
00000088 10.77201843 NDISLWF:
00000089 10.77202225 <==============ReadNetBuffer
00000090 10.77202702 NDISLWF:
00000091 10.77203274 Free my own NBL ======ReturnNetBufferLists销毁数据
00000080 10.77194309 NDISLWF:
00000081 10.77194786 ==============>ReadNetBuffer
00000082 10.77195263 NDISLWF:
00000083 10.77195644 ---Read From NBL: Ethernet Header info:
00000084 10.77198792 NDISLWF:
00000085 10.77200031 00-19-e0-e0-2d-30 -> 00-1d-0f-af-50-b0 Mac地址
00000086 10.77200699 NDISLWF:
00000087 10.77201366 DestIPAddr: 221.5.88.88 -> 192.168.1.105 ip地址
00000088 10.77201843 NDISLWF:
00000089 10.77202225 <==============ReadNetBuffer
00000090 10.77202702 NDISLWF:
00000091 10.77203274 Free my own NBL ======ReturnNetBufferLists销毁数据
发表评论
-
Ndis过滤驱动:拷贝NetBufferList数据
2010-04-19 22:40 9459今天我们来看看如何拷贝NBL中的数据。有时候需要更改数据包中的 ... -
在Filter驱动内核中获取IP地址
2010-04-18 01:48 3850项目开发中有时候需要在Filter驱动中获取有效地Unic ... -
如何在内核中获得当前系统时间
2010-04-16 15:08 2663在 Windows NT 内核中你是无法使用 tim ... -
Filter发送自定义数据详解
2010-04-16 10:30 5690... -
DebugPrint 格式说明符
2010-04-13 19:46 17321) 直接打印字符串。 DbgPrint(“Hello ... -
WDK+Visual Studio 2008配置编译驱动
2010-04-12 23:36 5523Introduction As it is known, ... -
疑问:关于内存释放
2010-04-12 21:33 1412今天碰到一个比较棘手的内存处理问题。 首先来看一个数据结构: ... -
Windows NT 驱动程序开发人员提示 -- 应注意避免的事项
2010-04-10 11:32 2292原讨论链接: http://community.cs ... -
关于DeviceIoControl实现异步的笔记【2】
2010-04-09 23:17 5047前面我们谈到了关于异步I/O的实现:关于DeviceIoCon ... -
关于DeviceIoControl实现异步的笔记【1】
2010-04-08 22:26 11641一直所做的都是同步实现的。当然很多情况这并不是很好的解决问题。 ... -
驱动和应用层的异步通信
2010-04-08 20:55 5346作 者: sislcb时 间: 2008-01-28,11:1 ... -
Windows系统编程之异步I/O和完成端口
2010-04-08 19:40 2229一、 同步I/O和异步I/O ... -
纵横捭阖C++之从异步谈起
2010-04-08 19:31 3147一般来说,简单的异步(Asynchronous)调用是这样一种 ... -
使用DeviceIoControl通信
2010-04-04 22:53 7854在很多时候,某些用户需要与底层驱动有一个交互式的操作,所 ... -
在驱动中使用链表
2010-04-03 14:06 3247文章作者:grayfox 作 ... -
疑问:数据包Length增大的原因
2010-04-01 14:35 1331现象: 自己定义一个仅含有Ethernet Header的数 ... -
疑问:为何无线网卡无法发送数据?
2010-03-30 22:42 4487所有的测试流程表明,程序已经成功的创建新的数据包,然后调用Nd ... -
InsertHeadList和CONTAINING_RECORD
2010-03-29 16:36 3723LIST_ENTRY定义一个双向链表的数据结构: typed ... -
如何区分不同的Filter Module Instance
2010-03-29 14:50 1510前文 说到如何区分不同Filter Module Inst ... -
大数据是否需要封装在多个MDL中发送
2010-03-27 21:40 2470前段时间,我们已经解决如何发送自定义的网络数据。那么接下来要做 ...
相关推荐
IP分组过滤驱动.rar 驱动程序; 测试程序.rar 测试程序; /** * 规则函数: addRule(char *driver_name,USHORT type,USHORT protocol,char *sourceIp,char *sourceMask,USHORT sourcePort, char *destinationIp,...
* LOCAL_PORT_FILTER类型: 端口过滤。 * BLANK_IP_FILTER类型: IP黑名单过滤。 * NET_FILTER类型:子网过滤。 * protocol参数:协议号 * 协议可以指定协议类型,TCP=6,UDP=17,ICMP=1。如果指定=0,表示对所有协议...
Filter过滤器(分类讨论,分类讲解) 详情请咨询,我遇上对的人
windows系统下usb过滤驱动实现
U盘过滤驱动 The Wizard created the following files: Files that comprise your driver: readme.txt Contains information shown here. sys\Usbfilter.cpp Driver class implementation. sys\Usbfilter.h ...
STRUTS:filter过滤器
启动S7-PLCSIM Advanced V3.0时,提示网络组数据包筛选器驱动程序NPF未运行 处理办法
这是利用sencha cmd 生成的GridFilterDemo工程中的app和build文件夹,其余文件过大并且与主题无关,因此未包含。具体方法,请参看我的博客: 《Extjs4.2 Grid Filter Feature 表格过滤特性》
串口过滤驱动,需用driverworks编译
JAVA JPCAP 实现数据链路层过滤数据包
Filter中的模糊过滤: 要实现模糊过滤,BDE中要用“*”,不允许使用“Like”关键字,且只能向后匹配,如“Fcode=’101*’”;而ADO则是使用“%”或“*”都可以,可以使用“Like”关键字,且和SQL语句用法一致,可以...
诺言过滤器 数组并返回 。安装$ npm install promise-filter用法 const filter = require ( 'promise-filter' )Promise . resolve ( [ 1 , 2 , 3 ] ) . then ( filter ( ( val ) => val >= 2 ) )// => [2, 3]为什么...
简单的过滤器辅助函数。 整数 验证 $min 和 $max 范围内的整数值(如果它们不为 false)。 如果给定的不是整数或超出范围,则返回默认值。 <?php Filter :: int ( $ value , $ min = false , $ max = false ,...
一个简单的USB过滤驱动例子,供大家参考
filter-console:过滤掉不需要的console.log()输出
停用词过滤器 这个项目是停用词过滤器的一种非常简单且幼稚的实现,它从句子中删除了一系列禁止词(停用词)。 快速指南 安装 只需输入 gem install stopwords-filter 或者 # Don't forget the 'require:' gem '...
miniflux过滤器我的RSS供稿发布了越来越多的垃圾邮件,并且缺乏我最喜欢的rss聚合器-Miniflux中的过滤功能非常有限。码头工人docker-compose.yml ---version : ' 3 'services : miniflux-filter : image : ...
Filter 登录 编码 过滤Filter 登录 编码 过滤Filter 登录 编码 过滤Filter 登录 编码 过滤Filter 登录 编码 过滤Filter 登录 编码 过滤Filter 登录 编码 过滤Filter 登录 编码 过滤Filter 登录 编码 过滤
对request请求进行拦截,对请求参数修改。常用于前台提交表单参数关键字的过滤。此工具可以对参数拦截并转义后提交到对应的处理类。 除了添加两个JsFilter.java和GetHttpServletRequestWrapper.java之外,需要在web....
国外 大卫和詹姆斯的源码 04年就有了,不可以用于商业活动,只可以供给学习用