阅读:1413回复:3
很急的问题,NdisSend发包,有一部分网卡不能发?帮忙看下代码吧。
再一些网卡上,发送的包,不能用截包软件看到。并且证实是包没发出去。
可是大部分网卡还是能起到效果。 这个包是我自己给自己发的。 DBG打印出来的信息都是正确的,并在PtSendComplete中也有释放。 下面是代码: NdisAllocatePacket(&Status,&MyPacket,pAdapt->SendPacketPoolHandle); if(NT_SUCCESS(Status)) { //用上面的包内容 pPacketContent 分配一个新的缓冲区 PacketBuffer NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->SendPacketPoolHandle,pPacketContent,PacketLen); //把这个新分配的缓冲区 连接到 刚分配的新的包上 NdisChainBufferAtFront( MyPacket, PacketBuffer); Rsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved); Rsvd ->OriginalPkt = NULL; MyPacket->Private.Flags = NdisGetPacketFlags(g_SendPacket); MyPacket->Private.Head->Next=NULL; MyPacket->Private.Tail=NULL; NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);//自己定义的包 NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket),NDIS_OOB_DATA_FROM_PACKET(g_SendPacket),sizeof(NDIS_PACKET_OOB_DATA)); NdisIMCopySendPerPacketInfo(MyPacket, g_SendPacket); NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(g_SendPacket,&MediaSpecificInfo,&MediaSpecificInfoSize); if (MediaSpecificInfo || MediaSpecificInfoSize) { NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket, MediaSpecificInfo, MediaSpecificInfoSize); } NdisSend(&Status, pAdapt->BindingHandle, MyPacket);//发送 if (Status != NDIS_STATUS_PENDING)//返回pending的话自己分配的东饕?赑tSendComplete里面释放 { NdisUnchainBufferAtFront(MyPacket ,&PacketBuffer); NdisQueryBufferSafe(PacketBuffer,(PVOID *)&pPacketContent,&ReturnLen,32); NdisFreeBuffer(PacketBuffer); NdisFreeMemory(pPacketContent,ReturnLen,0); NdisDprFreePacket(MyPacket); return; } } |
|
沙发#
发布于:2008-02-20 09:36
详细请看,我发的再说PtSendComplete
可讨论下 |
|
板凳#
发布于:2008-02-22 11:11
感觉跟 SendComplete没太大关系
我在 SendComplete已经对上级的包进行释放了 就是有一部分卡 发包出去 并且SendComplete已经释放的包 网络里却没有 |
|
地板#
发布于:2008-02-24 00:25
我也想知道为何ndissend 发包返回值为0时,报文是发不出去的,为何了?
|
|