阅读:1209回复:1
小弟理解的构造packet的过程!请高手指点!(20分)
小弟前段时间在这里发帖求助关于构造NDIS_PACKET的问题,无人解答 最后看到一段示例代码 下面是自己的理解
1.分配包池 NdisAllocatePacketPool 2.分配包 NdisAllocatePacket 3.分配内存 NdisAllocateMemory 4.填充内存区域 5.分配缓冲池 NdisAllocateBufferPool 6.分配缓冲区 NdisAllocateBuffer 7.连接缓冲区 NdisChainBufferAtFront 小弟根据这个理解实现了自己构包代码,但是仍然有不少问题,不知道是构包的过程理解有误还是代码有问题,请高手指点!代码如下,为了精简去掉了不少东西,大家将就着看吧 NDIS_STATUS __fastcall ConstructPacket( IN PVOID buffer, IN ULONG SizeOfBuffer, IN PDUMP_DATA pData, OUT PNDIS_PACKET MyPacket) { NDIS_STATUS status; NDIS_HANDLE PacketPoolHandler; NDIS_HANDLE BufferPoolHandler; PUCHAR pDataBuf; PUCHAR pMemory; ULONG uOffset; NDIS_PHYSICAL_ADDRESS laPhyAddr; laPhyAddr.QuadPart = -1; NdisAllocatePacketPool(&status,&PacketPoolHandler,1,4*sizeof(PVOID)); if ( status == NDIS_STATUS_SUCCESS ) { NdisAllocatePacket( &status, &MyPacket, PacketPoolHandler); if ( status == NDIS_STATUS_SUCCESS ) { status = NdisAllocateMemory( &pMemory, uTotalLen, 0, laPhyAddr ); if( status == NDIS_STATUS_SUCCESS ) { uOffset = 0; pEtherHeader = ( PETHERNET_FRAME )&pMemory[uOffset]; si_memcpy(pEtherHeader,&(pPacketInfo->EthernetHeader),ETHERNET_FRAME_LENGTH); uOffset += sizeof( ETHERNET_FRAME ); pIpHeader = ( PIP_HEADER )&pMemory[uOffset]; si_memcpy(pIpHeader,&(pPacketInfo->IpHeader),IP_HEADER_LENGTH); uOffset += sizeof( IP_HEADER ); pTcpHeader = ( PTCP_HEADER )&pMemory[uOffset]; si_memcpy(pTcpHeader,&(pPacketInfo->TcpHeader),TCP_HEADER_LENGTH); uOffset += sizeof( TCP_HEADER ); pDataBuf = (PUCHAR)&pMemory[uOffset]; si_memcpy( pDataBuf, buffer , SizeOfBuffer); NdisAllocateBufferPool(&status,&BufferPoolHandler,1); if ( status == NDIS_STATUS_SUCCESS ) { NdisAllocateBuffer(&status,(PNDIS_BUFFER*)&pMemory,BufferPoolHandler,pMemory,uTotalLen); if ( status == NDIS_STATUS_SUCCESS ) { NdisChainBufferAtFront(MyPacket,(PNDIS_BUFFER)pMemory); MyPacket->Private.Head->Next = NULL; MyPacket->Private.Tail = NULL; } } else { NdisFreeMemory(pMemory,uTotalLen,0); } } else { NdisDprFreePacket( MyPacket ); } } } return status; } [编辑 - 9/20/04 by EvilRyu] |
|
沙发#
发布于:2004-09-20 16:46
呵呵,有来蹭分了!
基本对的,不过注意包池与缓冲池一般是在BindAdapter中分配的;实际上楼主只要高清楚Ndis包描述符的结构,你就会很清楚了,你可以看看win2k驱动开发大全卷一,那上面有很详细的说明 |
|
|