beckhamwu
驱动牛犊
驱动牛犊
  • 注册日期2003-04-09
  • 最后登录2003-08-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2159回复:8

请问:如何构造一个数据包?

楼主#
更多 发布于:2003-06-30 21:56
请问:怎样在ptrecive中自己构造一个包并向上传送给协议层或向下传送给网卡驱动?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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
     }
     //释放资源
      返回
}
放弃瘟草,现吃李草
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-01 08:50
http://www.driverdevelop.com/forum/viewthread.php?tid=4438
这个帖子你可以看看
放弃瘟草,现吃李草
beckhamwu
驱动牛犊
驱动牛犊
  • 注册日期2003-04-09
  • 最后登录2003-08-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-02 02:32
我想问的是如果我要在ptreceive中自己构造一个UDP数据包(而不是由miniport传上来的)然后将自己构造的这个包传上去应该怎么做?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-02 18:41
你不要用ptreceive中的传上来的数据。
你直接申请一个ndisallocatememory;
然后在memory中填充一个UDP数据包(这个你应该知道把),
再allocatebuffer
再allocepacket
然后你indicatepacket就可以。
系统看到就是你的UDP数据包
放弃瘟草,现吃李草
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-02 18:52
也就是你indicatepacket上去的packet,的内容如果是你自己的
那么传上去的就是你自己的。
如果你的数据在在ptreceive的参数中copy过来的,那么传上去的就是ptreceive的数据
放弃瘟草,现吃李草
beckhamwu
驱动牛犊
驱动牛犊
  • 注册日期2003-04-09
  • 最后登录2003-08-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-02 23:56
那么,怎样构造一个像信使服务那样的数据包?
也就是说,我将自己构造的数据包发出后可以在用户端收到信息
请指教!
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-03 08:22
信使服务应该不是TCP/IP的,是IPX协议吧。
你可以去查资料,这个我不是很清楚。
放弃瘟草,现吃李草
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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;
}
游客

返回顶部