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;
};
(To be continued)
Writen by [email protected]
本文檔所包含的信息代表了在發布之日,ZhengYun 對所討論問題的當前看法,Zhengyun 不保證所給信息在發布之日以後的准確性。
本文檔僅供參考。對本文檔中的信息,Zhengyun 不做任何明示或默示的保證。