监听以太网(三) Packet32数据结构说明

Packet32包中的数据结构: 

第一个重要的数据结构:_ADAPTER(关于Network Adapter的) 

typedef struct _ADAPTER 

// 一个打开的NPF driver实例的句柄: 
HANDLE hFile; 
// 当前打开的网卡的名字: 
CHAR SymbolicLink[MAX_LINK_NAME_LENGTH]; 
// 在这块Adapter上,一个数据包被写的次数: 
int NumWrites; 
// 这块Adapter上的read操作的通知事件。它可以被传递给标准Win32函数(如WaitForSingleObject或者WaitForMultipleObjects), 
// 这样可以等待到driver的缓冲区内有数据到来。在同时等待几个事件的GUI程序中,它特别有用。在Windows2000/XP中, 
// 函数PacketSetMinToCopy()可以用来设置内核缓冲区中激发本事件的最小数据大小: 
HANDLE ReadEvent; 
// 设置一个时间,到时候,即使没有捕获任何包,read操作也会被释放,ReadEvent也会被触发: 
UINT ReadTimeOut; 
} ADAPTER, *LPADAPTER; 

第二个重要的数据结构:_PACKET(关于Packet的) typedef struct _PACKET 

// 向后兼容用的: 
HANDLE hEvent; 
// 向后兼容用的: 
OVERLAPPED OverLapped; 
// 存放Packets的缓冲区: 
PVOID Buffer; 
// 缓冲区的大小: 
UINT Length; 
// 当前缓冲区中有效的字节数,如,上一次调用PacketReceivePacket()函数接收到的字节数: 
DWORD ulBytesReceived; 
// 向后兼容用的: 
BOOLEAN bIoComplete 
} PACKET, *LPPACKET; 

第三个重要的数据结构:_PACKET_OID_DATA (关于OID请求的) typedef struct _PACKET_OID_DATA 

// OID的code,有效的OID code的定义参见ntddndis.h;比如: 
// OID_GEN_SUPPORTED_LIST,OID_GEN_VENDOR_DESCRIPTION等: 
ULONG Oid; 
// 成员Data的长度: 
ULONG Length; 
// 存放发送给网卡或者从网卡接收的数据的缓冲区: 
UCHAR Data[1]; 

typedef struct _PACKET_OID_DATA ?PACKET_OID_DATA, *PPACKET_OID_DATA; 

其他数据结构: npf_if_addr(网卡的地址): 
typedef struct npf_if_addr { 
struct sockaddr IPAddress; // ?IP address. 
struct sockaddr SubnetMask; // ?Netmask for that address. 
struct sockaddr Broadcast; // ?Broadcast address. 
}npf_if_addr; 

bpf_hdr(Packet Header): 
struct bpf_hdr { 
// 捕获到的packet的timestamp: 
struct timeval bh_tstamp; 
// 捕获到的packet的长度: 
UINT bh_caplen; 
// 原始packet的长度: 
UINT bh_datalen; 
// bpf header的长度(this struct plus alignment padding): 
USHORT bh_hdrlen; 
}; 

bpf_insn(一个简单的BPF伪指令): 
bpf_insn中包含了一个BPF注册机的简单指令,它被用来发送一个filter程序给driver。 
struct bpf_insn { 
// 指令的类型和寻址模式: 
USHORT code; 
// Jump if true: 
UCHAR jt; 
// Jump if false: 
UCHAR jf; 
// 通用的一个字段,有多种目的: 
int k; 
}; 

bpf_program(一个BPF伪汇编程序): 
这段程序将被PacketSetBPF()注射入内核,并被应用到每一个进来的Packet。 
struct bpf_program { 
// 程序指令数目,如,后面的bpf_insn结构的数目: 
UINT bf_len; 
// 指向第一个bpf_insn结构的指针: 
struct bpf_insn *bf_insns; 
}; 

bpf_stat (本次捕获的统计数据): 
这个结构将被Packet.dll用来返回捕获过程中的统计数据。 
struct bpf_stat { 
// 从开始捕获起,这个driver从网卡上接收的Packet的数量(包括driver丢失的Packet): 
UINT bs_recv; 
//从开始捕获起,这个driver丢失的Packet的数量,一般地,包丢失,是因为driver的缓冲区满了,这时driver将扔掉这个包: 
UINT bs_drop; 
UINT ps_ifdrop; 
// 通过filter的包的数量: 
UINT bs_capt; 
}; 

dump_bpf_hdr(Dump Packet Header): 
struct dump_bpf_hdr{ 
// Packet的timestamp: 
struct timeval ts; 
// 捕获到的packet的长度: 
UINT caplen; 
// 原始Packet的长度: 
UINT len; 
}; 

NetType (网络类型): 
NetType用于PacketGetNetType(),返回当前网卡的类型和速度。 
struct NetType{ 
//当前网卡的MAC: 
UINT LinkType; 
// 网络的速度(bits/s): 
UINT LinkSpeed; 
}; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值