深度剖析WinPcap之(九)——数据包的发送过程(6)
来源:互联网 发布:淘宝店铺显示金牌卖家 编辑:程序博客网 时间:2024/05/24 06:35
本文转自http://eslxf.blog.51cto.com/918801/214395
1.7 packet.dll对应得函数接口
packet.dll主要依赖于操作系统的系统调用WriteFile、DeviceIoControl实现单个数据包发送与发送队列方式的发送。下面分析packet.dll中相应函数的内部实现。
1.7.1 发送单个数据包的接口实现
首先了解_PACKET结构体的定义,它提供了单个数据包发送的基本数据结构。
结构体_PACKET 在Common/ Packet32.h文件中定义的。该结构体的主要用途是为了数据包接收使用,不过packet.dll中也用来实现数据包的发送。对各字段的解释我们以源代码的注释为准,用于发送时的含义可作相应的理解。
/*该结构体包含从驱动程序来的一组数据包。
*该结构体定义了每个发送给应用程序的数据包的包头。
*/
typedef struct _PACKET {
//包含数据包的缓冲区,
//参见PacketReceivePacket函数了解在该缓冲区进行数据组织细节
PVOID Buffer;
//缓冲区长度
UINT Length;
//缓冲区中出现的有效数据长度,
//比如最后调用PacketReceivePacket函数时所接收的数据大小
DWORD ulBytesReceived;
} PACKET, *LPPACKET;
1.7.1.1 PacketAllocatePacket和PacketFreePacket函数
在packet.dll中使用PacketAllocatePacket函数分配一个_PACKET结构体的内存空间,该函数在packetNtx/Dll/Packet32.c中实现,源代码如下:
LPPACKET PacketAllocatePacket(void)
{
LPPACKET lpPacket;
lpPacket=(LPPACKET)GlobalAllocPtr(
GMEM_MOVEABLE | GMEM_ZEROINIT,sizeof(PACKET));
if (lpPacket==NULL)
{//分配失败
}
return lpPacket;
}
使用GlobalAllocPtr分配一个_PACKET结构体大小的内存空间,同时对所分配的内存作清零处理。与PacketAllocatePacket对应的函数为PacketFreePacket ,做相反的事情,释放所分配的资源,源代码如下所示:
VOID PacketFreePacket (LPPACKET lpPacket)
{
CloseHandle (lpPacket->OverLapped.hEvent);
GlobalFreePtr (lpPacket);
}
1.7.1.2 PacketInitPacket函数
在PacketInitPacket函数中,对待发数据包进行封装,其中ulBytesReceived字段为0。
VOID PacketInitPacket(LPPACKET lpPacket,
PVOID Buffer,UINT Length)
{
lpPacket->Buffer = Buffer;
lpPacket->Length = Length;
lpPacket->ulBytesReceived = 0;
lpPacket->bIoComplete = FALSE;
}
1.7.1.3 PacketSendPacket函数
封装后的数据包,通过PacketSendPacket发送,该函数调用WriteFile系统调用。函数的具体实现如下:
BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,
LPPACKET lpPacket,BOOLEAN Sync)
{
DWORD BytesTransfered;
BOOLEAN Result;
UNUSED(Sync);
…
if (AdapterObject->Flags == INFO_FLAG_NDIS_ADAPTER)
{
Result = (BOOLEAN)WriteFile(AdapterObject->hFile,
lpPacket->Buffer,lpPacket->Length,
&BytesTransfered,NULL);
}
else
{//未明设备类型
AdapterObject->Flags);
Result = FALSE;
}
return Result;
}
- 深度剖析WinPcap之(九)——数据包的发送过程(6)
- 深度剖析WinPcap之(九)——数据包的发送过程(1)
- 深度剖析WinPcap之(九)——数据包的发送过程(2)
- 深度剖析WinPcap之(九)——数据包的发送过程(3)
- 深度剖析WinPcap之(九)——数据包的发送过程(4)
- 深度剖析WinPcap之(九)——数据包的发送过程(5)
- 深度剖析WinPcap之(九)——数据包的发送过程(7)
- 深度剖析WinPcap之(九)——数据包的发送过程(8)
- 深度剖析WinPcap之(九)——数据包的发送过程(9)
- 深度剖析WinPcap之(九)——数据包的发送过程(10)
- 深度剖析WinPcap之(九)——数据包的发送过程(11)
- 深度剖析WinPcap之(九)——数据包的发送过程(12)
- 深度剖析WinPcap之(九)——数据包的发送过程(13)
- 深度剖析WinPcap之(九)——数据包的发送过程(13-2)
- 深度剖析WinPcap之(九)——数据包的发送过程(14)(完)
- 深度剖析WinPcap之(十)——数据包的内核过滤(6)
- 深度剖析WinPcap之(十)——数据包的内核过滤(1)
- 深度剖析WinPcap之(十)——数据包的内核过滤(2)
- Disable (initial) screen lock
- 深度剖析WinPcap之(九)——数据包的发送过程(4)
- 路径
- 深度剖析WinPcap之(九)——数据包的发送过程(5)
- 如何查看Windows Installer的Log文件
- 深度剖析WinPcap之(九)——数据包的发送过程(6)
- Spring,struts,hibernate常见的面试笔试题汇总(3)
- AS2.0 打造蜜蜂飞舞效果
- JGroups实现Java群组通讯
- 深度剖析WinPcap之(九)——数据包的发送过程(7)
- 深度剖析WinPcap之(九)——数据包的发送过程(8)
- 屏蔽lephone在模拟器上的烦人Exception
- 质量体系建立的步骤
- sql isnull