chsllm
驱动牛犊
驱动牛犊
  • 注册日期2010-10-09
  • 最后登录2012-03-25
  • 粉丝2
  • 关注6
  • 积分62分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3640回复:8

寒江独钓Passthru例子在Win7下蓝屏

楼主#
更多 发布于:2011-06-17 22:14
如题,我是用Win7编译的Passthru,寒江独钓书中用到了AnalysisPacket函数来过滤包,但是出现蓝屏,有谁遇到过?
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2011-06-18 08:02
你分析一下dump文件,看是啥原因?是不是内存不对?或者irql不对?
通常可能是内存飞了.
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
chsllm
驱动牛犊
驱动牛犊
  • 注册日期2010-10-09
  • 最后登录2012-03-25
  • 粉丝2
  • 关注6
  • 积分62分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2011-06-18 12:08
恩,蓝屏的时候提示BAD_POOR_HEADER,楼上的高手提示下怎么分析dump文件啊,我是新手啊,谢谢了
iihacker
论坛版主
论坛版主
  • 注册日期2010-01-07
  • 最后登录2017-08-16
  • 粉丝5
  • 关注8
  • 积分377分
  • 威望1941点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2011-06-20 22:36
BAD_POOR_HEADER

这个错误一般是由于多操作了内存引起的。比如

你申请了410个字节,而你操作了411个字节。
NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
iihacker
论坛版主
论坛版主
  • 注册日期2010-01-07
  • 最后登录2017-08-16
  • 粉丝5
  • 关注8
  • 积分377分
  • 威望1941点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2011-06-20 22:37
BAD_POOR_HEADER

这个错误一般是由于多操作了内存引起的。比如

你申请了410个字节,而你操作了411个字节。
NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
iihacker
论坛版主
论坛版主
  • 注册日期2010-01-07
  • 最后登录2017-08-16
  • 粉丝5
  • 关注8
  • 积分377分
  • 威望1941点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2011-06-24 13:02
回 楼主(chsllm) 的帖子
反正也不是什么保密的代码。把你的代码发出来看一下。
NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
陈英俊
驱动牛犊
驱动牛犊
  • 注册日期2011-06-01
  • 最后登录2011-08-15
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望100点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2011-06-29 11:41
我也编译了passthru,在32位全平台下正常,但是WIN7 64位 也是 BAD_POOR_HEADER 错误。不知道楼主解决了没有。
陈英俊
驱动牛犊
驱动牛犊
  • 注册日期2011-06-01
  • 最后登录2011-08-15
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望100点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2011-06-29 11:42

