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

NDIS抓包不全.... 麻烦看一下以 以前可以抓包的代码现在没法用了~

楼主#
更多 发布于:2009-04-09 16:11
改用vista+wdk开发之后  
之前一直运行正常的代码不知道怎么一下子不能编译了~~
之后就像算了  拿passthru写个抓包程序也快

在passthru中没改什么  就分别在 MPTransferData PtReceive 和PtReceivePackets中加入了PacketAnalysis()函数
这个函数自己写的  就是把包相关信息打印出来~~

问题就出现在这里  

抓包很正常  但是我开IE上网时就没反映了  用windbg看输出就没反映了~~按理说上网肯定有接受数据包的~~奇怪了

以前的开发环境是

以前的开发环境 xp+ddk2003+vm5.x    编写win2003的NDIS驱动~
我现在的开发环境是 vista+wdk +vm6.0  编写win2003的NDIS驱动~~

不知道咋回事不能用

代码如下

.....
.....
....
....

NdisQueryPacket(packet
        , &PhysicalBufferCount
        , &BufferCount
        , &NdisBuffer
        , &TotalPacketLength
        );

    status = NdisAllocateMemoryWithTag(&mybuffer, 2048, 'a' ) ;

    if( status != NDIS_STATUS_SUCCESS )
        return NDIS_STATUS_FAILURE ;

    NdisZeroMemory( mybuffer, 2048 ) ;

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

    NdisMoveMemory(mybuffer, tembuffer, copysize) ;

    DataOffset = copysize ;



    while(1)
    {

    NdisGetNextBuffer(NdisBuffer , &NdisBuffer ) ;

    if( NdisBuffer == NULL )
        break ;

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

    NdisMoveMemory( mybuffer + DataOffset , tembuffer, copysize) ;

    DataOffset += copysize  ;

    }

/*
-----------------------------------------------------------------------------------------
        从PACKET结构中提取数据-->结束
-----------------------------------------------------------------------------------------
*/
    DbgPrint("=====>data: \n %s\n" , mybuffer) ;
    DbgPrint("=====>copysize: \n %d\n" , copysize) ;
    DbgPrint("=====>TotalPacketLength: \n %d\n" , TotalPacketLength) ;


奇怪了  而且我的网卡之前是调用ptreceivepacket  现在改调用ptreceive 了  
CC_dbger
驱动牛犊
驱动牛犊
  • 注册日期2009-01-01
  • 最后登录2015-02-04
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望211点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-05-05 16:33
调用ptreceivepacket还是ptreceive跟你的NIC驱动有关,ptreceive是微软为了兼容而保留的,现在的网卡和网卡驱动默认都是用ptreceivepacket的,但是当你的ptreceivepacket在抓包分析时,由于时间可能长一些,就返回PENDING ,这样驱动就开始用ptreceive了,所以两个函数都要进行处理才行。
游客

返回顶部