- 浏览: 973043 次
- 性别:
- 来自: 珠海
文章分类
最新评论
-
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 9567今天我们来看看如何拷贝NBL中的数据。有时候需要更改数据包中的 ... -
在Filter驱动内核中获取IP地址
2010-04-18 01:48 3900项目开发中有时候需要在Filter驱动中获取有效地Unic ... -
如何在内核中获得当前系统时间
2010-04-16 15:08 2734在 Windows NT 内核中你是无法使用 tim ... -
Filter发送自定义数据详解
2010-04-16 10:30 5767... -
DebugPrint 格式说明符
2010-04-13 19:46 17691) 直接打印字符串。 DbgPrint(“Hello ... -
WDK+Visual Studio 2008配置编译驱动
2010-04-12 23:36 5570Introduction As it is known, ... -
疑问:关于内存释放
2010-04-12 21:33 1460今天碰到一个比较棘手的内存处理问题。 首先来看一个数据结构: ... -
Windows NT 驱动程序开发人员提示 -- 应注意避免的事项
2010-04-10 11:32 2330原讨论链接: http://community.cs ... -
关于DeviceIoControl实现异步的笔记【2】
2010-04-09 23:17 5112前面我们谈到了关于异步I/O的实现:关于DeviceIoCon ... -
关于DeviceIoControl实现异步的笔记【1】
2010-04-08 22:26 11759一直所做的都是同步实现的。当然很多情况这并不是很好的解决问题。 ... -
驱动和应用层的异步通信
2010-04-08 20:55 5409作 者: sislcb时 间: 2008-01-28,11:1 ... -
Windows系统编程之异步I/O和完成端口
2010-04-08 19:40 2334一、 同步I/O和异步I/O ... -
纵横捭阖C++之从异步谈起
2010-04-08 19:31 3232一般来说,简单的异步(Asynchronous)调用是这样一种 ... -
使用DeviceIoControl通信
2010-04-04 22:53 7926在很多时候,某些用户需要与底层驱动有一个交互式的操作,所 ... -
在驱动中使用链表
2010-04-03 14:06 3296文章作者:grayfox 作 ... -
疑问:数据包Length增大的原因
2010-04-01 14:35 1373现象: 自己定义一个仅含有Ethernet Header的数 ... -
疑问:为何无线网卡无法发送数据?
2010-03-30 22:42 4571所有的测试流程表明,程序已经成功的创建新的数据包,然后调用Nd ... -
InsertHeadList和CONTAINING_RECORD
2010-03-29 16:36 3760LIST_ENTRY定义一个双向链表的数据结构: typed ... -
如何区分不同的Filter Module Instance
2010-03-29 14:50 1547前文 说到如何区分不同Filter Module Inst ... -
大数据是否需要封装在多个MDL中发送
2010-03-27 21:40 2525前段时间,我们已经解决如何发送自定义的网络数据。那么接下来要做 ...
相关推荐
IP分组过滤驱动.rar 驱动程序; 测试程序.rar 测试程序; /** * 规则函数: addRule(char *driver_name,USHORT type,USHORT protocol,char *sourceIp,char *sourceMask,USHORT sourcePort, char *destinationIp,...
在Filter驱动开发中,DNIS通常用来实现网络数据包的过滤、监控或协议分析。开发者需要理解NDIS(Network Driver Interface Specification)接口,这是Windows系统中网络驱动程序开发的基础。 3. **NDIS接口**: ...
NDIS提供了一种方法,使得上层的协议驱动(如TCP/IP)可以通过NDIS与底层的网络适配器驱动进行通信,同时也允许中间层的驱动(如IPFilter)插入到这个通信链路中,对数据包进行拦截、修改或转发。 “ipfilter”标签...
### NDIS Filter 驱动开发相关... Filter驱动:过滤(修改)接受数据包 - **过滤方法**:Filter驱动可以通过修改NetBufferList中的数据来实现数据包的过滤或修改。 - **应用场景**:实现防火墙、入侵检测系统等功能。
在过滤驱动开发中,开发者经常需要使用数据包过滤、修改数据包、发送OID请求等技术。例如,在处理Filter发送OID请求时可能会遇到蓝屏的问题,这需要开发者仔细分析并采取适当的措施解决。同时,过滤驱动中也需要掌握...
WinPcap 的 NPF 抓包主要依靠两个组件:数据包过滤器(filter)和 JIT 编译器。 数据包过滤器(filter)是一个有布尔输出的函数。如果函数值是 true,抓包驱动拷贝数据包给应用程序;如果是 false,数据包将被丢弃...
在使用西门子S7-PLCSIM Advanced V3.0进行模拟测试和编程时,可能会遇到一个常见的问题,即启动该软件时收到一个错误提示,指出“网络组数据包筛选器驱动程序NPF未运行”。这个错误是由于系统缺少或无法识别NPF驱动...
- **数据包过滤器**:过滤器根据预定义的规则决定是否接受数据包,以及接受的数据包部分。 5. **Libpcap库**: - `libpcap` 提供了一组用户态API,支持跨平台的数据包捕获,它与`tcpdump`紧密关联,并支持BPF过滤...
4. **数据包过滤**:源码中可能包含了BPF(Berkeley Packet Filter)语法,这是一种强大的过滤机制,允许开发者指定捕获特定类型的数据包。例如,只捕获特定IP地址、端口或协议的数据包。 5. **IP数据包结构**:IP...
2. 数据包过滤:用户可以设置BPF(Berkeley Packet Filter)表达式,只有满足过滤条件的数据包才会被保存和显示。 3. 数据包捕获:WipCap通过WinPcap库调用设备驱动,直接从网络适配器接收原始数据包。 4. 数据解析...
这样设计使得NDIS Filter驱动能观察到所有进出的数据包,并根据需要进行处理,例如记录、修改或阻止数据包。这个特性在网络安全、性能监测和网络管理应用中非常有用。 "NDIS-filter.rar_NDIS Filter_Windows NDIS ...
- **事件驱动编程**:利用回调函数,可以在数据包到达时立即触发处理,避免了轮询检查的开销。 - **统计与调试**:提供丰富的统计信息和调试工具,如统计捕获到的包数量、错误信息等。 4. **应用场景** - **...
压缩包中的"filter"文件可能是用于定义或示例数据包过滤规则的代码或文档,可以结合程序源码一起研究,以便理解和定制你的抓包需求。 总的来说,这个项目为学习网络数据包捕获提供了一个实践平台,通过它你可以深入...
根据不同的状态,Filter Module 可以执行不同的操作,如过滤数据包或传递数据包给下一个驱动程序。 4. **附加和分离 Filter Module**:可以动态地将 Filter Module 添加到适配器栈中或从中移除。这种灵活性允许在...
2. **数据包过滤**:利用BPF(Berkeley Packet Filter)语法,jNetPcap允许开发者定义过滤条件,只捕获满足特定条件的数据包,提高处理效率。 3. **数据包解析**:jNetPcap支持多种网络协议的解析,如TCP、UDP、IP...
- NPF (Netgroup Packet Filter):这是一个内核级的虚拟设备驱动程序,负责过滤数据包并将其传递给用户空间。它处理操作系统特定的部分。 - packet.dll:这是一个与操作系统无关的API接口,允许在不同版本的...
IP过滤是网络安全中的关键组成部分,它允许系统根据预定义的规则来接受、拒绝或修改进出网络的IP数据包。通过在NDIS级别实现,这种过滤能够更早地干预数据包流程,提供了更高的性能和控制。 标签 "ndis" 和 "IP过滤...
3. **数据包过滤**:如果需要过滤数据包,可以使用`pcap_compile()`和`pcap_setfilter()`函数创建并应用过滤规则。 4. **数据包捕获**:核心的捕获循环通常由`pcap_loop()`或`pcap_next()`函数实现。`pcap_loop()`...