阅读:3922回复:8
寒江独钓Passthru例子在Win7下蓝屏
如题,我是用Win7编译的Passthru,寒江独钓书中用到了AnalysisPacket函数来过滤包,但是出现蓝屏,有谁遇到过?
|
|
沙发#
发布于:2011-06-18 08:02
你分析一下dump文件,看是啥原因?是不是内存不对?或者irql不对?
通常可能是内存飞了. |
|
|
板凳#
发布于:2011-06-18 12:08
恩,蓝屏的时候提示BAD_POOR_HEADER,楼上的高手提示下怎么分析dump文件啊,我是新手啊,谢谢了
|
|
地板#
发布于:2011-06-20 22:36
BAD_POOR_HEADER
这个错误一般是由于多操作了内存引起的。比如 你申请了410个字节,而你操作了411个字节。 |
|
|
地下室#
发布于:2011-06-20 22:37
BAD_POOR_HEADER
这个错误一般是由于多操作了内存引起的。比如 你申请了410个字节,而你操作了411个字节。 |
|
|
5楼#
发布于:2011-06-24 13:02
回 楼主(chsllm) 的帖子
反正也不是什么保密的代码。把你的代码发出来看一下。 |
|
|
6楼#
发布于:2011-06-29 11:41
我也编译了passthru,在32位全平台下正常,但是WIN7 64位 也是 BAD_POOR_HEADER 错误。不知道楼主解决了没有。
|
|
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,// 缓冲区地址 ©size, // 缓冲区大小 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; } |
|
8楼#
发布于:2011-07-06 18:56
不好意思,很久没上了,感谢大家的回答。
我找到问题的所在了,楼上的代码和我的差不多,只不过我自己添加了一些过滤的条件。 if(tembuffer != NULL){ NdisMoveMemory( pPacketContent + DataOffset , tembuffer, copysize) ; DataOffset += copysize; } 上面这一段代码没有判断DataOffset是否大于2048,所以在数据长度超出2048的时候就会出现内存溢出的问题。希望对楼上有帮助。 |
|