ay19880703
驱动牛犊
驱动牛犊
  • 注册日期2008-05-24
  • 最后登录2010-03-25
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望120点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2015回复:13

在xpassthru中处理NDIS_BUFFER的时候得不到全部数据....

楼主#
更多 发布于:2008-08-11 19:45
先贴出我的处理代码
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,
                                &copysize,
                                NormalPagePriority
                                ); 
    

    NdisMoveMemory(mybuffer, tembuffer, copysize) ;

    i = copysize ;



    while(1)
    {

    NdisGetNextBuffer(NdisBuffer , &NdisNextBuffer ) ;

    if( NdisNextBuffer == NULL )
        break ;

    NdisBuffer = NdisNextBuffer ;

    NdisQueryBufferSafe(
                                NdisBuffer,
                                &tembuffer,
                                &copysize,
                                NormalPagePriority
                                ) ;

    NdisMoveMemory(mybuffer + i , tembuffer, copysize) ;

    i += copysize  ;

    }


我用抓包工具分析了下  发现我的这段代码只能打印出第一个buffer的内容
如果NdisQueryPacket的时候接受到2个Ndis_Buffer的时候我的只能输出第一个buffer的内容

不知道哪里出了问题
ay19880703
驱动牛犊
驱动牛犊
  • 注册日期2008-05-24
  • 最后登录2010-03-25
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望120点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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    
这是下一个数据包的内容.....中间空的那段打不出来......真是奇怪了
kkkhmy
驱动牛犊
驱动牛犊
  • 注册日期2008-04-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望198点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-08-11 20:20
恩…… 事实上你并没有取得第二块的地址
NdisGetNextBuffer(NdisBuffer , &NdisNextBuffer ) ;
在这里 你使用的参数应该是
NdisGetNextBuffer(tembuffer, &NdisNextBuffer ) ;

就是这样……
ay19880703
驱动牛犊
驱动牛犊
  • 注册日期2008-05-24
  • 最后登录2010-03-25
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望120点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于: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.
ay19880703
驱动牛犊
驱动牛犊
  • 注册日期2008-05-24
  • 最后登录2010-03-25
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望120点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-08-11 20:35
按我的理解 NDIS_BUFFER应该是个链表,我觉得第一个参数应该是NdisQueryBufferSafe所得到的那个NdisBuffer,
不知道我理解错没有
kkkhmy
驱动牛犊
驱动牛犊
  • 注册日期2008-04-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望198点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-08-11 20:37
NdisGetNextBuffer(NdisBuffer , &NdisNextBuffer ) ;
我不知道你的NdisBuffer 是从哪里来的,是不是指向的数据首地址?
实际上简单点的做法是 定义一个PNDIS_BUFFER  比如 PNDIS_BUFFER  pNext;
然后将数据首地址直接赋值给它 pNext = Packet->Private.Head;
然后NdisGetNextBuffer(pNext , &NdisNextBuffer ) ;
 这样
kkkhmy
驱动牛犊
驱动牛犊
  • 注册日期2008-04-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望198点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-08-11 20:38
是的,你的理解很正确。
kkkhmy
驱动牛犊
驱动牛犊
  • 注册日期2008-04-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望198点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-08-11 20:46
恩…… 不好意思 看飙了…… ^^
 事实上 应该是NdisQueryPacket获得的地址 而不是NdisQueryBufferSafe……
这样得到的是被分成数块的包的地址,所以你在循环的时候还会用到NdisQueryBufferSafe来获得实际数据的地址
ay19880703
驱动牛犊
驱动牛犊
  • 注册日期2008-05-24
  • 最后登录2010-03-25
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望120点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-08-11 20:48
谢谢了  还有我想问下我这个函数是在PtReceivePacket使用的  得到的地址直接指向以太网头  如果在PtReceive或者其他地方得到Packet 结构的话 我使用这段代码得到的地址也是指向以太网头的么?
kkkhmy
驱动牛犊
驱动牛犊
  • 注册日期2008-04-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望198点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-08-11 21:00
应该是指向的以太头……
ay19880703
驱动牛犊
驱动牛犊
  • 注册日期2008-05-24
  • 最后登录2010-03-25
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望120点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-08-11 21:08
引用第7楼kkkhmy于2008-08-11 20:46发表的  :
恩…… 不好意思 看飙了…… ^^
 事实上 应该是NdisQueryPacket获得的地址 而不是NdisQueryBufferSafe……
这样得到的是被分成数块的包的地址,所以你在循环的时候还会用到NdisQueryBufferSafe来获得实际数据的地址


奇怪 我的确是按照你说的做了啊
思路是一开始调用
NdisQueryPacket获得获得第一个指向NDIS_BUFFER的指针, 然后NdisQueryBufferSafe获得数据地址,接着调用NdisGetNextBuffer获得下一个指向NDIS_BUFFER的指针,然后在NdisQueryBufferSafe获得数据地址
ay19880703
驱动牛犊
驱动牛犊
  • 注册日期2008-05-24
  • 最后登录2010-03-25
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望120点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-08-11 21:09
引用第9楼kkkhmy于2008-08-11 21:00发表的  :
应该是指向的以太头……

呀~~不好意思  看书不仔细......一直以为是以太网头  呵呵~~~
kkkhmy
驱动牛犊
驱动牛犊
  • 注册日期2008-04-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望198点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
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
        );
的话…… 可能会不一样?当然,如果程序不报错的话~

你可以先尝试一下 要是还不行再讨论,这里有很多高手……

 
ay19880703
驱动牛犊
驱动牛犊
  • 注册日期2008-05-24
  • 最后登录2010-03-25
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望120点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2008-08-12 22:09
其实我觉得应该都差不多  我之前也是使用你提供的代码 ,但是也是不行  然后我在想是不是我对packet的操作错误,所以才改用NdisQueryPacket取得pakcet中第一个NDIS_BUFFER地址的.  但是还是不行  ~
游客

返回顶部