阅读:1388回复:2
能帮我看下我的PTRECEIVE里发包的代码吗?谢谢
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 // 数据包总大小(不包括包头) ) { PADAPT OutAdapt, pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET MyPacket, Packet, MyPacket1; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; PNDIS_BUFFER pPacketBuffer, pBakBuffer; PUCHAR pPacketContent, pBakContent; UINT PacketLen; UINT OffsetSize; UINT BytesTransferred; PRSVD Rsvd = NULL; PVOID MediaSpecificInfo = NULL; ULONG MediaSpecificSize= 0; //发包用的变量 PNDIS_PACKET SendPacket; PUCHAR pPacketSend; NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress; PVOID MemoryVA; UINT TotalPacketLength = 2000; PNDIS_BUFFER PktBuffer; PNDIS_HANDLE PktBufferPool = NULL; MDL * pNext; //变量定义结果 DBGPRINT((\"In 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(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( &pPacketSend, 2000, 0,HighestAcceptableMax); if (Status!=NDIS_STATUS_SUCCESS ) return Status; NdisZeroMemory(pPacketSend, 2000);//pPacketSend我已经构建好了 NdisAllocatePacket(&Status, &SendPacket, pAdapt->SendPacketPoolHandle); if(Status != NDIS_STATUS_SUCCESS) { // // Output debug information // DbgPrint(\"\\n* Debug Report @ Send: NdisAllocatePacket dose not renturn NDIS_STATUS_SUCCESS\\n\"); DbgPrint(\"and Send will return NDIS_STATUS_FAILURE\\n\"); return (NDIS_STATUS_FAILURE); } // Allocate memory with NdisAllocateMemory // HighestAcceptableAddress.LowPart = -1; HighestAcceptableAddress.HighPart = -1; Status = NdisAllocateMemory(&MemoryVA, TotalPacketLength, //Maybe add a checksum length 0, HighestAcceptableAddress); if(Status == NDIS_STATUS_FAILURE) { // // Output debug information // DbgPrint(\"\\n* Debug Report @ MPSend: NdisAllocateMemory returns NDIS_STATUS_FAILURE,\\n\"); DbgPrint(\"and MPSend will return NDIS_STATUS_FAILURE\\n\"); return (NDIS_STATUS_FAILURE); } // Allocate buffer-pool // // NdisAllocateBufferPool(&Status, // PktBufferPool, // 1); NdisAllocateBufferPool(&Status,&pAdapt->RecvBufferPoolHandle, MIN_PACKET_POOL_SIZE); // // Allocate buffer // NdisAllocateBuffer(&Status, &PktBuffer, PktBufferPool, MemoryVA, TotalPacketLength);//Maybe add a checksum length if(Status == NDIS_STATUS_FAILURE) { // // Release the memory // NdisFreeMemory(MemoryVA, TotalPacketLength, //Maybe add a checksum length 0); // // Output debug information // DbgPrint(\"\\n* Debug Report @ MPSend: NdisAllocateBuffer returns NDIS_STATUS_FAILURE,\\n\"); DbgPrint(\"and MPSend will return NDIS_STATUS_FAILURE\\n\"); return (NDIS_STATUS_FAILURE); } NdisMoveMemory(SendPacket,pPacketSend,2000);//这里我不会写,我不知道怎么把一个PUCHAR的内容正确的移到一个PNDIS_PACKET的包里// Chain the buffer to Mypacket // NdisChainBufferAtBack(SendPacket,PktBuffer); SendPacket->Private.Head = PktBuffer; SendPacket->Private.Tail = PktBuffer; NdisSetPacketFlags(SendPacket, NDIS_FLAGS_DONT_LOOPBACK); NdisSend(&Status, pAdapt->BindingHandle, SendPacket); if(Status != NDIS_STATUS_PENDING) { NdisUnchainBufferAtBack(SendPacket,&PktBuffer); NdisFreeBuffer(PktBuffer); NdisFreeBufferPool(PktBufferPool); NdisFreeMemory(MemoryVA, TotalPacketLength, //Maybe add a checksum length 0); NdisFreePacket(SendPacket); } 再接下来的// // Copy the Media specific information 这段代码我也不知道怎么写因为我这里不存在packet这个包我怎么去 NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet, &MediaSpecificInfo, &MediaSpecificInfoSize); 我真的只会写这么多了,大家能帮下忙一起研究一下吗?我已经被在收包时发包的问题困扰了好久了,大家帮我一下吧。 |
|
沙发#
发布于:2005-04-05 10:11
蓝屏是在什么地方发生的, 能否详细说明
是不是SendComplete函数处理不当 |
|
|
板凳#
发布于:2005-04-05 17:12
可能就是那里把PUCHAR拷到NDIS_PACKET那里有问题。
我已经试着在MPSEND里发包,已经可以实现了,现在我再把移到PTRECEIVE里试试。 root60931你能不能加下我QQ或MSN啊? 我的QQ是36886919 MSN hanji123@hotmail.com |
|