- 浏览: 958167 次
- 性别:
- 来自: 珠海
文章分类
最新评论
-
Yunjey:
Yunjey 写道这样子的话、grid中的editable如何 ...
Flex创建可编辑以及分页的DataGrid -
Yunjey:
这样子的话、grid中的editable如何设置啊?!
Flex创建可编辑以及分页的DataGrid -
di1984HIT:
写的很好~~
JCalendar组件 -
sanny81:
此文真棒!感谢一路风尘的奉献!
但我有一疑 ...
Filter发送自定义数据详解 -
umgsai:
求完整demo umgsai@126.com
Flex和Jsp创建用户登入系统
今天我们来看看如何拷贝NBL中的数据。有时候需要更改数据包中的某些数据,就需要用到此功能(能直接在原来的nBL上更改,然后发送吗?)。
- 新建一个NBL作为你自己要存放拷贝数据的结构:
pCopyNBL = allocateNetBuffAndNetBufferList(pFilter, dataLength);//Defined by self
这个其实是一个自定义的函数,用来分配一个空的NBL.具体代码见后面~ - 这里考虑有很多个NBL,而且每个NB中包含多个MDL.所以拿到原始NBL的第一个NB
pCurrentNB = NET_BUFFER_LIST_FIRST_NB(pCurrentNBL);//The first NB
再得到第一个NB的第一个MDL:pMDL = NET_BUFFER_FIRST_MDL(pCurrentNB);
最后得到MDL中有用数据:包括分析offset,以及dataLength,起始地址等:mdlOffset = NET_BUFFER_DATA_OFFSET(pCurrentNB);//I am not sure ... NdisQueryMdl( pMDL,(PVOID *)&pData,&dataBufferLength,NormalPagePriority); if(pData == NULL) { DEBUGP(DL_TEST,("pData is NULL ---Fail \n")); break; }
- 同理我们得到我们自定义NBL中的MDL(只有一个),同时拿到起始地址:
pCopyMDL = NET_BUFFER_FIRST_MDL(NET_BUFFER_LIST_FIRST_NB(pCopyNBL)); .... NdisQueryMdl(pCopyMDL,(PVOID *)&pNewBuffer, &newBufferLength,NormalPagePriority); if(pNewBuffer == NULL) { DEBUGP(DL_TEST,("pNewBuffer is NULL ---Fail \n")); break; }
- 然后把pData的数据拷贝到pNewBuffer中,这里注意拷贝的长度:
bytesToCopy = dataBufferLength - mdlOffset; if(bytesToCopy > newBufferLength) { bytesToCopy = newBufferLength; } NdisMoveMemory((pNewBuffer + offset),(pData + mdlOffset), bytesToCopy);//copy data newBufferLength -= bytesToCopy; offset += bytesToCopy; mdlOffset = 0;//CurrentMdlOffset is used only for the first Mdl processed. For the remaining Mdls, it is 0.
这里mdlOffset=0,是指以后以后连续的MDL中没有unused 数据。就是整个MDL中的数据都是我们要的。 - 然后循环这个NB中所有的MDL.每个NB拷贝完之后,设置NB的datalength:
NET_BUFFER_DATA_LENGTH(NET_BUFFER_LIST_FIRST_NB(pCopyNBL)) = dataLength; pCopyNBL->SourceHandle = pCurrentNBL->SourceHandle;
- 循环所有的NBL,把每个NBL串起来:
if(pNewNetBufferLists == NULL) { pNewNetBufferLists = pCopyNBLTail = pCopyNBL; } else { NET_BUFFER_LIST_NEXT_NBL(pCopyNBLTail) = pCopyNBL; } pCurrentNBL = NET_BUFFER_LIST_NEXT_NBL(pCurrentNBL);
- 结束拷贝~附上NBL分配函数代码:
PNET_BUFFER_LIST allocateNetBuffAndNetBufferList( IN PMS_FILTER pFilter, IN ULONG BufferSize ) { PMDL pMDL = NULL; PUCHAR pMDLAddress =NULL; PNET_BUFFER_LIST pNetBufferList = NULL; DEBUGP(DL_TEST,("==============>allocateNetBuffAndNetBufferList\n")); pMDLAddress = (PUCHAR)NdisAllocateMemoryWithTagPriority(pFilter->FilterHandle,BufferSize,FILTER_ALLOC_TAG, LowPoolPriority); NdisZeroMemory(pMDLAddress, BufferSize); do { pMDL = NdisAllocateMdl(pFilter->FilterHandle, pMDLAddress, BufferSize); if(pMDL == NULL) { DEBUGP(DL_TEST,("PMDL Fail....\n")); break; } pNetBufferList = NdisAllocateNetBufferAndNetBufferList( pFilter->SendNetBufferListPool, sizeof(FILTER_SEND_NETBUFLIST_RSVD), //Request control offset delta 0, // back fill size pMDL, 0, // Data offset BufferSize); if(pNetBufferList == NULL) { NdisFreeMdl(pMDL); break; } } while(FALSE); DEBUGP(DL_TEST,("<==============allocateNetBuffAndNetBufferList\n")); return pNetBufferList; }
需要注意分配MDL,一定要使用NdisAllocateMemoryWithTagPriority分配一个空间地址~ - 最后是检查是否拷贝正确,参考了这里的代码(打印部分自行添加~):
基于NDIS Filter 抓包:
- 效果图:
浏览百度的:
浏览Javaeye的:
- 还有一些疑问:除了程序编译的时候还有三个Warning.就是好像我只考虑了每个NBL中只有一个NB的情况~可能还需要更多的测试~【今天我把NB也循环了,就是考虑一个NBL多个NB的情况,可是测试中发现一般都自由一个NB】
参考: http://www.osronline.com/showthread.cfm?link=180159
发表评论
-
Filter驱动:过滤(修改)接受数据包
2010-04-20 16:18 9215Filter驱动可以实现简单的防火墙功能。它可以过滤所有接收到 ... -
在Filter驱动内核中获取IP地址
2010-04-18 01:48 3845项目开发中有时候需要在Filter驱动中获取有效地Unic ... -
如何在内核中获得当前系统时间
2010-04-16 15:08 2660在 Windows NT 内核中你是无法使用 tim ... -
Filter发送自定义数据详解
2010-04-16 10:30 5684... -
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 5041前面我们谈到了关于异步I/O的实现:关于DeviceIoCon ... -
关于DeviceIoControl实现异步的笔记【1】
2010-04-08 22:26 11635一直所做的都是同步实现的。当然很多情况这并不是很好的解决问题。 ... -
驱动和应用层的异步通信
2010-04-08 20:55 5338作 者: 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 2463前段时间,我们已经解决如何发送自定义的网络数据。那么接下来要做 ...
相关推荐
无线局域网经过几年发展在技术上已经日渐成熟尤其是IEEE推出802.11-1999和802.11b以来应用也...口编程I/O(Programmed IO)方式工作无线局域网网卡NDIS(网络驱动接口标准)并讨论了小端口驱动实现过程 中若干关键技术细节
NDIS过滤驱动在广域网络会话劫持防范技术中的应用研究
NDIS驱动,捕获过滤数据包,防火墙 好东西,分享
VC开发防火墙软件 源代码_WDM,NDIS过滤驱动.zip
NDIS中间层驱动程序,基于DDK中passthru框架扩展。
详细 通俗的介绍NDIS中间层驱动 过滤驱动开发过程中遇到的问题入解决办法
NDIS过滤驱动 小端口驱动 参考文章,DOC类型
本文详细讲述了NDIS协议驱动程序设计方法与所需的基础知识
对NDIS开发资料整理,分了6个部分,做了一个完整的目录
本课程实验主要包括Windows NDIS 中间层驱动程序的编译调与设计开发方法的验证,同时强调基于NDIS中间层驱动的综合设计与应用。实验内容采用循序渐进的方式,从Windows网络驱动开发环境配置入手,逐步讲解、实践NDIS...
实现了网络数据流的过滤,嗯,内部也实现了主动发送数据包的函数..... 写不下去了 本来这个项目是之前做的一个系统安全项目>的一小模块,优化版就不发了 这是初始版.... 很适合学习用(想想之前自己查资料的时候一个...
NDIS协议驱动程序源代码.zip
winpcap ndis和wfp驱动代码
从网上找的。NDIS协议驱动开发的笔记,代码。
NDIS 驱动开发 网络驱动 开发指南
NDIS协议驱动开发教程,适合初学者熟悉NDIS驱动开发流程.
ndis windows网络驱动程序的范例
这是一个NDIS的驱动小程序,适合初学操作系统的人观鉴
PDF格式电子书 很清晰 里边有很多代码讲解 作者结束语 很高兴你还能认真的看到这里,希望能够对你有点帮助,我之所以花 一天的时间专门来写一个开发文档,就是因为我自己在开发的时候走了太 多的弯路了,中文资料...