监听以太网(三) Packet32数据结构说明
生活随笔
收集整理的這篇文章主要介紹了
监听以太网(三) Packet32数据结构说明
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Packet32包中的數(shù)據(jù)結(jié)構(gòu):?
第一個重要的數(shù)據(jù)結(jié)構(gòu):_ADAPTER(關(guān)于Network Adapter的)?
typedef struct _ADAPTER?
{?
// 一個打開的NPF driver實例的句柄:?
HANDLE hFile;?
// 當前打開的網(wǎng)卡的名字:?
CHAR SymbolicLink[MAX_LINK_NAME_LENGTH];?
// 在這塊Adapter上,一個數(shù)據(jù)包被寫的次數(shù):?
int NumWrites;?
// 這塊Adapter上的read操作的通知事件。它可以被傳遞給標準Win32函數(shù)(如WaitForSingleObject或者WaitForMultipleObjects),?
// 這樣可以等待到driver的緩沖區(qū)內(nèi)有數(shù)據(jù)到來。在同時等待幾個事件的GUI程序中,它特別有用。在Windows2000/XP中,?
// 函數(shù)PacketSetMinToCopy()可以用來設(shè)置內(nèi)核緩沖區(qū)中激發(fā)本事件的最小數(shù)據(jù)大小:?
HANDLE ReadEvent;?
// 設(shè)置一個時間,到時候,即使沒有捕獲任何包,read操作也會被釋放,ReadEvent也會被觸發(fā):?
UINT ReadTimeOut;?
} ADAPTER, *LPADAPTER;?
第二個重要的數(shù)據(jù)結(jié)構(gòu):_PACKET(關(guān)于Packet的) typedef struct _PACKET?
{?
// 向后兼容用的:?
HANDLE hEvent;?
// 向后兼容用的:?
OVERLAPPED OverLapped;?
// 存放Packets的緩沖區(qū):?
PVOID Buffer;?
// 緩沖區(qū)的大小:?
UINT Length;?
// 當前緩沖區(qū)中有效的字節(jié)數(shù),如,上一次調(diào)用PacketReceivePacket()函數(shù)接收到的字節(jié)數(shù):?
DWORD ulBytesReceived;?
// 向后兼容用的:?
BOOLEAN bIoComplete?
} PACKET, *LPPACKET;?
第三個重要的數(shù)據(jù)結(jié)構(gòu):_PACKET_OID_DATA (關(guān)于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;?
// 存放發(fā)送給網(wǎng)卡或者從網(wǎng)卡接收的數(shù)據(jù)的緩沖區(qū):?
UCHAR Data[1];?
}?
typedef struct _PACKET_OID_DATA ?PACKET_OID_DATA, *PPACKET_OID_DATA;?
其他數(shù)據(jù)結(jié)構(gòu): npf_if_addr(網(wǎng)卡的地址):?
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注冊機的簡單指令,它被用來發(fā)送一個filter程序給driver。?
struct bpf_insn {?
// 指令的類型和尋址模式:?
USHORT code;?
// Jump if true:?
UCHAR jt;?
// Jump if false:?
UCHAR jf;?
// 通用的一個字段,有多種目的:?
int k;?
};?
bpf_program(一個BPF偽匯編程序):?
這段程序?qū)⒈籔acketSetBPF()注射入內(nèi)核,并被應(yīng)用到每一個進來的Packet。?
struct bpf_program {?
// 程序指令數(shù)目,如,后面的bpf_insn結(jié)構(gòu)的數(shù)目:?
UINT bf_len;?
// 指向第一個bpf_insn結(jié)構(gòu)的指針:?
struct bpf_insn *bf_insns;?
};?
bpf_stat (本次捕獲的統(tǒng)計數(shù)據(jù)):?
這個結(jié)構(gòu)將被Packet.dll用來返回捕獲過程中的統(tǒng)計數(shù)據(jù)。?
struct bpf_stat {?
// 從開始捕獲起,這個driver從網(wǎng)卡上接收的Packet的數(shù)量(包括driver丟失的Packet):?
UINT bs_recv;?
//從開始捕獲起,這個driver丟失的Packet的數(shù)量,一般地,包丟失,是因為driver的緩沖區(qū)滿了,這時driver將扔掉這個包:?
UINT bs_drop;?
UINT ps_ifdrop;?
// 通過filter的包的數(shù)量:?
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 (網(wǎng)絡(luò)類型):?
NetType用于PacketGetNetType(),返回當前網(wǎng)卡的類型和速度。?
struct NetType{?
//當前網(wǎng)卡的MAC:?
UINT LinkType;?
// 網(wǎng)絡(luò)的速度(bits/s):?
UINT LinkSpeed;?
};?
第一個重要的數(shù)據(jù)結(jié)構(gòu):_ADAPTER(關(guān)于Network Adapter的)?
typedef struct _ADAPTER?
{?
// 一個打開的NPF driver實例的句柄:?
HANDLE hFile;?
// 當前打開的網(wǎng)卡的名字:?
CHAR SymbolicLink[MAX_LINK_NAME_LENGTH];?
// 在這塊Adapter上,一個數(shù)據(jù)包被寫的次數(shù):?
int NumWrites;?
// 這塊Adapter上的read操作的通知事件。它可以被傳遞給標準Win32函數(shù)(如WaitForSingleObject或者WaitForMultipleObjects),?
// 這樣可以等待到driver的緩沖區(qū)內(nèi)有數(shù)據(jù)到來。在同時等待幾個事件的GUI程序中,它特別有用。在Windows2000/XP中,?
// 函數(shù)PacketSetMinToCopy()可以用來設(shè)置內(nèi)核緩沖區(qū)中激發(fā)本事件的最小數(shù)據(jù)大小:?
HANDLE ReadEvent;?
// 設(shè)置一個時間,到時候,即使沒有捕獲任何包,read操作也會被釋放,ReadEvent也會被觸發(fā):?
UINT ReadTimeOut;?
} ADAPTER, *LPADAPTER;?
第二個重要的數(shù)據(jù)結(jié)構(gòu):_PACKET(關(guān)于Packet的) typedef struct _PACKET?
{?
// 向后兼容用的:?
HANDLE hEvent;?
// 向后兼容用的:?
OVERLAPPED OverLapped;?
// 存放Packets的緩沖區(qū):?
PVOID Buffer;?
// 緩沖區(qū)的大小:?
UINT Length;?
// 當前緩沖區(qū)中有效的字節(jié)數(shù),如,上一次調(diào)用PacketReceivePacket()函數(shù)接收到的字節(jié)數(shù):?
DWORD ulBytesReceived;?
// 向后兼容用的:?
BOOLEAN bIoComplete?
} PACKET, *LPPACKET;?
第三個重要的數(shù)據(jù)結(jié)構(gòu):_PACKET_OID_DATA (關(guān)于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;?
// 存放發(fā)送給網(wǎng)卡或者從網(wǎng)卡接收的數(shù)據(jù)的緩沖區(qū):?
UCHAR Data[1];?
}?
typedef struct _PACKET_OID_DATA ?PACKET_OID_DATA, *PPACKET_OID_DATA;?
其他數(shù)據(jù)結(jié)構(gòu): npf_if_addr(網(wǎng)卡的地址):?
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注冊機的簡單指令,它被用來發(fā)送一個filter程序給driver。?
struct bpf_insn {?
// 指令的類型和尋址模式:?
USHORT code;?
// Jump if true:?
UCHAR jt;?
// Jump if false:?
UCHAR jf;?
// 通用的一個字段,有多種目的:?
int k;?
};?
bpf_program(一個BPF偽匯編程序):?
這段程序?qū)⒈籔acketSetBPF()注射入內(nèi)核,并被應(yīng)用到每一個進來的Packet。?
struct bpf_program {?
// 程序指令數(shù)目,如,后面的bpf_insn結(jié)構(gòu)的數(shù)目:?
UINT bf_len;?
// 指向第一個bpf_insn結(jié)構(gòu)的指針:?
struct bpf_insn *bf_insns;?
};?
bpf_stat (本次捕獲的統(tǒng)計數(shù)據(jù)):?
這個結(jié)構(gòu)將被Packet.dll用來返回捕獲過程中的統(tǒng)計數(shù)據(jù)。?
struct bpf_stat {?
// 從開始捕獲起,這個driver從網(wǎng)卡上接收的Packet的數(shù)量(包括driver丟失的Packet):?
UINT bs_recv;?
//從開始捕獲起,這個driver丟失的Packet的數(shù)量,一般地,包丟失,是因為driver的緩沖區(qū)滿了,這時driver將扔掉這個包:?
UINT bs_drop;?
UINT ps_ifdrop;?
// 通過filter的包的數(shù)量:?
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 (網(wǎng)絡(luò)類型):?
NetType用于PacketGetNetType(),返回當前網(wǎng)卡的類型和速度。?
struct NetType{?
//當前網(wǎng)卡的MAC:?
UINT LinkType;?
// 網(wǎng)絡(luò)的速度(bits/s):?
UINT LinkSpeed;?
};?
總結(jié)
以上是生活随笔為你收集整理的监听以太网(三) Packet32数据结构说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 监听以太网(二) Packet32包说明
- 下一篇: 监听以太网(四) Packet32函数S