📄 packet32seh.pas
字号:
unit Packet32seh;
{包捕获核心驱动接口,DELPHI声明文件
作者:顾晓波
创建日期:2002-06-04
调用模块:zzpcap.dll 包捕获核心驱动接口
}
{$ALIGN ON}
interface
uses windows,u_SysInfo;
const
//copied from Ndis.h
//the following constants are to be used to direct
//the underlying NIC driver to choose which type of
//packet can be delivered to the upper bound driver,
//that is, our snoop driver.
NDIS_PACKET_TYPE_DIRECTED = $0001;
NDIS_PACKET_TYPE_MULTICAST = $0002;
NDIS_PACKET_TYPE_ALL_MULTICAST = $0004;
NDIS_PACKET_TYPE_BROADCAST = $0008;
NDIS_PACKET_TYPE_SOURCE_ROUTING = $0010;
NDIS_PACKET_TYPE_PROMISCUOUS = $0020; //for snoop
NDIS_PACKET_TYPE_SMT = $0040;
NDIS_PACKET_TYPE_MAC_FRAME = $8000;
NDIS_PACKET_TYPE_FUNCTIONAL = $4000;
NDIS_PACKET_TYPE_ALL_FUNCTIONAL = $2000;
NDIS_PACKET_TYPE_GROUP = $1000;
//
//working modes
MODE_CAPT = 0 ;
MODE_STAT = 1 ;
//ioctls
pBIOCSETBUFFERSIZE = 9592 ;
pBIOCSETF = 9030 ;
pBIOCGSTATS = 9031 ;
pBIOCSRTIMEOUT = 7416 ;
pBIOCSMODE = 7412 ;
pBIOCSWRITEREP = 7413 ;
pBIOCSMINTOCOPY = 7414 ;
pBIOCSETOID = 2147483648 ;
pBIOCQUERYOID = 2147483652 ;
pATTACHPROCESS = 7117 ;
pDETACHPROCESS = 7118 ;
pBIOCEVNAME = 7415 ;
pBIOCSTIMEZONE = 7471 ;
DOSNAMEPREFIX = 'Packet_' ;
MAX_LINK_NAME_LENGTH = 64 ;
NMAX_PACKET = 65535 ;
type
{ Jagad like to have DELPHI3/DELPHI4 defined for lisibility }
{ VER100 is automatically defined by Delphi3 compiler }
{ VER120 is automatically defined by Delphi4 compiler }
{$IFDEF VER100}
{$DEFINE DELPHI3}
{$ELSE}
{$DEFINE DELPHI4}
{$ENDIF}
{$IFDEF DELPHI3}
USLONG = LongInt;
{$ELSE}
USLONG = LongWord;
{$ENDIF}
_PACKET_OID_DATA = packed record
Oid: ULONG ;
Length: ULONG ;
Data: array[0..0] of UCHAR;
end;
PACKET_OID_DATA = _PACKET_OID_DATA ;
PPACKET_OID_DATA = ^PACKET_OID_DATA;
ADAPTER = packed record
hFile: THandle;
szAdapterName: array [0..MAX_LINK_NAME_LENGTH-1] of Char;
SymbolicLink: array [0..MAX_PATH-1] of Char;
ReadTimeOut: UINT;
ReadEvent: THandle;
NumWrites: Integer;
end;
LPADAPTER = ^ADAPTER;
PACKET = packed record
hEvent: THandle;
xOverlapped: TOVERLAPPED; // FPiette May 10, 1999
Buffer: PChar;
Length: USLONG; // FPiette May 17, 1999
ulBytesReceived: UINT ;
bIoComple: BOOLEAN;
end;
LPPACKET = ^PACKET;
//Network type structure
NetType = packed record
LinkType: UINT;
LinkSpeed: UINT;
end;
PNetType = ^NetType;
{
//some definitions from libpcap
#ifndef BPF_MAJOR_VERSION
}
Tpcap_timeval = record
tv_Sec, // Secs since 1/1/1970
tv_uSec: Integer; // microseconds
end;
Tbpf_program = record
bf_len : Cardinal;
bpf_insn : Pointer;
end;
Pbpf_program = ^Tbpf_program;
PCardinal = ^Cardinal;
bpf_insn = packed record
code: SHORT; {应该为 USHORT}
jt: UCHAR;
jf: UCHAR;
k: Integer;
end;
bpf_stat = packed record
bs_recv: UINT; (* number of packets received *)
bs_drop: UINT; (* number of packets dropped *)
end;
Pbpf_stat = ^bpf_stat;
bpf_hdr = packed record
bh_tstamp: Tpcap_timeval; (* time stamp *)
bh_caplen: UINT; (* length of captured portion *)
bh_datalen: UINT; (* original length of packet *)
bh_hdrlen: SHORT; (* 应该为 USHORT //length of bpf header (this struct
plus alignment padding) *)
end;
{#endif}
function isSehSnifferAvailable : boolean;
var
PacketSetMinToCopy:function (AdapterObject:LPADAPTER; nbytes:Integer): Boolean; stdcall;
PacketSetNumWrites:function ( AdapterObject:LPADAPTER; nwrites:Integer): Boolean; stdcall;
PacketSetMode:function ( AdapterObject:LPADAPTER; mode:Integer): Boolean; stdcall;
PacketSetMaxLookaheadsize:function ( AdapterObject:LPADAPTER): Boolean; stdcall;
PacketSetReadTimeout:function ( AdapterObject:LPADAPTER; timeout:Integer): Boolean; stdcall;
PacketSetBpf:function ( AdapterObject:LPADAPTER; fp : Pbpf_program): Boolean; stdcall;
PacketGetStats:function ( AdapterObject:LPADAPTER ; s: Pbpf_stat): Boolean; stdcall;
PacketSetBuff:function ( AdapterObject:LPADAPTER ; dim:Integer): Boolean; stdcall;
PacketGetNetType:function ( AdapterObject:LPADAPTER ; Ptype:PNetType): Boolean; stdcall;
PacketOpenAdapter : function( AdapterName:LPTSTR):LPADAPTER; stdcall;
PacketSendPacket:function ( AdapterObject:LPADAPTER ; pPacket:LPPACKET ; Sync:BOOLEAN): Boolean; stdcall;
PacketAllocatePacket : function: LPPACKET ; stdcall ;
PacketAllocateNPacket: function( n:UINT): LPPACKET ; stdcall;
PacketInitPacket:procedure ( lpPacket:LPPACKET ; Buffer:PChar ; Length:UINT); stdcall;
PacketFreePacket:procedure ( lpPacket:LPPACKET); stdcall;
PacketResetAdapter:function ( AdapterObject:LPADAPTER): Boolean; stdcall;
PacketWaitPacket:function ( AdapterObject:LPADAPTER ; lpPacket:LPPACKET): Boolean; stdcall;
PacketReceiveNPacket:function ( AdapterObject:LPADAPTER ; headLPacket:LPPACKET ; n:UINT ; length:UINT ; buffer:PBYTE ; Sync:BOOLEAN): Boolean; stdcall;
PacketReceivePacket:function ( AdapterObject:LPADAPTER ; lpPacket: LPPACKET; Sync:BOOLEAN): Boolean; stdcall;
PacketCloseAdapter:procedure ( lpAdapter:LPADAPTER); stdcall;
PacketSetHwFilter:function ( AdapterObject:LPADAPTER ; Filter:ULONG): Boolean; stdcall;
PacketGetAdapterNames:function ( pStr:LPSTR ; BufferSize:PULONG): Boolean; stdcall;
PacketGetNetInfo:function ( AdapterName:LPTSTR ; netp:PULONG ; maskp:PULONG): Boolean; stdcall;
PacketRequest:function ( AdapterObject:LPADAPTER ; PSet:BOOLEAN ; OidData:PPACKET_OID_DATA): Boolean; stdcall;
PacketSetNextPacket:procedure ( lpPacket:LPPACKET ; next:LPPACKET); stdcall;
PacketSetLengthBuffer:procedure ( lpPacket:LPPACKET ; dim:UINT); stdcall;
PacketSetLengthPacket:procedure ( lpPacket:LPPACKET ; numBytes:UINT); stdcall;
PacketGetNextPacket:function( lpPacket:LPPACKET):LPPACKET; stdcall;
implementation
var
FHandle: THandle;
// tells if we can use seh Sniffer (dll present ?, 95/98/Me ?)
function isSehSnifferAvailable : boolean;
begin
result := ((getPlatformId = VER_PLATFORM_WIN32_WINDOWS) and (FHandle <> 0));
end;
initialization
begin
FHandle := LoadLibrary('zzpcap.dll'); {包捕获核心驱动接口}
if FHandle <> 0 then
begin
@PacketSetMinToCopy := GetProcAddress(FHandle, 'PacketSetMinToCopy');
@PacketSetNumWrites := GetProcAddress(FHandle, 'PacketSetNumWrites');
@PacketSetMode := GetProcAddress(FHandle, 'PacketSetMode');
@PacketSetMaxLookaheadsize := GetProcAddress(FHandle, 'PacketSetMaxLookaheadsize');
@PacketSetReadTimeout := GetProcAddress(FHandle, 'PacketSetReadTimeout');
@PacketSetBpf := GetProcAddress(FHandle, 'PacketSetBpf');
@PacketGetStats := GetProcAddress(FHandle, 'PacketGetStats');
@PacketSetBuff := GetProcAddress(FHandle, 'PacketSetBuff');
@PacketGetNetType := GetProcAddress(FHandle, 'PacketGetNetType');
@PacketOpenAdapter := GetProcAddress(FHandle, 'PacketOpenAdapter');
@PacketSendPacket := GetProcAddress(FHandle, 'PacketSendPacket');
@PacketAllocatePacket := GetProcAddress(FHandle, 'PacketAllocatePacket');
@PacketAllocateNPacket := GetProcAddress(FHandle, 'PacketAllocateNPacket');
@PacketInitPacket := GetProcAddress(FHandle, 'PacketInitPacket');
@PacketFreePacket := GetProcAddress(FHandle, 'PacketFreePacket');
@PacketResetAdapter := GetProcAddress(FHandle, 'PacketResetAdapter');
@PacketWaitPacket := GetProcAddress(FHandle, 'PacketWaitPacket');
@PacketReceiveNPacket := GetProcAddress(FHandle, 'PacketReceiveNPacket');
@PacketReceivePacket := GetProcAddress(FHandle, 'PacketReceivePacket');
@PacketCloseAdapter := GetProcAddress(FHandle, 'PacketCloseAdapter');
@PacketSetHwFilter := GetProcAddress(FHandle, 'PacketSetHwFilter');
@PacketGetAdapterNames := GetProcAddress(FHandle, 'PacketGetAdapterNames');
@PacketGetNetInfo := GetProcAddress(FHandle, 'PacketGetNetInfo');
@PacketRequest := GetProcAddress(FHandle, 'PacketRequest');
@PacketSetNextPacket := GetProcAddress(FHandle, 'PacketSetNextPacket');
@PacketSetLengthBuffer := GetProcAddress(FHandle, 'PacketSetLengthBuffer');
@PacketSetLengthPacket := GetProcAddress(FHandle, 'PacketSetLengthPacket');
@PacketGetNextPacket := GetProcAddress(FHandle, 'PacketGetNextPacket');
end;
end;
finalization
begin
if FHandle <> 0 Then FreeLibrary(FHandle);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -