<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
监听以太网(四) Packet32函数SDK
Article last modified on 2002-9-18 |
The information in this article applies to:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
ü Microsoft Windwos NTx
ü Microsoft Windwos 9x
ü WinPcap: the Free Packet Capture Architecture for Windows
|
Packet32包中的函数说明:
No.3. PacketSetHwFilter (设置过滤器)
设置一个hardware filter。比如,Filter参数传递NDIS_PACKET_TYPE_PROMISCUOUS,就可以设置网卡为混杂模式。
BOOLEAN PacketSetHwFilter(
LPADAPTER AdapterObject,
ULONG Filter
);
Parameters:
AdapterObject:
[in] 指向一个_ADAPTER结构的指针。
Filter:
[in] 过滤器的id。
Return Values:
如果执行成功,返回一个非零值。
Usage:
C/C++ Usage Sample
lpAdapter = PacketOpenAdapter(AdapterList[Open-1]);
PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS);
Remarks:
过滤器定义在ntddndis.h中。下面是一些最常用的:
NDIS_PACKET_TYPE_PROMISCUOUS:设置混杂模式。网卡接收每一个Packet;
NDIS_PACKET_TYPE_DIRECTED;
NDIS_PACKET_TYPE_BROADCAST:只接收broadcast packets;
NDIS_PACKET_TYPE_MULTICAST:只接收multicast packets,而且本机网卡是接收组的一个成员;
NDIS_PACKET_TYPE_ALL_MULTICAST:所有multicast packets都接收;
NDIS_PACKET_TYPE_ALL_LOCAL:所有local packets。
这个函数的实现是非常简单的:
首先填充PACKET_OID_DATA结构的Oid成员为OID_GEN_CURRENT_PACKET_FILTER,填充Data成员为既定的Filter,调用PacketRequest向网卡发送OID请求即可。
No.4. PacketSetBuff (设置缓冲区的大小)
设置捕获的内核级缓冲区的大小。
BOOLEAN PacketSetBuff(
LPADAPTER AdapterObject,
int dim
);
Parameters:
AdapterObject:
[in] 指向一个_ADAPTER结构的指针。
dim:
[in] 缓冲区的大小(单位:字节)。
Return Values:
如果执行成功,返回一个TRUE。如果没有足够的内存分配,返回FALSE。
Usage:
C/C++ Usage Sample
lpAdapter = PacketOpenAdapter(AdapterList[Open-1]);
PacketSetBuff(lpAdapter,512000); // 设置driver有512KB字节的缓冲区
Remarks:
一旦设定了一个新缓冲区大小,在原来的那块缓冲区中的数据就会被丢弃,包括存在里面的Packets。
注意:内核缓冲区的大小会严重影响到捕获进程的性能。一个适当的缓冲区可以在应用忙时保有数据,从而补偿应用的响应延迟,并在网络活动频繁时做到不丢失Packets。当driver的一个实例被打开时,这个缓冲区的大小被重设为0:开发者应该记得把它设为一个合适的值,比如设为1MB。
本函数调用了DeviceIoControl,给AdapterObject参数的hFile成员指向的NPF driver设备发送pBIOCSETBUFFERSIZE控制码。pBIOCSETBUFFERSIZE是在Packet32.h中定义的:
//:
#define pBIOCSETBUFFERSIZE 9592
No.5. PacketSetReadTimeout (设置读操作的超时时间)
设置一次读操作返回的超时时间。
BOOLEAN PacketSetReadTimeout(
LPADAPTER AdapterObject,
int timeout
);
Parameters:
AdapterObject:
[in] 指向一个_ADAPTER结构的指针。
timeout:
[in] 超时时间(单位:毫秒)。
Return Values:
如果执行成功,返回非零值。
Usage:
C/C++ Usage Sample
lpAdapter = PacketOpenAdapter(AdapterList[Open-1]);
PacketSetReadTimeout(lpAdapter,1000); // 设置读操作超时时间1秒
Remarks:
在AdapterObject指向的网卡上调用PacketReceivePacket(),到了设定的超时时间,这次调用就会释放,即使没有Packet被捕获到。
设置超时时间为0,说明没有超时。这样,如果没有Packet到来的话,PacketReceivePacket()方法永不会返回。
设置超时时间为-1,PacketReceivePacket()会立即返回。
这个函数也工作在网卡的统计模式下。所以可以用来设置两次统计报告之间的时间间隔。
这个函数也是通过DeviceIoControl发送控制码来实现的。
No.6. PacketAllocatePacket
为_PACKET结构分配内存。
LPPACKET PacketAllocatePacket(void);
Parameters:
无
Return Values:
如果执行成功,返回指向_PACKET结构的指针。否则,返回NULL。
Usage:
C/C++ Usage Sample
LPPACKET lpPacket;
lpPacket = PacketAllocatePacket();
Remarks:
这个函数并不负责为_PACKET结构的Buffer成员分配空间。这块缓冲区必须由应用程序分配,而且必须调用PacketInitPacket来将这缓冲区和_PACKET结构关联到一起。
No.7. PacketInitPacket
初始化一个_PACKET结构,即将packet结构中的buffer设置为传递的buffer指针。
VOID PacketInitPacket(
LPPACKET lpPacket,
PVOID Buffer,
UINT Length
);
Parameters:
lpPacket
[in] 指向一个_PACKET结构的指针。
Buffer
[in] 一个指向一块用户分配的缓冲区的指针。捕获的数据将放置于此。
Length
[in] 缓冲区的大小。这是一个读操作从driver传递到应用的最大数据量。
Return Values:
无。
Usage:
C/C++ Usage Sample
char buffer[256000];
LPPACKET lpPacket;
PacketInitPacket(lpPacket,(char*)buffer,256000);;
Remarks:
Driver能够用一个读操作返回几个Packets,那么一次调用传递给应用程序的packet的数量,就只取决于传递给PacketReceivePacket()的_PACKET结构的buffer的大小了。因此用PacketInitPacket()初始化一块大缓冲区,能够显著地减少系统调用,减少捕获进程在处理器上的影响。
No.8. PacketReceivePacket (读取数据)
从NPF driver上读取数据(Packets或者统计信息)。
BOOLEAN PacketReceivePacket(
LPADAPTER AdapterObject,
LPPACKET lpPacket,
BOOLEAN Sync
);
Parameters:
AdapterObject:
[in] 指向一个_ADAPTER结构的指针。
lpPacket:
[in , out] 放数据的_PACKET结构缓冲区。
Sync:
[in] 一个可以忽略的参数,保留它是为了向后兼容。
Return Values:
如果执行成功,返回一个非零值。
Usage:
C/C++ Usage Sample
LPADAPTER lpAdapter = 0;
LPPACKET lpPacket;
lpAdapter = PacketOpenAdapter(AdapterList[Open-1]);
lpPacket = PacketAllocatePacket();
PacketInitPacket(lpPacket,(char*)buffer,256000);
PacketReceivePacket(lpAdapter,lpPacket,TRUE);
Remarks:
这个函数所接收的数据可以是一组Packets,也可以是网络流量的一个统计数据,依赖于网卡的工作模式。
接收到的Packet的数量是可变的。它依赖于几个因素:当前存储在driver缓冲区中的Packet的数目,这些Packet的大小,分配给lpPacket参数的缓冲区的大小。
Packet存储在lpPacket结构的buffer缓冲区内,lpPacket->Length指示着复制到缓冲区的数据的大小。
它的实现也很简单:
先看看AdapterObject->ReadTimeOut是否是-1:
如果不是-1,则调用WaitForSingleObject等候AdapterObject->ReadEvent读事件触发,超时时间为AdapterObject->ReadTimeOut的数值。如果AdapterObject->ReadTimeOut为0,则永不超时。
如果是-1,就表明读完立即返回。
之后,调用ReadFile读取数据。
No.9. PacketGetStats (得到本次捕获的统计数据)
得到当前捕获进程的统计信息。
BOOLEAN PacketGetStats(
LPADAPTER AdapterObject,
struct bpf_stat *s
);
Parameters:
AdapterObject:
[in] 指向一个_ADAPTER结构的指针。
s:
[in, out] bpf_stat结构,通过它,我们可以知道接收到的包数,丢失的包数等。
Return Values:
如果执行成功,返回非零值。
Usage:
C/C++ Usage Sample
struct bpf_stat stat;
PacketGetStats(lpAdapter,&stat);
Remarks:
通过这个函数,我们可以知道:
从开始捕获起,这个driver从网卡上接收的Packet的数量(包括driver丢失的Packet);
从开始捕获起,这个driver丢失的Packet的数量,一般地,包丢失,是因为driver的缓冲区满了,这时driver将扔掉这个包。
具体实现也是调用DeviceIoControl函数向设备发送pBIOCGSTATS控制码,得到一个bpf_stat结构,然后只把这个结构的bs_recv和bs_drop成员返回。
No.10. PacketCloseAdapter
关闭网卡。
VOID PacketCloseAdapter(LPADAPTER lpAdapter);
Parameters:
lpAdapter:
[in] 指向一个_ADAPTER结构的指针。
Remarks:
依次做下面的动作:
关闭lpAdapter->hFile,打开的NPF driver的实例句柄;
触发lpAdapter->ReadEvent,并关闭这个句柄;
解锁并释放lpAdapter。
(To be continued)
Writen by zhengyun@tomosoft.com
本文档所包含的信息代表了在发布之日,ZhengYun 对所讨论问题的当前看法,Zhengyun 不保证所给信息在发布之日以后的准确性。
本文档仅供参考。对本文档中的信息,Zhengyun 不做任何明示或默示的保证。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12693
相关推荐
windows Packet32 包中的函数及数据说明,非常详细
winpcap SDK开发包头文件sdk(pcap.h,Packet32.h,Packet32.h,wpcap.lib,Packet.lib)
开发网卡监听,所需要的驱动;Packet32
#ifndef __PACKET32 #define __PACKET32 #include #ifdef HAVE_AIRPCAP_API #include #else #if !defined(AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_) #define AIRPCAP_HANDLE__EAE405F5_...
packet32 优秀的Mac 层开发包源码
一个头文件,做网络嗅控时要用到的头。 我的第三方类集
Cisco模拟器 7.0版本 32位
Cisco Packet Tracer 7.0 32位和64位安装包 这是思科最新 PT 7.0 模拟器
(i.e., 64bit: "C:\Program Files\Cisco Packet Tracer 7.2.2\plugins", 32bit: "C:\Program Files (x86)\Cisco Packet Tracer 7.2.2\plugins", or the other folder that you installed Packet Tracer 7.2.2)....
Packet Tracer 7.2.1 for Windows 32 bit 模拟器,32位版本。
思科模拟器Cisco Packet Tracer7.2.2 x32 Cisco Packet Tracer 7.2.2 new features Cisco Packet Tracer 7.2.2 removes the Java dependence and makes it easier to use Packet Tracer Skills Assessment (PTSA) ...
在 Simulator 中,create_packetformat 函数负责创建 Packet 结构,并初始化 Packet 中的报头信息。在这个函数中,PacketHeaderManager 负责管理 Packet 中的报头,并将报头的偏移量计算出来。 计算报头的偏移量是...
Cisco Packet Tracer 7.1 32位 Cisco Packet Tracer是由Cisco公司发布的一个辅助学习工具,为学习思科网络课程的初学者去设计、配置、排除网络故障提供了网络模拟环境。用户可以在软件的图形用户界面上直接使用拖曳...
Packet获取封包信息的函数模块文件.c
Cisco Packet Tracer 7.1.1 32位 Cisco Packet Tracer是由Cisco公司发布的一个辅助学习工具,为学习思科网络课程的初学者去设计、配置、排除网络故障提供了网络模拟环境。用户可以在软件的图形用户界面上直接使用...
绍了Windows NT系统中的NDIS,应用程序与它的交互及怎样利用ARP协议在局域网中报告设备的在线状态:在主控机中运用辅助的开发包(Packet32)进行口伪装,并用开发包直接对网卡进行操作,发送更改口命令给设备,从而使...
测试捕获效率,Test1表明应用packet.dll进行捕获的基本步骤 Test2通过调用packet.dll进行捕获 Test4和Test2基本相同,只是直接调用packet.sys驱动的导出函数,免去了packet.dll的封装过程
C#利用SharpPcap发送以太网报文(以太网原始帧),软件基本流程:从文件读取要发送的帧内容,然后找到电脑上的以太网卡,接下来利用SharpPcap来循环发送。 vs2008工程,全部源代码,可编译和测试。 以太网帧内容...