监听以太网(三) Packet32数据结构说明
生活随笔
收集整理的這篇文章主要介紹了
监听以太网(三) 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;?
};?
第一個重要的數據結構:_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;?
};?
總結
以上是生活随笔為你收集整理的监听以太网(三) Packet32数据结构说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 监听以太网(二) Packet32包说明
- 下一篇: 监听以太网(四) Packet32函数S