阅读:2159回复:8
请问:如何构造一个数据包?
请问:怎样在ptrecive中自己构造一个包并向上传送给协议层或向下传送给网卡驱动?
|
|
沙发#
发布于:2003-07-01 08:46
框架是这样的:
packet = ndisgetpacket if(packet!=NULL) { //不要转发和passthru的处理一样,要转发的话不一样 } else { if(lookaheadbuffersize>=packetsize) { ndisallocatememory; //把headerbuffer和lookaheadbuffer中的内容copy到你 //你申请的memory中 ndisallocatebuffer; ndisallocatepacket; //链到链表 //转发/indicatepacket if(Status!=peing) { //释放你申请的资源 } //返回SUCCESS,转发的话在ptsendcomplet中释放资源 } else{ //跟上面差不多,但是要transferdata 如果不成功还要transferdatacomplete } //释放资源 返回 } |
|
|
板凳#
发布于:2003-07-01 08:50
http://www.driverdevelop.com/forum/viewthread.php?tid=4438
这个帖子你可以看看 |
|
|
地板#
发布于:2003-07-02 02:32
我想问的是如果我要在ptreceive中自己构造一个UDP数据包(而不是由miniport传上来的)然后将自己构造的这个包传上去应该怎么做?
|
|
地下室#
发布于:2003-07-02 18:41
你不要用ptreceive中的传上来的数据。
你直接申请一个ndisallocatememory; 然后在memory中填充一个UDP数据包(这个你应该知道把), 再allocatebuffer 再allocepacket 然后你indicatepacket就可以。 系统看到就是你的UDP数据包 |
|
|
5楼#
发布于:2003-07-02 18:52
也就是你indicatepacket上去的packet,的内容如果是你自己的
那么传上去的就是你自己的。 如果你的数据在在ptreceive的参数中copy过来的,那么传上去的就是ptreceive的数据 |
|
|
6楼#
发布于:2003-07-02 23:56
那么,怎样构造一个像信使服务那样的数据包?
也就是说,我将自己构造的数据包发出后可以在用户端收到信息 请指教! |
|
7楼#
发布于:2003-07-03 08:22
信使服务应该不是TCP/IP的,是IPX协议吧。
你可以去查资料,这个我不是很清楚。 |
|
|
8楼#
发布于:2004-04-20 11:18
各位大虾,构造udp包我觉得思路是对的,各位给我检查一下,好像有问题
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); NdisSend(&Status, pAdapt->BindingHandle, MyPacket); if (Status != NDIS_STATUS_PENDING) { NdisFreePacket(MyPacket); NdisFreeMemory(pEtherheader,uTotalLen,NDIS_MEMORY_NONCACHED); NdisFreeBuffer(pNdis_Ether); } return Status; } |
|