阅读:1465回复:9
为什麽我在写了一段IMD后,也编释过去了,安装了以后,我的机器就不能上网了????
为什麽我在写了一段IMD后,也编释过去了,安装了以后,我的机器就不能上网了????
那位大侠可以指教一下呢~~谢谢了~~ |
|
沙发#
发布于:2004-05-18 22:03
而且所看到的封包的内容都是一些广播的消息~~
好迷糊啊~~ |
|
板凳#
发布于:2004-05-18 22:15
我只是在MPSend中修改了一下~~
|
|
地板#
发布于:2004-05-19 09:38
那要看如何修改了。乱改动,肯定不能上网。
|
|
地下室#
发布于:2004-05-20 15:13
贴上我的源代码:
// // According to our LBFO design, all sends will be performed on the secondary miniport // However, the must be completed on the primary\'s miniport handle // ASSERT (pAdapt->pSecondaryAdapt); pAdapt = pAdapt->pSecondaryAdapt; if (IsIMDeviceStateOn (pAdapt) == FALSE) { return NDIS_STATUS_FAILURE; } NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle); if (Status == NDIS_STATUS_SUCCESS) { PNDIS_PACKET_EXTENSION Old, New; Rsvd = (PRSVD)(MyPacket->ProtocolReserved); Rsvd->OriginalPkt = Packet; MyPacket->Private.Flags = Flags; MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK); // // Copy the OOB Offset from the original packet to the new // packet. // NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket), NDIS_OOB_DATA_FROM_PACKET(Packet), sizeof(NDIS_PACKET_OOB_DATA)); // // Copy the per packet info into the new packet // This includes ClassificationHandle, etc. // Make sure other stuff is not copied !!! // NdisIMCopySendPerPacketInfo(MyPacket, Packet); // // Copy the Media specific information // NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet, &MediaSpecificInfo, &MediaSpecificInfoSize); if (MediaSpecificInfo || MediaSpecificInfoSize) { NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket, MediaSpecificInfo, MediaSpecificInfoSize); } if(workmode==1) { NdisSend(&Status, pAdapt->BindingHandle, MyPacket); DbgPrint(\"ÏÖÔڵŤ×÷ģʽÊÇ=====>ÔÊÐí°üͨ¹ý<=====\\n\"); } else { DbgPrint(\"ÏÖÔڵŤ×÷ģʽÊÇ=====>?â°ü½Ø»ñºÍ¹ýÂË<=====\\n\"); //°ÑÊý¾Ý°üÄÚÈÝ´ÓPacket¿½±´µ½pPacketContent NdisQueryPacket( Packet,NULL,NULL,NULL,&PacketSize); Status= NdisAllocateMemory( &pPacketContent, 2000, 0, HighestAcceptableMax); if (Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"=====>?ÖÅäÒ»¸öϵͳ¿Õ¼ä NdisAllocateMemory ʧ°Ü<=====\\n\"); return Status; } //³õʼ»¯Ëù?ÖÅäµÄ»º³åÇø NdisZeroMemory (pPacketContent, 2000); //°²È«µØÖ¸ÏòËù?¢?â°üµÄµØ?½,È¡³ö¸Ã°üÏÖÔÚÔÚ»º³åÇøµÄÊ×µØÖ?ºÍ³¤¶È NdisQueryBufferSafe(Packet->Private.Head, &pBuf, &BufLength, 32 ); //°ÑËùÒª?¢³öÈ¥µÄ?â°üµÄµØÖ?¸¶¸øÎÒÃÇ×Ô¼ºËù¿ª±ÙµÄÐéÄâµØÖ?ÖÐ,²¢¸¶¸ø³¤¶È NdisMoveMemory(pPacketContent, pBuf, BufLength); i = BufLength; //Õâ¸öÖ¸ÕëÓÃÀ´Ö¸ÏòÎÒÃÇËùÒª¸´ÖÆ?â°üµÄÒ»¸öÖ¸Õë,ÓÃÀ´Ö¸Ïò?â°üºóÃæµÄÄÚÈÝ pNext = Packet->Private.Head; for(;;) { if (pNext == Packet->Private.Tail) break; pNext = pNext->Next; //Ö¸ÕëºóÒÆ if (pNext == NULL) break; NdisQueryBufferSafe(pNext, &pBuf, &BufLength, 32); NdisMoveMemory(pPacketContent+i, pBuf, BufLength); i+=BufLength; } //Êý¾Ý¿½±´Íê±Ï /* CopyPacketToBuffer(MyPacket,Buff,&Length); //°Ñ°üCOPYµ½»º³åÇøÖÐ */ if (((char *)pPacketContent)[13] != 0) { DbgPrint(\"===============>Õâ²»ÊÇÒ»¸ö IP °ü.<===============\\n\"); return NDIS_STATUS_FAILURE; } switch (((char *)pPacketContent)[23]) { case 1: DbgPrint(\"===============>ÕâÊÇÒ»¸ö IP/ICMP °ü.<===============\\n\"); DbgPrint(\"Ä¿µÄ MACµØÖ? Ϊ: %x-\",((char *)pPacketContent)[0]); DbgPrint(\"%x-\",((char *)pPacketContent)[1]); DbgPrint(\"%x-\",((char *)pPacketContent)[2]); DbgPrint(\"%x-\",((char *)pPacketContent)[3]); DbgPrint(\"%x-\",((char *)pPacketContent)[4]); DbgPrint(\"%x\\n\",((char *)pPacketContent)[5]); DbgPrint(\"Ô´ MACµØÖ? Ϊ: %x-\",((char *)pPacketContent)[6]); DbgPrint(\"%x-\",((char *)pPacketContent)[7]); DbgPrint(\"%x-\",((char *)pPacketContent)[8]); DbgPrint(\"%x-\",((char *)pPacketContent)[9]); DbgPrint(\"%x-\",((char *)pPacketContent)[10]); DbgPrint(\"%x\\n\",((char *)pPacketContent)[11]); DbgPrint(\"Ô´ IPµØÖ? Ϊ: %u.\",((char *)pPacketContent)[26]); DbgPrint(\"%u.\",((char *)pPacketContent)[27]); DbgPrint(\"%u.\",((char *)pPacketContent)[28]); DbgPrint(\"%u\\n\",((char *)pPacketContent)[29]); DbgPrint(\"Ä¿µÄ IPµØÖ? Ϊ: %u.\",((char *)pPacketContent)[30]); DbgPrint(\"%u.\",((char *)pPacketContent)[31]); DbgPrint(\"%u.\",((char *)pPacketContent)[32]); DbgPrint(\"%u\\n\",((char *)pPacketContent)[33]); //ÊÍ?ÅÖ?Ç°Ëù?ÖÅäµÄ»º´æ¿Õ¼ä NdisFreeMemory(pPacketContent, 2000, 0); break; case 6: DbgPrint(\"===============>ÕâÊÇÒ»¸ö IP/TCP °ü.<===============\\n\"); DbgPrint(\"Ä¿µÄ MACµØÖ? Ϊ: %x-\",((char *)pPacketContent)[0]); DbgPrint(\"%x-\",((char *)pPacketContent)[1]); DbgPrint(\"%x-\",((char *)pPacketContent)[2]); DbgPrint(\"%x-\",((char *)pPacketContent)[3]); DbgPrint(\"%x-\",((char *)pPacketContent)[4]); DbgPrint(\"%x\\n\",((char *)pPacketContent)[5]); DbgPrint(\"Ô´ MACµØÖ? Ϊ: %x-\",((char *)pPacketContent)[6]); DbgPrint(\"%x-\",((char *)pPacketContent)[7]); DbgPrint(\"%x-\",((char *)pPacketContent)[8]); DbgPrint(\"%x-\",((char *)pPacketContent)[9]); DbgPrint(\"%x-\",((char *)pPacketContent)[10]); DbgPrint(\"%x\\n\",((char *)pPacketContent)[11]); DbgPrint(\"Ô´ IPµØÖ? Ϊ: %u.\",((char *)pPacketContent)[26]); DbgPrint(\"%u.\",((char *)pPacketContent)[27]); DbgPrint(\"%u.\",((char *)pPacketContent)[28]); DbgPrint(\"%u\\n\",((char *)pPacketContent)[29]); DbgPrint(\"Ä¿µÄ IPµØÖ? Ϊ: %u.\",((char *)pPacketContent)[30]); DbgPrint(\"%u.\",((char *)pPacketContent)[31]); DbgPrint(\"%u.\",((char *)pPacketContent)[32]); DbgPrint(\"%u\\n\",((char *)pPacketContent)[33]); DbgPrint(\"Ô´ ¶Ë¿Ú Ϊ: %x.\",((char *)pPacketContent)[34]); DbgPrint(\"%x-\",((char *)pPacketContent)[35]); DbgPrint(\"Ä¿µÄ ¶Ë¿Ú Ϊ: %x.\",((char *)pPacketContent)[36]); DbgPrint(\"%x-\",((char *)pPacketContent)[37]); //ÊÍ?ÅÖ?Ç°Ëù?ÖÅäµÄ»º´æ¿Õ¼ä NdisFreeMemory(pPacketContent, 2000, 0); break; case 17: DbgPrint(\"===============>ÕâÊÇÒ»¸ö IP/UDP °ü.<===============\\n\"); DbgPrint(\"Ä¿µÄ MACµØÖ? Ϊ: %x-\",((char *)pPacketContent)[0]); DbgPrint(\"%x-\",((char *)pPacketContent)[1]); DbgPrint(\"%x-\",((char *)pPacketContent)[2]); DbgPrint(\"%x-\",((char *)pPacketContent)[3]); DbgPrint(\"%x-\",((char *)pPacketContent)[4]); DbgPrint(\"%x\\n\",((char *)pPacketContent)[5]); DbgPrint(\"Ô´ MACµØÖ? Ϊ: %x-\",((char *)pPacketContent)[6]); DbgPrint(\"%x-\",((char *)pPacketContent)[7]); DbgPrint(\"%x-\",((char *)pPacketContent)[8]); DbgPrint(\"%x-\",((char *)pPacketContent)[9]); DbgPrint(\"%x-\",((char *)pPacketContent)[10]); DbgPrint(\"%x\\n\",((char *)pPacketContent)[11]); DbgPrint(\"Ô´ IPµØÖ? Ϊ: %u.\",((char *)pPacketContent)[26]); DbgPrint(\"%u.\",((char *)pPacketContent)[27]); DbgPrint(\"%u.\",((char *)pPacketContent)[28]); DbgPrint(\"%u\\n\",((char *)pPacketContent)[29]); DbgPrint(\"Ä¿µÄ IPµØÖ? Ϊ: %u.\",((char *)pPacketContent)[30]); DbgPrint(\"%u.\",((char *)pPacketContent)[31]); DbgPrint(\"%u.\",((char *)pPacketContent)[32]); DbgPrint(\"%u\\n\",((char *)pPacketContent)[33]); DbgPrint(\"Ô´ ¶Ë¿Ú Ϊ: %x.\",((char *)pPacketContent)[34]); DbgPrint(\"%x-\",((char *)pPacketContent)[35]); DbgPrint(\"Ä¿µÄ ¶Ë¿Ú Ϊ: %x.\",((char *)pPacketContent)[36]); DbgPrint(\"%x-\",((char *)pPacketContent)[37]); //ÊÍ?ÅÖ?Ç°Ëù?ÖÅäµÄ»º´æ¿Õ¼ä NdisFreeMemory(pPacketContent, 2000, 0); break; } NdisSend(&Status, pAdapt->BindingHandle, MyPacket); if ( Status != NDIS_STATUS_SUCCESS) return Status; } if (Status != NDIS_STATUS_PENDING) { NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); NdisFreePacket(MyPacket); } } else { // // We are out of packets. Silently drop it. Alternatively we can deal with it: // - By keeping separate send and receive pools // - Dynamically allocate more pools as needed and free them when not needed // } return(Status); } |
|
5楼#
发布于:2004-05-20 17:00
if (((char *)pPacketContent)[13] != 0)
{ DbgPrint(\"===============>?a2?ê?ò??? IP °ü.<===============\\n\"); return NDIS_STATUS_FAILURE; } 这第13个字节如果是6,准确的说是0x0806,就是ARP协议包,你直接就RETURN了,而没有送出去,ARP协议就被你截断了,对方的MAC地址你自然就得不到了,上网。。。。 |
|
6楼#
发布于:2004-05-20 17:22
哦~~
原来是这样~ 我没有把包发出去啊~~ 谢谢~~ 我再试一下~~ |
|
7楼#
发布于:2004-05-20 18:09
我的机器可以上网了~~
但我显示出来的IP和MAC地址不太正确啊~~ |
|
8楼#
发布于:2004-05-21 09:32
你把包的头34字节都打印出来,我看看,有可能是COPY包时就COPY错了,你COPY包的代码有点问题,我贴过COPY包的函数,你看看吧。
|
|
9楼#
发布于:2004-05-21 13:07
后来我把
((char *)pPacketContent[1])±改成±pPacketContent)[1]就好使了~~ 麻烦大家帮助了~~ |
|