EvilRyu
驱动牛犊
驱动牛犊
  • 注册日期2004-07-13
  • 最后登录2005-08-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1209回复:1

小弟理解的构造packet的过程!请高手指点!(20分)

楼主#
更多 发布于:2004-09-20 10:11
小弟前段时间在这里发帖求助关于构造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]
sword3i
驱动牛犊
驱动牛犊
  • 注册日期2003-07-25
  • 最后登录2013-01-07
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望112点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-20 16:46
呵呵,有来蹭分了!

基本对的,不过注意包池与缓冲池一般是在BindAdapter中分配的;实际上楼主只要高清楚Ndis包描述符的结构,你就会很清楚了,你可以看看win2k驱动开发大全卷一,那上面有很详细的说明
随风奔跑自由是方向 追逐雷和闪电的力量 把浩瀚的海洋装进我胸膛 即使再小的帆也能远航 随风飞翔有梦作翅膀 敢爱敢做勇敢闯一闯 哪怕遇见再大的风险再大的浪 也会有默契的目光 努力蹭分! ..................
游客

返回顶部