📄 packet.h
字号:
/*
* Copyright (c) 1999 - 2003
* NetGroup, Politecnico di Torino (Italy)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Politecnico di Torino nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* and microseconds */
};
// OID definitions
#define OID_GEN_CURRENT_LOOKAHEAD 0x0001010F
// IOCTLs
#define BIOCSETBUFFERSIZE 9592
#define BIOCSETF 9030
#define BIOCGSTATS 9031
#define BIOCSRTIMEOUT 7416
#define BIOCSMODE 7412
#define BIOCSWRITEREP 7413
#define BIOATTACHPROCESS 7117
#define BIODETACHPROCESS 7118
#define BIOCEVNAME 7415
#define BIOCSETOID 2147483648
#define BIOCQUERYOID 2147483652
#define BIOCSTIMEZONE 7471
// working modes
#define MODE_CAPT 0
#define MODE_STAT 1
//
// Alignment macros. Packet_WORDALIGN rounds up to the next
// even multiple of Packet_ALIGNMENT.
//
#define Packet_ALIGNMENT sizeof(int)
#define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1))
// from BPF
struct bpf_program {
UINT bf_len;
struct bpf_insn *bf_insns;
};
// from BPF
struct bpf_insn {
USHORT code;
UCHAR jt;
UCHAR jf;
int k;
};
// from BPF
struct bpf_hdr {
struct timeval bh_tstamp; /* time stamp */
UINT bh_caplen; /* length of captured portion */
UINT bh_datalen; /* original length of packet */
USHORT bh_hdrlen; /* length of bpf header (this struct plus alignment padding) */
};
#define MAX_BUFFER_SPACE MAX_PACKET_LENGTH+sizeof(struct bpf_hdr)
#define MAX_REQUESTS 4
#ifdef DEBUG
#define PACKETASSERT(a) if( !(a) ) { DbgPrint( "Packet: ASSERTION FAILED!\r\n" ); DbgBreakPoint(); }
#else
#define PACKETASSERT(a)
#endif
struct _PACKET_RESERVED
{
LIST_ENTRY ListElement;
char* lpBuffer;
DWORD cbBuffer;
DWORD* lpcbBytesReturned;
OVERLAPPED* lpoOverlapped;
};
typedef struct _PACKET_RESERVED PACKET_RESERVED, *PPACKET_RESERVED;
struct _INTERNAL_REQUEST
{
PACKET_RESERVED Reserved;
NDIS_REQUEST Request;
};
typedef struct _INTERNAL_REQUEST INTERNAL_REQUEST, *PINTERNAL_REQUEST;
struct _OPEN_ADAPTER
{
LIST_ENTRY ListElement;
NDIS_STATUS Status;
NDIS_HANDLE AdapterHandle;
NDIS_HANDLE BindAdapterContext;
};
typedef struct _OPEN_ADAPTER OPEN_ADAPTER, *POPEN_ADAPTER;
typedef struct _OPEN_INSTANCE
{
LIST_ENTRY ListElement;
NDIS_STATUS Status;
NDIS_HANDLE AdapterHandle;
NDIS_HANDLE BindAdapterContext;
NDIS_HANDLE BufferPool;
NDIS_SPIN_LOCK RcvQSpinLock;
LIST_ENTRY RcvList;
NDIS_SPIN_LOCK RequestSpinLock;
LIST_ENTRY RequestList;
NDIS_SPIN_LOCK ResetSpinLock;
LIST_ENTRY ResetIrpList;
INTERNAL_REQUEST Requests[MAX_REQUESTS];
DWORD hDevice;
DWORD tagProcess;
NDIS_HANDLE PacketPool;
PUCHAR Buffer;
NDIS_SPIN_LOCK BufferLock;
UINT Dropped;
UINT Received;
PUCHAR bpfprogram;
UINT bpfprogramlen;
__int64 StartTime;
UINT Bhead;
UINT Btail;
UINT BufSize;
UINT BLastByte;
UINT TimeOut;
UINT ReadTimeoutTimer;
int mode;
__int64 Nbytes;
__int64 Npackets;
NDIS_SPIN_LOCK CountersLock;
UINT Nwrites;
UINT Multiple_Write_Counter;
DWORD ReadEvent;
} OPEN_INSTANCE, *POPEN_INSTANCE;
typedef struct ADAPTER_NAME
{
LIST_ENTRY ListElement;
char realname[32];
char devicename[32];
NDIS_STRING realnamestr;
}ADAPTER_NAME, *PADAPTER_NAME;
struct _DEVICE_EXTENSION
{
PDRIVER_OBJECT DriverObject;
NDIS_HANDLE NdisProtocolHandle;
LIST_ENTRY OpenList;
NDIS_SPIN_LOCK OpenSpinLock;
LIST_ENTRY AdapterNames;
};
typedef struct _DEVICE_EXTENSION DEVICE_EXTENSION, *PDEVICE_EXTENSION;
extern PDEVICE_EXTENSION GlobalDeviceExtension;
#define ETHERNET_HEADER_LENGTH 14
#define RESERVED(_p) ((PPACKET_RESERVED)((_p)->ProtocolReserved))
#define TRANSMIT_PACKETS 32
extern void YieldExecution( void );
DWORD Bind_Names(void);
VOID _cdecl ReadTimeout(void);
__int64 QuerySystemTime(void);
LARGE_INTEGER GetDate(void);
void EchoStr(void);
int bpf_validate(struct bpf_insn *f,int len);
UINT bpf_filter(register struct bpf_insn *pc,
register UCHAR *p,
UINT wirelen,
register UINT buflen);
UINT bpf_filter_with_2_buffers(register struct bpf_insn *pc,
register UCHAR *p,
register UCHAR *pd,
register int headersize,
UINT wirelen,
register UINT buflen);
PLIST_ENTRY
PacketRemoveHeadList(
IN PLIST_ENTRY pListHead
);
VOID NDIS_API
PacketOpenAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus
);
VOID NDIS_API
PacketUnbindAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status
);
NDIS_STATUS NDIS_API
Packet_tap(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookAheadBuffer,
IN UINT LookaheadBufferSize,
IN UINT PacketSize
);
VOID NDIS_API
PacketReceiveComplete(
IN NDIS_HANDLE ProtocolBindingContext
);
DWORD
PacketRequest( POPEN_INSTANCE pOpen,
DWORD FunctionCode,
DWORD dwDDB,
DWORD hDevice,
PDIOCPARAMETERS pDiocParms
);
VOID NDIS_API
PacketRequestComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_REQUEST pRequest,
IN NDIS_STATUS Status
);
VOID NDIS_API
PacketSendComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET pPacket,
IN NDIS_STATUS Status
);
VOID
PacketReset( PNDIS_STATUS pStatus,
POPEN_INSTANCE pOpen );
VOID NDIS_API
PacketResetComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status
);
VOID NDIS_API
PacketStatus(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize
);
VOID NDIS_API
PacketStatusComplete(
IN NDIS_HANDLE ProtocolBindingContext
);
VOID
PacketAllocatePacketBuffer( PNDIS_STATUS pStatus,
POPEN_INSTANCE pOpen,
PNDIS_PACKET *lplpPacket,
PDIOCPARAMETERS pDiocParms,
DWORD FunctionCode );
VOID NDIS_API
PacketTransferDataComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status,
IN UINT BytesTransferred
);
VOID
PacketRemoveReference(
IN PDEVICE_EXTENSION DeviceExtension
);
VOID
PacketFreeResources( POPEN_INSTANCE Open );
VOID
PacketCleanUp( PNDIS_STATUS Status,
POPEN_INSTANCE Open );
NTSTATUS NDIS_API
PacketShutdown(
IN PDEVICE_OBJECT DeviceObject
);
VOID NDIS_API PacketUnload();
VOID NDIS_API
PacketBindAdapter( OUT PNDIS_STATUS Status,
IN NDIS_HANDLE BindAdapterContext,
IN PNDIS_STRING AdapterName,
IN PVOID SystemSpecific1,
IN PVOID SystemSpecific2
);
VOID NDIS_API
PacketUnbindAdapter( OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE UnbindContext
);
DWORD
PacketWrite( POPEN_INSTANCE Open,
DWORD dwDDB,
DWORD hDevice,
PDIOCPARAMETERS pDiocParms
);
DWORD PacketOpen(PNDIS_STRING AdapterName,DWORD dwDDB,DWORD hDevice,PDIOCPARAMETERS pDiocParms/*, int CloseMode*/);
DWORD
PacketClose( POPEN_INSTANCE Open,
DWORD dwDDB,
DWORD hDevice,
PDIOCPARAMETERS pDiocParms
);
DWORD
PacketRead( POPEN_INSTANCE Open,
DWORD dwDDB,
DWORD hDevice,
PDIOCPARAMETERS pDiocParms
);
DWORD _stdcall PacketIOControl( DWORD dwService,
DWORD dwDDB,
DWORD hDevice,
PDIOCPARAMETERS lpDIOCParms );
void VXDINLINE
VWIN32_DIOCCompletionRoutine( DWORD hEvent )
{
_asm mov ebx, hEvent
VxDCall( VWIN32_DIOCCompletionRoutine );
}
ULONG strlen( BYTE *s );
BYTE compare(BYTE *, BYTE *);
#define strcat( d, s ) NdisMoveMemory( d+strlen(d), s, strlen(s) )
#define memset( _S, _C, _N )\
{\
UCHAR* _pS = _S;\
ULONG _I = _N;\
while ( _I-- )\
{\
*_pS++ = _C;\
}\
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -