📄 filter.h
字号:
/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
Filter.h
Abstract:
This module contains all prototypes and macros for filter code.
Revision History:
Who When What
-------- -------- ----------------------------------------------
Notes:
--*/
#ifndef _FILT_H
#define _FILT_H
#define FILTER_REQUEST_ID 'RTLF'
#define FILTER_MAJOR_NDIS_VERSION 6
#define FILTER_MINOR_NDIS_VERSION 0
#define MAX_PACKET_POOL_SIZE 0x0000FFFF
#define MIN_PACKET_POOL_SIZE 0x000000FF
#define PROTOCOL_RESERVED 4
//
// Flags for filter's state
//
#define FILTER_PAUSING 0x00000001
#define FILTER_PAUSED 0x00000002
#define FILTER_DETACHING 0x00000004
#define FILTER_ATTACHED 0x00000008
#define FILTER_RUNNING 0x00000010
#define FILTER_ALLOC_TAG 'tliF'
#define FILTER_TAG 'dnTF'
//
// Global variables
//
extern NDIS_HANDLE FilterDriverHandle; // NDIS handle for filter driver
extern NDIS_HANDLE FilterDriverObject;
extern NDIS_HANDLE NdisFilterDeviceHandle;
extern PDEVICE_OBJECT DeviceObject;
extern FILTER_LOCK FilterListLock;
extern LIST_ENTRY FilterModuleList;
extern PWCHAR InstanceStrings;
#if NDISLWF
#define FILTER_FRIENDLY_NAME L"NDIS Sample LightWeight Filter"
#define FILTER_UNIQUE_NAME L"{5cbf81bd-5055-47cd-9055-a76b2b4e3697}" //unique name, quid name
#define FILTER_SERVICE_NAME L"NDISLWF"
//
// The filter needs to handle IOCTRLs
//
#define LINKNAME_STRING L"\\DosDevices\\NDISLWF"
#define NTDEVICE_STRING L"\\Device\\NDISLWF"
#endif
#if NDISLWF1
#define FILTER_FRIENDLY_NAME L"NDIS Sample LightWeight Filter 1"
#define FILTER_UNIQUE_NAME L"{5cbf81be-5055-47cd-9055-a76b2b4e3697}" //unique name, quid name
#define FILTER_SERVICE_NAME L"NDISLWF1"
//
// The filter needs to handle IOCTRLs
//
#define LINKNAME_STRING L"\\DosDevices\\NDISLWF1"
#define NTDEVICE_STRING L"\\Device\\NDISLWF1"
#endif
#if NDISMON
#define FILTER_FRIENDLY_NAME L"NDIS Sample Monitor LightWeight Filter"
#define FILTER_UNIQUE_NAME L"{5cbf81bf-5055-47cd-9055-a76b2b4e3697}" //unique name, quid name
#define FILTER_SERVICE_NAME L"NDISMON"
//
// The filter needs to handle IOCTRLs
//
#define LINKNAME_STRING L"\\DosDevices\\NDISMON"
#define NTDEVICE_STRING L"\\Device\\NDISMON"
#endif
#if NDISMON1
#define FILTER_FRIENDLY_NAME L"NDIS Sample Monitor 1 LightWeight Filter"
#define FILTER_UNIQUE_NAME L"{5cbf81c0-5055-47cd-9055-a76b2b4e3697}" //unique name, quid name
#define FILTER_SERVICE_NAME L"NDISMON1"
//
// The filter needs to handle IOCTRLs
//
#define LINKNAME_STRING L"\\DosDevices\\NDISMON1"
#define NTDEVICE_STRING L"\\Device\\NDISMON1"
#endif
//
// Types and macros to manipulate packet queue
//
typedef struct _QUEUE_ENTRY
{
struct _QUEUE_ENTRY * Next;
}QUEUE_ENTRY, *PQUEUE_ENTRY;
typedef struct _QUEUE_HEADER
{
PQUEUE_ENTRY Head;
PQUEUE_ENTRY Tail;
} QUEUE_HEADER, PQUEUE_HEADER;
#if TRACK_RECEIVES
UINT filterLogReceiveRefIndex = 0;
ULONG_PTR filterLogReceiveRef[0x10000];
#endif
#if TRACK_SENDS
UINT filterLogSendRefIndex = 0;
ULONG_PTR filterLogSendRef[0x10000];
#endif
#if TRACK_RECEIVES
#define FILTER_LOG_RCV_REF(_O, _Instance, _NetBufferList, _Ref) \
{\
filterLogReceiveRef[filterLogReceiveRefIndex++] = (ULONG_PTR)(_O); \
filterLogReceiveRef[filterLogReceiveRefIndex++] = (ULONG_PTR)(_Instance); \
filterLogReceiveRef[filterLogReceiveRefIndex++] = (ULONG_PTR)(_NetBufferList); \
filterLogReceiveRef[filterLogReceiveRefIndex++] = (ULONG_PTR)(_Ref); \
if (filterLogReceiveRefIndex >= (0x10000 - 5)) \
{ \
filterLogReceiveRefIndex = 0; \
} \
}
#else
#define FILTER_LOG_RCV_REF(_O, _Instance, _NetBufferList, _Ref)
#endif
#if TRACK_SENDS
#define FILTER_LOG_SEND_REF(_O, _Instance, _NetBufferList, _Ref) \
{\
filterLogSendRef[filterLogSendRefIndex++] = (ULONG_PTR)(_O); \
filterLogSendRef[filterLogSendRefIndex++] = (ULONG_PTR)(_Instance); \
filterLogSendRef[filterLogSendRefIndex++] = (ULONG_PTR)(_NetBufferList); \
filterLogSendRef[filterLogSendRefIndex++] = (ULONG_PTR)(_Ref); \
if (filterLogSendRefIndex >= (0x10000 - 5)) \
{ \
filterLogSendRefIndex = 0; \
} \
}
#else
#define FILTER_LOG_SEND_REF(_O, _Instance, _NetBufferList, _Ref)
#endif
//
// DEBUG related macros.
//
#if DBG
#define FILTER_ALLOC_MEM(_NdisHandle, _Size) \
filterAuditAllocMem( \
_NdisHandle, \
_Size, \
__FILENUMBER, \
__LINE__);
#define FILTER_FREE_MEM(_pMem) \
filterAuditFreeMem(_pMem);
#else
#define FILTER_ALLOC_MEM(_NdisHandle, _Size) \
NdisAllocateMemoryWithTagPriority(_NdisHandle, _Size, FILTER_ALLOC_TAG, LowPoolPriority)
#define FILTER_FREE_MEM(_pMem) NdisFreeMemory(_pMem, 0, 0)
#endif //DBG
#if DBG_SPIN_LOCK
#define FILTER_INIT_LOCK(_pLock) \
filterAllocateSpinLock(_pLock, __FILENUMBER, __LINE__)
#define FILTER_FREE_LOCK(_pLock) filterFreeSpinLock(_pLock)
#define FILTER_ACQUIRE_LOCK(_pLock, DispatchLevel) \
filterAcquireSpinLock(_pLock, __FILENUMBER, __LINE__, DisaptchLevel)
#define FILTER_RELEASE_LOCK(_pLock, DispatchLevel) \
filterReleaseSpinLock(_pLock, __FILENUMBER, __LINE__, DispatchLevel)
#else
#define FILTER_INIT_LOCK(_pLock) NdisAllocateSpinLock(_pLock)
#define FILTER_FREE_LOCK(_pLock) NdisFreeSpinLock(_pLock)
#define FILTER_ACQUIRE_LOCK(_pLock, DispatchLevel) \
{ \
if (DispatchLevel) \
{ \
NdisDprAcquireSpinLock(_pLock); \
} \
else \
{ \
NdisAcquireSpinLock(_pLock); \
} \
}
#define FILTER_RELEASE_LOCK(_pLock, DispatchLevel) \
{ \
if (DispatchLevel) \
{ \
NdisDprReleaseSpinLock(_pLock); \
} \
else \
{ \
NdisReleaseSpinLock(_pLock); \
} \
}
#endif //DBG_SPIN_LOCK
#define NET_BUFFER_LIST_LINK_TO_ENTRY(_pNBL) ((PQUEUE_ENTRY)(NET_BUFFER_LIST_NEXT_NBL(_pNBL)))
#define ENTRY_TO_NET_BUFFER_LIST(_pEnt) (CONTAINING_RECORD((_pEnt), NET_BUFFER_LIST, Next))
#define InitializeQueueHeader(_QueueHeader) \
{ \
(_QueueHeader)->Head = (_QueueHeader)->Tail = NULL; \
}
//
// Macros for queue operations
//
#define IsQueueEmpty(_QueueHeader) ((_QueueHeader)->Head == NULL)
#define RemoveHeadQueue(_QueueHeader) \
(_QueueHeader)->Head; \
{ \
PQUEUE_ENTRY pNext; \
ASSERT((_QueueHeader)->Head); \
pNext = (_QueueHeader)->Head->Next; \
(_QueueHeader)->Head = pNext; \
if (pNext == NULL) \
(_QueueHeader)->Tail = NULL; \
}
#define InsertHeadQueue(_QueueHeader, _QueueEntry) \
{ \
((PQUEUE_ENTRY)(_QueueEntry))->Next = (_QueueHeader)->Head; \
(_QueueHeader)->Head = (PQUEUE_ENTRY)(_QueueEntry); \
if ((_QueueHeader)->Tail == NULL) \
(_QueueHeader)->Tail = (PQUEUE_ENTRY)(_QueueEntry); \
}
#define InsertTailQueue(_QueueHeader, _QueueEntry) \
{ \
((PQUEUE_ENTRY)(_QueueEntry))->Next = NULL; \
if ((_QueueHeader)->Tail) \
(_QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(_QueueEntry); \
else \
(_QueueHeader)->Head = (PQUEUE_ENTRY)(_QueueEntry); \
(_QueueHeader)->Tail = (PQUEUE_ENTRY)(_QueueEntry); \
}
//
// Enum of filter's states
// Filter can only be in one state at one time
//
typedef enum _FILTER_STATE
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -