阅读:1343回复:9
问一下大家我所遇到的问题,我是菜鸟,希望大侠看一下为什麽:)谢谢了(50分)
我在我的机器和我机器机上的虚拟机上安装后都可以看到我在PtReceive中所要显示的包的内容~
但为什么我将这个程序安装在其他的2000机器上后就不好使了~~ 只输出了一句"===============>正在运行中的资料:PtReceive<==============="~~ 好像没有运行下去了~~为什麽呢??? 开始我以为是我用XPDDK编译二者不兼容,但我在2000DDK中又编译了一次,情况还在~~ 希望大家可以看一下~~谢谢大家了~~ PtReceive源码是: NDIS_STATUS PtReceive( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize ) { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET MyPacket, Packet; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; //--------------------------------------------------------- int Size; PUCHAR pPacketContent; PUCHAR pBuf; UINT BufLength; MDL *pNext; UINT i; //--------------------------------------------------------- UINT workmode=0; //自己用来定义的工作模式 DbgPrint(\"===============>正在运行中的资料:PtReceive<===============\\n\"); if(!pAdapt->MiniportHandle) { Status = NDIS_STATUS_FAILURE; } else do { // // We should not be getting Receives on a Secondary, this is just specific to our LBFO driver // if(pAdapt->isSecondary) { DBGPRINT(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\"); ASSERT(0); } // // If this was indicated by the miniport below as a packet, then get that packet pointer and indicate // it as a packet as well(with appropriate status). This way the OOB stuff is accessible to the // transport above us. // Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); if(Packet != NULL) { // // Get a packet off the pool and indicate that up // NdisDprAllocatePacket(&Status,&MyPacket,pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; // // Get the original packet(it could be the same packet as one received or a different one // based on # of layered MPs) and set it on the indicated packet so the OOB stuff is visible // correctly at the top. // NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); // // Set Packet Flags // NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); // // Make sure the status is set to NDIS_STATUS_RESOURCES. // NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); if(workmode==1) { NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyPacket,1); DbgPrint(\"现在的工作模式是=====>允许包通过<=====\\n\"); } else { DbgPrint(\"现在的工作模式是=====>封包截获和过滤<=====\\n\"); //把数据包内容从Packet拷贝到pPacketContent NdisQueryPacket( Packet,NULL,NULL,NULL,&Size); Status= NdisAllocateMemory( &pPacketContent,2000,0,HighestAcceptableMax); if (Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"=====>分配一个系统空间 NdisAllocateMemory 失败<=====\\n\"); return Status; } //初始化所分配的缓冲区 NdisZeroMemory(pPacketContent,2000); NdisMoveMemory(pPacketContent,HeaderBuffer,HeaderBufferSize); NdisMoveMemory(pPacketContent+HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize); //数据拷贝完毕 if (pPacketContent[13] != 0) { DbgPrint(\"===============>这不是一个 IP 包.<===============\\n\\n\\n\"); // 向上层协议驱动指示数据包,防真网卡行为。 NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); NdisFreeMemory(pPacketContent, 2000, 0); NdisDprFreePacket(MyPacket); return NDIS_STATUS_SUCCESS; } switch (pPacketContent[23]) { case 1: DbgPrint(\"===============>这是一个 IP/ICMP 包.<===============\\n\"); DbgPrint(\"目的 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[0], pPacketContent[1], pPacketContent[2], pPacketContent[3], pPacketContent[4], pPacketContent[5]); DbgPrint(\"源 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[6], pPacketContent[7], pPacketContent[8], pPacketContent[9], pPacketContent[10], pPacketContent[11]); DbgPrint(\"源 IP 地址 为: %u . %u . %u . %u n\\n\",pPacketContent[26], pPacketContent[27], pPacketContent[28], pPacketContent[29]); DbgPrint(\"目的 IP 地址 为: %u . %u . %u . %u \\n\\n\\n\\n\",pPacketContent[30], pPacketContent[31], pPacketContent[32], pPacketContent[33]); //释放之前所分配的缓存空间 NdisFreeMemory(pPacketContent, 2000, 0); break; case 6: DbgPrint(\"===============>这是一个 IP/TCP 包.<===============\\n\"); DbgPrint(\"目的 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[0], pPacketContent[1], pPacketContent[2], pPacketContent[3], pPacketContent[4], pPacketContent[5]); DbgPrint(\"源 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[6], pPacketContent[7], pPacketContent[8], pPacketContent[9], pPacketContent[10], pPacketContent[11]); DbgPrint(\"源 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[26], pPacketContent[27], pPacketContent[28], pPacketContent[29]); DbgPrint(\"目的 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[30], pPacketContent[31], pPacketContent[32], pPacketContent[33]); DbgPrint(\"源 端口 为: %u \\n\\n\",((pPacketContent[34]*0x100)+pPacketContent[35])); DbgPrint(\"目的 端口 为: %u \\n\\n\\n\\n\",((pPacketContent[36]*0x100)+pPacketContent[37])); //释放之前所分配的缓存空间 NdisFreeMemory(pPacketContent, 2000, 0); break; case 17: DbgPrint(\"===============>这是一个 IP/UDP 包.<===============\\n\"); DbgPrint(\"目的 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[0], pPacketContent[1], pPacketContent[2], pPacketContent[3], pPacketContent[4], pPacketContent[5]); DbgPrint(\"源 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[6], pPacketContent[7], pPacketContent[8], pPacketContent[9], pPacketContent[10], pPacketContent[11]); DbgPrint(\"源 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[26], pPacketContent[27], pPacketContent[28], pPacketContent[29]); DbgPrint(\"目的 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[30], pPacketContent[31], pPacketContent[32], pPacketContent[33]); DbgPrint(\"源 端口 为: %u \\n\\n\",((pPacketContent[34]*0x100)+pPacketContent[35])); DbgPrint(\"目的 端口 为: %u \\n\\n\\n\\n\",((pPacketContent[36]*0x100)+pPacketContent[37])); //释放之前所分配的缓存空间 NdisFreeMemory(pPacketContent, 2000, 0); break; default: NdisFreeMemory(pPacketContent, 2000, 0); break; } NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyPacket,1); NdisDprFreePacket(MyPacket); } ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES); NdisDprFreePacket(MyPacket); break; } } // // Fall through if the miniport below us has either not indicated a packet or we could not // allocate one // pAdapt->IndicateRcvComplete = TRUE; switch(pAdapt->Medium) { case NdisMedium802_3: NdisMEthIndicateReceive(pAdapt->MiniportHandle,MacReceiveContext,HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; case NdisMedium802_5: NdisMTrIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; case NdisMediumFddi: NdisMFddiIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; default: ASSERT(0); break; } } while(FALSE); return Status; } |
|
沙发#
发布于:2004-05-25 07:37
可能与网卡型号有关,对于一些网卡Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);的返回值总为空,这样后面的处理自然不会执行。
|
|
|
板凳#
发布于:2004-05-25 08:39
新网卡用PtReceivePacket,老式的RTL8029等用PtReceive.就这么简单。
从本质上讲,PtReceive被调用有两种情况: 1、当下层的miniport调用NdisMXxxIndicate的时候,NDIS总是调用ProtocolReceive函数。 2、这时候底层的miniport有可能资源不足,为了能够让上层驱动程序迅速放弃对数据包控制权,它在每一个数据包的带外数据块中设置status属性为NDIS_STATUS_SOURCE,这样就迫使NDIS转而调用ProtocolReceive函数,强迫IMD拷贝每一个数据包。 当情况2发生时,Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);就不返回空。 |
|
地板#
发布于:2004-05-25 08:40
PtReceivePacket和PtReceive都应该处理。就能兼容各种情况。
|
|
地下室#
发布于:2004-05-26 01:49
哦~~
等我试一下~~ |
|
5楼#
发布于:2004-05-26 15:34
可能与网卡型号有关,对于一些网卡Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);的返回值总为空,这样后面的处理自然不会执行。 那是不是会自动 执行PtReceivePacket这个函数的?? |
|
6楼#
发布于:2004-05-27 08:52
不会的,不会的,ProtocolReceive和 ProtocolReceivePacket同时只有一个会被调用。调用的原则上面说了。
如果NdisGetReceivedPacket返回NULL,就表示数据在LookAheadBuffer中,这时依然在ProtocolReceive中处理。 |
|
7楼#
发布于:2004-05-28 12:50
那如果我只要看一下包头的东西,不是在HeaderBuffer中已有了吗?
我想问一点的是HeaderBuffer是不是只包含一些帧头的东西? 而LookAheadBuffer中包含了帧数据的内容呢?? 所以要在PtTransferDataComplete中处理一下呢? |
|
8楼#
发布于:2004-05-28 17:53
我想问一点的是HeaderBuffer是不是只包含一些帧头的东西?
是。 而LookAheadBuffer中包含了帧数据的内容呢?? 有时不完全,要调用NdisTransferdat补全剩余的数据。 |
|
9楼#
发布于:2004-05-29 23:54
那我在上面的程序中应该可以输出帧头的东西啊~~
例如应该可以输出一些MAC地址的东西啊?? 为什麽我什麽都看不见呢? 只看见输出了一句"(\"===============>正在运行中的资料PtReceive<===============" |
|