阅读:1306回复:0
fracker也帮我看看我这个问题吧,还有其他的高手们
是这样的,我想试一下用IMD发包的程序,我现在的测试是一收到一个ICMP包后马上再回一个ICMP包,首先检测ICMP已经是没问题了,现在的问题是收到ICMP包后再回一个ICMP包时机器马上就蓝屏重启,请各位帮我看一下到底是怎么回事。谢谢
NDIS_STATUS PtReceive( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, // 包头 IN UINT HeaderBufferSize, // 包头大小,以太网环境下为14 IN PVOID LookAheadBuffer, // 前视缓冲 IN UINT LookAheadBufferSize, // 前视缓冲区大小 IN UINT PacketSize // 数据包总大小(不包括包头) ) if(FALSE){} else if(PacketSize <= LookAheadBufferSize) // 如果 LookAheadBuffer 中包含了全部数据 { // 分配内存 Status = NdisAllocateMemory(&pPacketContent, BUFFER_SIZE, 0, HighestAcceptableMax); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"PTReceive:NdisAllocateMemory Failed\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } if(pPacketContent == NULL) { DbgPrint(\"PTReceive:pPacketContent==NULL\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } // 将包头和 LookAheadBuffer 复制到新分配的内存中 NdisZeroMemory(pPacketContent, BUFFER_SIZE); NdisMoveMemory(pPacketContent, HeaderBuffer, HeaderBufferSize); NdisMoveMemory(pPacketContent+ HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize); PacketLen = PacketSize+HeaderBufferSize; if(ICMP == 1) { P_IP_PACKET p_ip; p_ip = (P_IP_PACKET)pPacketContent; // 检测是否为 ICMP 数据包 if(p_ip->H_frame_type == 8 && p_ip->L_frame_type == 0 && p_ip->proto == 1) { Status = NdisAllocateMemory(&Packetback, BUFFER_SIZE, 0, HighestAcceptableMax); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"PTReceive:NdisAllocateMemory Failed\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } if(Packetback == NULL) { DbgPrint(\"PTReceive:Packeback==NULL\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } Status = NdisAllocateMemory(&pPacketContent1, BUFFER_SIZE, 0, HighestAcceptableMax); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"PTReceive:NdisAllocateMemory Failed\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } if(pPacketContent1 == NULL) { DbgPrint(\"PTReceive:pPacketContent1==NULL\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } // 将包头和 LookAheadBuffer 复制到新分配的内存中 NdisZeroMemory(Packetback, BUFFER_SIZE); NdisZeroMemory(pPacketContent1,BUFFER_SIZE); NdisMoveMemory(pPacketContent1, pPacketContent, PacketLen); pPacketContent1[0] = 0x00; pPacketContent1[1] = 0x0b; pPacketContent1[2] = 0xdb; pPacketContent1[3] = 0xda; pPacketContent1[4] = 0xcb; pPacketContent1[5] = 0x9f; pPacketContent1[6] = 0x00; pPacketContent1[7] = 0x40; pPacketContent1[8] = 0x45; pPacketContent1[9] = 0x11; pPacketContent1[10] = 0xc0; pPacketContent1[11] = 0x29; pPacketContent1[26] = 0xc0; pPacketContent1[27] = 0xa8; pPacketContent1[28] = 0x00; pPacketContent1[29] = 0x03; pPacketContent1[30] = 0xc0; pPacketContent1[31] = 0xa8; pPacketContent1[32] = 0x00; pPacketContent1[33] = 0x02; NdisMoveMemory(Packetback, pPacketContent1, PacketLen); NdisFreeMemory(pPacketContent1,2000,0); NdisSend(&Status, pAdapt->BindingHandle, Packetback); if (Status != NDIS_STATUS_PENDING) { // NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); NdisFreePacket(Packetback); } DbgPrint(\"ICMP被拦截!\\n\"); NdisFreeMemory(pPacketContent,2000,0); return NDIS_STATUS_NOT_ACCEPTED; } } |
|