阅读:1111回复:1
各位大虾,有没有ndis自己构造包的例子让小地学习一下
我想在ndis中构造一个以太网包,直接通过网卡发送出去,但一直没有这样的例子,各位大虾可否提供一个?
我现在提供只提供参数:pBuffer,uBufferSize,将缓冲区重的数据发送,地址均可固定,谢谢啦 |
|
沙发#
发布于:2004-04-20 10:30
没有人顶吗?我的代码如下,大家帮我分析分析,欢迎指教!
NDIS_STATUS SendPacket( IN NDIS_HANDLE ProtocolBindingContext, IN PVOID pBuffer, IN ULONG uBufferSize) { PADAPT pAdapt = (PADAPT)ProtocolBindingContext; PNDIS_PACKET MyPacket; NDIS_STATUS Status; PNDIS_BUFFER pNdis_Ether; PEtherHeader pEtherheader; //以太网头 PIPHeader pIpHeader; PUDPHeader pUdpHeader; PUCHAR pData; UINT i = 0; UINT uOffset; UINT uTotalLen=sizeof(EtherHeader)+sizeof(IPHeader)+sizeof(UDPHeader)+uBufferSize; if(uTotalLen>MAX_ETHER_SIZE) return NDIS_STATUS_FAILURE; DbgPrint(\"sengpacket is running\\n\"); //分配一个包 NdisAllocatePacket(&Status,&MyPacket,pAdapt->SendPacketPoolHandle); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"nNdisAllocatePacket() failed\\n\"); return Status; } //分配以太网包头 Status = NdisAllocateMemory(&pEtherheader,uTotalLen,NDIS_MEMORY_NONCACHED,HighestAcceptableMax); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"nNdisAllocateMemory() failed\\n\"); NdisFreePacket(MyPacket); return Status; } pEtherheader->type = IP; //IP数据报 for(i = 0;i<6;i++) pEtherheader->ether_dst = gDestMac; for(i = 0;i<6;i++) pEtherheader->ether_src= gSrcMac ; uOffset=sizeof(EtherHeader); pIpHeader=(PIPHeader)&(((PUCHAR)pEtherheader)[uOffset]); pIpHeader->version=IPVERSION; //版本:主机顺序,如果是网络顺序则是首部长度 pIpHeader->header_len=sizeof(IPHeader); //首部长度:主机顺序,如果是网络顺序则是版本号 pIpHeader->type=0; //服务类型 pIpHeader->length=sizeof(IPHeader)+sizeof(UDPHeader)+uBufferSize;//总长度 pIpHeader->id=0; //标识符 pIpHeader->flag_offset=0; //标志(3)偏移(13) pIpHeader->time=0; //生成时间 pIpHeader->protocol=PROT_UDP; //协议类型 pIpHeader->crc_val=0; //校验和 pIpHeader->src_addr=gSrcIp; //源地址 pIpHeader->des_addr=gDestIp; //目的地址 uOffset=sizeof(EtherHeader)+sizeof(IPHeader); pUdpHeader=(PUDPHeader)&(((PUCHAR)pEtherheader)[uOffset]); pUdpHeader->uh_dport=SERVER_PORT; pUdpHeader->uh_sport=HOST_PORT; pUdpHeader->uh_sum=0; pUdpHeader->uh_ulen=sizeof(UDPHeader)+uBufferSize; uOffset=sizeof(EtherHeader)+sizeof(IPHeader)+sizeof(UDPHeader); pData=&(((PUCHAR)pEtherheader)[uOffset]); NdisMoveMemory(pData,pBuffer,uBufferSize); NdisAllocateBuffer( &Status, &pNdis_Ether, pAdapt->SendPacketPoolHandle, pEtherheader, uTotalLen); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"nNdisAllocateBuffer() failed.n\"); NdisFreePacket(MyPacket); NdisFreeMemory(pEtherheader,uTotalLen,NDIS_MEMORY_NONCACHED); return Status; } //将以太网头送入包中 NdisChainBufferAtBack(MyPacket,pNdis_Ether); NdisSetPacketFlags(MyPacket,pAdapt->Medium); Status = MPSendOnePacket(pAdapt->BindingHandle,MyPacket,NdisGetPacketFlags(MyPacket)); if(Status != NDIS_STATUS_PENDING) { // NdisMSendComplete( // pAdapt->pPrimaryAdapt->MiniportHandle, // MyPacket, // Status); NdisFreePacket(MyPacket); NdisFreeMemory(pEtherheader,uTotalLen,NDIS_MEMORY_NONCACHED); NdisFreeBuffer(pNdis_Ether); } return Status; } |
|