FILTER_STATUS AnalysisPacket(PNDIS_PACKET Packet,  BOOLEAN bRecOrSend)
{
    FILTER_STATUS status = STATUS_PASS; // 默认全部通过
    PNDIS_BUFFER NdisBuffer ;
    UINT TotalPacketLength = 0;
    UINT copysize = 0;
    UINT DataOffset = 0 ;
    UINT PhysicalBufferCount;
    UINT BufferCount   ;
    PUCHAR pPacketContent = NULL;
    char* tcsPrintBuf = NULL;
    PUCHAR tembuffer = NULL ;
    UINT j;

    __try{

        status = NdisAllocateMemoryWithTag( &pPacketContent, 2048, TAG);
        if( status != NDIS_STATUS_SUCCESS ){
            status = NDIS_STATUS_FAILURE ;
            __leave;
        }

        NdisZeroMemory( pPacketContent, 2048 ) ;

        // 找到第一个Ndis_Buffer。然后通过通过NdisGetNextBuffer来获得后续的NDIS_BUFFER。
        // 如果只是找第一个节点,更快且方便的方法是调用NdisGetFirstBufferFromPacket。
        NdisQueryPacket(Packet,  // NDIS_PACKET        
            &PhysicalBufferCount,// 内存中的物理块数
            &BufferCount,         // 多少个NDIS_BUFFER包
            &NdisBuffer,         // 将返回第一个包
            &TotalPacketLength     // 总共的包数据长度
            );

        while(TRUE){

            // 取得Ndis_Buffer中存储缓冲区的虚拟地址。
            // 这个函数的另一个版本是NdisQueryBuffer。
            // 后者在系统资源低或者甚至耗尽的时候,会产生Bug Check,导致蓝屏。
            NdisQueryBufferSafe(NdisBuffer,
                &tembuffer,// 缓冲区地址
                &copysize, // 缓冲区大小
                NormalPagePriority
                );

            // 如果tembuffer为NULL,说明当前系统资源匮乏。
            if(tembuffer != NULL){
                NdisMoveMemory( pPacketContent + DataOffset , tembuffer, copysize) ;            
                DataOffset += copysize;
            }

            // 获得下一个NDIS_BUFFER。
            // 如果得到的是一个NULL指针,说明已经到了链式缓冲区的末尾,我们的循环应该结束了。
            NdisGetNextBuffer(NdisBuffer , &NdisBuffer ) ;

            if( NdisBuffer == NULL )
                break ;
        }

        // 取得数据包内容后,下面将对其内容进行过滤。
        // 我们在这个函数中的实现,仅仅简单地打印一些可读的Log信息。
        if(pPacketContent[12] == 8 &&  pPacketContent[13] == 0 )  //is ip packet
        {    
            PIP_HEADER pIPHeader = (PIP_HEADER)(pPacketContent + IP_OFFSET);
            switch(pIPHeader->Protocol)
            {
            case PROT_ICMP:
                if(bRecOrSend)
                    DbgPrint("Receive ICMP packet");
                else
                    DbgPrint("Send ICMP packet");

                //
                // 取得ICMP头,做出你的过滤判断。
                //

                break;
            case PROT_UDP:
                if(bRecOrSend)
                    DbgPrint("Receive UDP packet");
                else
                    DbgPrint("Send UDP packet");

                //
                // 取得UDP头,做出你的过滤判断。
                //

                break;
            case PROT_TCP:
                if(bRecOrSend)
                    DbgPrint("Receive TCP packet");
                else
                    DbgPrint("Send TCP packet");

                //
                // 取得TCP头,做出你的过滤判断。
                //

                break;
            }
        }else if(pPacketContent[12] == 8 &&  pPacketContent[13] == 6 ){
            if(bRecOrSend)
                DbgPrint("Receive ARP packet");
            else
                DbgPrint("Send ARP packet");
        }else{
            if(bRecOrSend)
                DbgPrint("Receive unknown packet");
            else
                DbgPrint("Send unknown packet");
        }

        // 简单打印出包数据内容
        status = NdisAllocateMemoryWithTag( &tcsPrintBuf, 2048*3, TAG);  //分配内存块
        if( status != NDIS_STATUS_SUCCESS ){
            status = NDIS_STATUS_FAILURE ;
            __leave;
        }
        for(j=0;j<=DataOffset;j++)
            RtlStringCbPrintfA(tcsPrintBuf+j*3, 2048*3-j*3, "%2x ",pPacketContent[j]);

        DbgPrint(tcsPrintBuf);

    }__finally{
        if(pPacketContent)NdisFreeMemory(pPacketContent, 0, 0);
        if(tcsPrintBuf)NdisFreeMemory(tcsPrintBuf, 0, 0);
    }

    return STATUS_PASS;
}
chsllm
驱动牛犊
驱动牛犊
  • 注册日期2010-10-09
  • 最后登录2012-03-25
  • 粉丝2
  • 关注6
  • 积分62分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2011-07-06 18:56
不好意思,很久没上了,感谢大家的回答。
我找到问题的所在了,楼上的代码和我的差不多,只不过我自己添加了一些过滤的条件。
      if(tembuffer != NULL){
                NdisMoveMemory( pPacketContent + DataOffset , tembuffer, copysize) ;            
                DataOffset += copysize;
            }
上面这一段代码没有判断DataOffset是否大于2048,所以在数据长度超出2048的时候就会出现内存溢出的问题。希望对楼上有帮助。
游客

返回顶部