監聽乙太網(三) Packet32資料結構說明 (轉)

worldblog發表於2007-12-12
監聽乙太網(三) Packet32資料結構說明 (轉)[@more@]

乙太網(三) Packet32資料結構說明:namespace prefix = o ns = "urn:schemas--com::office" />

Article last modified on 2002-9-17

The information in this article applies to:

--Microsoft WindwNTx

--- Microsoft Windwos 9x

--WinPcap: the Free Packet Capture Architecture for

 

 Packet32包中的資料結構:

第一個重要的資料結構:_ADAPTER(關work Adapter的)

typedef struct _ADAPTER 

{

   // 一個開啟的NPF 例項的控制程式碼:

  HANDLE hFile; 

   // 當前開啟的的名字:

  CHAR  SymbolicLink[MAX_LINK_NAME_LENGTH];

   // 在這塊Adapter上,一個資料包被寫的次數:

  int NumWrites;

// 這塊Adapter上的read操作的通知事件。它可以被傳遞給標準(如WaitForSingle或者WaitForMultipleObjects),這樣可以等待到driver的緩衝區內有資料到來。在同時等待幾個事件的GUI中,它特別有用。在/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()函式接收到的位元組數:

  D  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;    //  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 to:zhengyun@tomosoft.com">zhengyun@tomosoft.com

 

本文件所包含的資訊代表了在釋出之日,ZhengYun 對所討論問題的當前看法,Zhengyun 不保證所給資訊在釋出之日以後的準確性。

本文件僅供參考。對本文件中的資訊,Zhengyun 不做任何明示或默示的保證。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991783/,如需轉載,請註明出處,否則將追究法律責任。

相關文章