kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1112回复:1

各位大虾,有没有ndis自己构造包的例子让小地学习一下

楼主#
更多 发布于:2004-04-19 17:00
我想在ndis中构造一个以太网包,直接通过网卡发送出去,但一直没有这样的例子,各位大虾可否提供一个?
我现在提供只提供参数:pBuffer,uBufferSize,将缓冲区重的数据发送,地址均可固定,谢谢啦
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
}
游客

返回顶部