阅读:2015回复:13
在xpassthru中处理NDIS_BUFFER的时候得不到全部数据....
先贴出我的处理代码
NdisQueryPacket(packet , NULL , NULL , &NdisBuffer , &TotalPacketLength ); status = NdisAllocateMemory( &mybuffer, TotalPacketLength, 0,HighestAcceptableMax); if( status != NDIS_STATUS_SUCCESS ) return NDIS_STATUS_FAILURE ; NdisZeroMemory( mybuffer, TotalPacketLength ); NdisQueryBufferSafe( NdisBuffer, &tembuffer, ©size, NormalPagePriority ); NdisMoveMemory(mybuffer, tembuffer, copysize) ; i = copysize ; while(1) { NdisGetNextBuffer(NdisBuffer , &NdisNextBuffer ) ; if( NdisNextBuffer == NULL ) break ; NdisBuffer = NdisNextBuffer ; NdisQueryBufferSafe( NdisBuffer, &tembuffer, ©size, NormalPagePriority ) ; NdisMoveMemory(mybuffer + i , tembuffer, copysize) ; i += copysize ; } 我用抓包工具分析了下 发现我的这段代码只能打印出第一个buffer的内容 如果NdisQueryPacket的时候接受到2个Ndis_Buffer的时候我的只能输出第一个buffer的内容 不知道哪里出了问题 |
|
沙发#
发布于:2008-08-11 19:51
我用抓包工具抓的HTTP包数据:
upfilerename=&dvbbs=badhgjci&star=1&page=1&poststyle=&TotalUseTable=dv_bbs1&replyid=1&ID=1&Announceid=1&passwd=v9qdt2f765U6x7J5&font=&Expression=face1.gif&imagicface=1&signflag=1&emailflag=0&submit=%20%20%20%20%20%20%20%u53D1%20%u8868%20%uFF08%u7F16%u8F91%u6846%u5185%u6309CTRL%2BENTER%u5FEB%u6377%u53D1%u5E16%uFF09%20%20%20%20%20%20%20&Button=%u9884%20%u89C8&ajaxPost=1&username=__ay&topic=111111111111&body=%25u7231%25u60C5%25u662F%25u4E00%25u79CD%25u602A%25u4E8B%253Cbr/%253E%25u6211%25u5F00%25u59CB%25u5168%25u8EAB%25u4E0D%25u53D7%25u63A7%25u5236%253Cbr/%253E%25u7231%25u60C5%25u662F%25u4E00%25u79CD%25u672C%25u4E8B%253Cbr/%253E%25u6211%25u5F00%25u59CB%25u8FDE%25u81EA%25u5DF1%25u90FD%25u4E0D%25u662F%253Cbr/%253E%25u4E3A%25u4F60%25u6211%25u505A%25u4E86%25u592A%25u591A%25u7684%25u50BB%25u4E8B%253Cbr/%253E%25u7B2C%25u4E00%25u4EF6%25u5C31%25u662F%253Cfont%2520style%253D%2522COLOR%253A%2520%2523e10900%2522%253E%25u4E3A%25u4F60%25u5199%25u8BD7%253C/font%253E%253Cbr/%253E%253Cfont%2520style%253D%2522COLOR%253A%2520%2523e10900%2522%253E%25u4E3A%25u4F60%25u5199%25u8BD7%253C/font%253E%25u4E3A%25u4F60%25u9759%25u6B62%253Cbr/%253E%25u4E3A%25u4F60%25u505A%25u4E0D%25u53EF%25u80FD%25u7684%25u4E8B%253Cbr/%253E%25u4E3A%25u4F60%25u6211%25u5B66%25u4F1A%25u5F39%25u7434%25u5199%25u8BCD%253Cbr/%253E%25u4E3A%25u4F60%25u5931%25u53BB%25u7406%25u667A%253Cbr/%253E%253Cfont%2520style%253D%2522COLOR%253A%2520%2523e10900%2522%253E%25u4E3A%25u4F60%25u5199%25u8BD7%253C/fo 这是一个数据包的内容 而我的NDIS驱动捕获的内容却是: upfilerename=&dvbbs=badhgjci&star=1&page=1&poststyle=&TotalUseTable=dv_bbs1&replyid=1&ID=1&Announceid=1&passwd=v9qdt2f765U6x7J5&font=&Expression=face1.gif&imagicface=1&signflag=1&emailflag=0&submit=%20%20%20%20%20%20%20%u53D1%20%u8868%20%uFF08%u7F16%u8F91%u6846%u5185%u6309CTRL%2BENTER%u5FEB%u6377%u53D1%u5E16%uFF09%20%20%20%20%20%20%20&Button=%u9884%20%u89C8&ajaxPost=1&username=__ay&topic=111111111111&body=%25u7231%25u60C5%25u662F%25u4E00%25u79CD%25u602A%25u4E8B%253Cbr/%253E%25u6211%25u5F00%25u59CB%25u5168% 00000062 12.89200974 @ 然后就输出下一个包的内容了: 00000063 12.89225674 nt%253E%25u4E3A%25u4F60%25u9759%25u6B62%253Cbr/%253E%25u4E3A%25u4F60%25u505A%25u4E0D%25u53EF%25u80FD%25u7684%25u4E8B%253Cbr/%253E%25u4E3A%25u4F60%25u5F39%25u594F%25u6240%25u6709%25u60C5%25u6B4C%25u7684%25u53E5%25u5B50%253Cbr/%253E%25u6211%25u5FD8%25u4E86%25u8BF4%253Cbr/%253E%25u6700%25u7F8E%25u7684%25u662F%25u4F60%25u7684%25u540D%25u5B57%253Cbr/%253E%253Cbr/%253E%25u7231%25u60C5%25u662F%25u4E00%25u79CD%25u602A%25u4E8B%253Cbr/%253E%25u4F60%25u7684%25u7B11%25u5BB9%25u662F%25u552F%25u4E00%25u5B97%25u65E8%253C 这是下一个数据包的内容.....中间空的那段打不出来......真是奇怪了 |
|
板凳#
发布于:2008-08-11 20:20
恩…… 事实上你并没有取得第二块的地址
NdisGetNextBuffer(NdisBuffer , &NdisNextBuffer ) ; 在这里 你使用的参数应该是 NdisGetNextBuffer(tembuffer, &NdisNextBuffer ) ; 就是这样…… |
|
地板#
发布于:2008-08-11 20:27
谢谢你的回复,但是.........
我的变量定义是这样的 NDIS_STATUS status ; PNDIS_BUFFER NdisBuffer , NdisNextBuffer ; UINT TotalPacketLength = 0 , copysize = 0 , i = 0 , count = 0; PUCHAR mybuffer = NULL ,tembuffer = NULL , HttpBuffer = NULL; PacketInfo packetinfo ; int DataStatus , FilterStatus ; tembuffer是PUCHAR类型 但是NdisGetNextBuffer(tembuffer, &NdisNextBuffer ) ; 中的第一个参数不是PNDIS_BUFFER吗? DDK中原型如下: VOID NdisGetNextBuffer( IN PNDIS_BUFFER CurrentBuffer, OUT PNDIS_BUFFER *NextBuffer ); Parameters CurrentBuffer Pointer to the current buffer descriptor. NextBuffer Pointer to a caller-supplied variable in which this function returns a pointer to the buffer descriptor, if any, that follows CurrentBuffer in the buffer descriptor chain. |
|
地下室#
发布于:2008-08-11 20:35
按我的理解 NDIS_BUFFER应该是个链表,我觉得第一个参数应该是NdisQueryBufferSafe所得到的那个NdisBuffer,
不知道我理解错没有 |
|
5楼#
发布于:2008-08-11 20:37
NdisGetNextBuffer(NdisBuffer , &NdisNextBuffer ) ;
我不知道你的NdisBuffer 是从哪里来的,是不是指向的数据首地址? 实际上简单点的做法是 定义一个PNDIS_BUFFER 比如 PNDIS_BUFFER pNext; 然后将数据首地址直接赋值给它 pNext = Packet->Private.Head; 然后NdisGetNextBuffer(pNext , &NdisNextBuffer ) ; 这样 |
|
6楼#
发布于:2008-08-11 20:38
是的,你的理解很正确。
|
|
7楼#
发布于:2008-08-11 20:46
恩…… 不好意思 看飙了…… ^^
事实上 应该是NdisQueryPacket获得的地址 而不是NdisQueryBufferSafe…… 这样得到的是被分成数块的包的地址,所以你在循环的时候还会用到NdisQueryBufferSafe来获得实际数据的地址 |
|
8楼#
发布于:2008-08-11 20:48
谢谢了 还有我想问下我这个函数是在PtReceivePacket使用的 得到的地址直接指向以太网头 如果在PtReceive或者其他地方得到Packet 结构的话 我使用这段代码得到的地址也是指向以太网头的么?
|
|
9楼#
发布于:2008-08-11 21:00
应该是指向的以太头……
|
|
10楼#
发布于:2008-08-11 21:08
引用第7楼kkkhmy于2008-08-11 20:46发表的 : 奇怪 我的确是按照你说的做了啊 思路是一开始调用 NdisQueryPacket获得获得第一个指向NDIS_BUFFER的指针, 然后NdisQueryBufferSafe获得数据地址,接着调用NdisGetNextBuffer获得下一个指向NDIS_BUFFER的指针,然后在NdisQueryBufferSafe获得数据地址 |
|
11楼#
发布于:2008-08-11 21:09
引用第9楼kkkhmy于2008-08-11 21:00发表的 : 呀~~不好意思 看书不仔细......一直以为是以太网头 呵呵~~~ |
|
12楼#
发布于:2008-08-12 13:59
昨天回家了^^
其实我学这个也没多久~ 貌似也遇到过和这个一样的问题 当时的具体情况已经不记得了,最后使用的方法是 NdisQueryPacket(packet , NULL , NULL , NULL , &TotalPacketLength ); NdisBuffer = Packet->Private.Head; 以达到和 NdisQueryPacket(packet , NULL , NULL , &NdisBuffer , &TotalPacketLength ); 相同的效果,因为理解上这两个NdisBuffer的值应该是一样的。 不过我还有一个疑惑,如果你使用NdisQueryPacket(packet , NULL , NULL , NdisBuffer , &TotalPacketLength ); 的话…… 可能会不一样?当然,如果程序不报错的话~ 你可以先尝试一下 要是还不行再讨论,这里有很多高手…… |
|
13楼#
发布于:2008-08-12 22:09
其实我觉得应该都差不多 我之前也是使用你提供的代码 ,但是也是不行 然后我在想是不是我对packet的操作错误,所以才改用NdisQueryPacket取得pakcet中第一个NDIS_BUFFER地址的. 但是还是不行 ~
|
|