www.pudn.com > Ó²ÅÌµÄ¼à¿Ø.rar > fspyKern.h
/*++
Copyright (c) 1989-1999 Microsoft Corporation
Module Name:
filespyKernel.h
Abstract:
Header file which contains the structures, type definitions,
constants, global variables and function prototypes that are
only visible within the kernel.
Author:
Environment:
Kernel mode
Revision History:
--*/
#ifndef __FSPYKERN_H__
#define __FSPYKERN_H__
// #undef DBG
// #define DBG 1 //do not force debug on
#if DBG
#define DBGSTATIC
#undef ASSERTMSG
#define ASSERTMSG(msg,exp) \
if (!(exp)) { \
extern PBOOLEAN KdDebuggerEnabled; \
DbgPrint("%s:%d %s %s\n",__FILE__,__LINE__,msg,#exp); \
if (*KdDebuggerEnabled) { \
DbgBreakPoint(); \
} \
}
#undef ASSERT
#define ASSERT(exp) \
((!(exp)) ? \
DbgPrint("%s:%d %s\n",__FILE__,__LINE__,#exp),DbgBreakPoint(),FALSE : \
TRUE)
#else
#define DBGSTATIC // static
#undef ASSERTMSG
#define ASSERTMSG(msg,exp) ((void)0)
#undef ASSERT
#define ASSERT(exp) (TRUE)
#endif // DBG
#define MSFM_TAG 'YPSF' // memory allocation tag value
#define USE_LOOKASIDE_LIST 0 // do NOT use look aside lists (use Allocate Pool)
#ifndef INVALID_HANDLE_VALUE
#define INVALID_HANDLE_VALUE (HANDLE) -1
#endif
#define HASH_SIZE 128 // MUST be a power of 2
#define HASH_FUNC(FileObject) \
(((UINT_PTR)(FileObject) >> 8) & (HASH_SIZE - 1))
typedef struct _HASH_ENTRY {
LIST_ENTRY List;
PFILE_OBJECT FileObject;
UNICODE_STRING Name;
} HASH_ENTRY, *PHASH_ENTRY;
//
// Define the device extension structure that the FileSpy driver
// adds to each device object it is attached to. It stores
// the context FileSpy needs to perform its logging operations on
// a device.
//
typedef struct _DEVICE_EXTENSION {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT NextDriverDeviceObject; // device object we are attached to
BOOLEAN LogThisDevice;
LIST_ENTRY NextDevice; // linked list of devices we are
// attached to
UNICODE_STRING DeviceName; // receives name of device
WCHAR NameBuffer[DEVICE_NAME_SZ]; // holds actual device name
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
typedef enum _CONTROL_DEVICE_STATE {
OPENED,
CLOSED,
CLEANING_UP
} CONTROL_DEVICE_STATE;
//---------------------------------------------------------------------------
// Global variables
//---------------------------------------------------------------------------
extern FAST_MUTEX gSpyDeviceExtensionListLock;
extern LIST_ENTRY gSpyDeviceExtensionList;
extern KSPIN_LOCK gOutputBufferLock;
extern LIST_ENTRY gOutputBufferList;
extern NPAGED_LOOKASIDE_LIST gFreeBufferList;
extern ULONG gLogSequenceNumber;
extern KSPIN_LOCK gLogSequenceLock;
extern CONTROL_DEVICE_STATE gControlDeviceState;
extern KSPIN_LOCK gControlDeviceStateLock;
extern UNICODE_STRING gVolumeString;
extern UNICODE_STRING gOverrunString;
extern UNICODE_STRING gPagingIoString;
extern LIST_ENTRY gHashTable[HASH_SIZE];
extern KSPIN_LOCK gHashLockTable[HASH_SIZE];
extern ULONG gHashMaxCounters[HASH_SIZE];
extern ULONG gHashCurrentCounters[HASH_SIZE];
extern HASH_STATISTICS gHashStat;
#define DEFAULT_MAX_RECORDS_TO_ALLOCATE 100;
#define DEFAULT_MAX_NAMES_TO_ALLOCATE 100;
#define MAX_RECORDS_TO_ALLOCATE L"MaxRecords"
#define MAX_NAMES_TO_ALLOCATE L"MaxNames"
#define ATTACH_TO L"Attach" // multi-sz containing drives to attach to at reinit time
#define ATTACH_BUFFER_SIZE 512
extern LONG gMaxRecordsToAllocate;
extern LONG gRecordsAllocated;
extern LONG gMaxNamesToAllocate;
extern LONG gNamesAllocated;
extern LONG gStaticBufferInUse;
extern CHAR gOutOfMemoryBuffer[RECORD_SIZE];
#define MINIMUM(a, b) ((a) < (b) ? (a) : (b))
#define MAXIMUM(a, b) ((a) > (b) ? (a) : (b))
// Returns the number of BYTES unused in the RECORD_LIST structure
#define REMAINING_NAME_SPACE(RecordList) \
(USHORT)(RECORD_SIZE - \
(((RecordList)->LogRecord.Length) + sizeof(LIST_ENTRY)))
// The maximum number of BYTES that can be used to store the file name in the
// RECORD_LIST structure
#define MAX_NAME_SPACE (RECORD_SIZE - sizeof(RECORD_LIST))
//
// Define driver entry routine.
//
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
#ifdef SPY_BOOT_DRIVER
VOID
SpyReinitDriver(
PDRIVER_OBJECT DriverObject,
PVOID Context,
ULONG Count
);
#endif
/***********************************************************
Prototypes for the routines this driver uses to filter
the data that is being seen by the file systems.
Implementation in FileSpy.c
************************************************************/
DBGSTATIC
NTSTATUS
SpyDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
DBGSTATIC
NTSTATUS
SpyPassThrough(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
DBGSTATIC
NTSTATUS
SpyPassThroughCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
DBGSTATIC
NTSTATUS
SpyCreate(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
DBGSTATIC
BOOLEAN
SpyFastIoCheckIfPossible(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
IN BOOLEAN CheckForReadOperation,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoRead(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
OUT PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoWrite(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
IN PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoQueryBasicInfo(
IN PFILE_OBJECT FileObject,
IN BOOLEAN Wait,
OUT PFILE_BASIC_INFORMATION Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoQueryStandardInfo(
IN PFILE_OBJECT FileObject,
IN BOOLEAN Wait,
OUT PFILE_STANDARD_INFORMATION Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoLock(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN PLARGE_INTEGER Length,
PEPROCESS ProcessId,
ULONG Key,
BOOLEAN FailImmediately,
BOOLEAN ExclusiveLock,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoUnlockSingle(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN PLARGE_INTEGER Length,
PEPROCESS ProcessId,
ULONG Key,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoUnlockAll(
IN PFILE_OBJECT FileObject,
PEPROCESS ProcessId,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoUnlockAllByKey(
IN PFILE_OBJECT FileObject,
PVOID ProcessId,
ULONG Key,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoDeviceControl(
IN PFILE_OBJECT FileObject,
IN BOOLEAN Wait,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength,
IN ULONG IoControlCode,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
VOID
SpyFastIoDetachDevice(
IN PDEVICE_OBJECT SourceDevice,
IN PDEVICE_OBJECT TargetDevice
);
DBGSTATIC
BOOLEAN
SpyFastIoQueryNetworkOpenInfo(
IN PFILE_OBJECT FileObject,
IN BOOLEAN Wait,
OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
NTSTATUS
SpyFastIoAcquireForModWrite(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER EndingOffset,
OUT PERESOURCE *ResourceToRelease,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoMdlRead(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN ULONG LockKey,
OUT PMDL *MdlChain,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoMdlReadComplete(
IN PFILE_OBJECT FileObject,
IN PMDL MdlChain,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoPrepareMdlWrite(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN ULONG LockKey,
OUT PMDL *MdlChain,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoMdlWriteComplete(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN PMDL MdlChain,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoReadCompressed(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN ULONG LockKey,
OUT PVOID Buffer,
OUT PMDL *MdlChain,
OUT PIO_STATUS_BLOCK IoStatus,
OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
IN ULONG CompressedDataInfoLength,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoWriteCompressed(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN ULONG LockKey,
IN PVOID Buffer,
OUT PMDL *MdlChain,
OUT PIO_STATUS_BLOCK IoStatus,
IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
IN ULONG CompressedDataInfoLength,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoMdlReadCompleteCompressed(
IN PFILE_OBJECT FileObject,
IN PMDL MdlChain,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoMdlWriteCompleteCompressed(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN PMDL MdlChain,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
BOOLEAN
SpyFastIoQueryOpen(
IN PIRP Irp,
OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
NTSTATUS
SpyFastIoReleaseForModWrite(
IN PFILE_OBJECT FileObject,
IN PERESOURCE ResourceToRelease,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
NTSTATUS
SpyFastIoAcquireForCcFlush(
IN PFILE_OBJECT FileObject,
IN PDEVICE_OBJECT DeviceObject
);
DBGSTATIC
NTSTATUS
SpyFastIoReleaseForCcFlush(
IN PFILE_OBJECT FileObject,
IN PDEVICE_OBJECT DeviceObject
);
/***********************************************
Memory allocation routines
Implementation in msfmlib.c
***********************************************/
DBGSTATIC
PVOID
SpyAllocateBuffer(
IN OUT PLONG Counter,
IN LONG MaxCounterValue,
OUT PULONG RecordType
);
DBGSTATIC
VOID
SpyFreeBuffer(
PVOID Buffer,
PLONG Counter
);
/***********************************************
Logging routines
Implementation in msfmlib.c
***********************************************/
DBGSTATIC
PRECORD_LIST
SpyNewRecord(
ULONG AssignedSequenceNumber
);
DBGSTATIC
VOID
SpyFreeRecord(
PRECORD_LIST Record
);
DBGSTATIC
VOID
SpyLogIrp(
IN PIRP Irp,
IN UCHAR LoggingFlags,
OUT PRECORD_LIST RecordList
);
DBGSTATIC
PRECORD_LIST
SpyLogFastIoStart(
IN FASTIO_TYPE FastIoType,
IN UCHAR LoggingFlags,
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait
);
DBGSTATIC
VOID
SpyLogFastIoComplete(
IN UCHAR LoggingFlags,
IN PFILE_OBJECT FileObject,
IN PIO_STATUS_BLOCK ReturnStatus,
IN PRECORD_LIST RecordList
);
DBGSTATIC
NTSTATUS
SpyLog(
IN PRECORD_LIST NewRecord
);
DBGSTATIC
USHORT
SpyGetFullPathName(
IN PFILE_OBJECT FileObject,
IN PCHAR FileName,
IN USHORT Length,
IN PUNICODE_STRING VolumeName,
IN ULONG LookupFlags
);
DBGSTATIC
VOID
SpyNameDelete(
IN PFILE_OBJECT FileObject
);
DBGSTATIC
USHORT
SpyNameLookup(
IN PRECORD_LIST RecordList,
IN PFILE_OBJECT FileObject,
IN ULONG LookupFlags,
IN PUNICODE_STRING VolumeName
);
/***********************************************
FileName cache routines
Implementation in msfmlib.c
***********************************************/
DBGSTATIC
PHASH_ENTRY
SpyHashBucketLookup(
PLIST_ENTRY ListHead,
PFILE_OBJECT FileObject
);
DBGSTATIC
VOID
SpyNameDeleteAllNames(
VOID
);
/***********************************************
Library support routines
Implementation in msfmlib.c
***********************************************/
DBGSTATIC
VOID
SpyReadDriverParameters(
IN PUNICODE_STRING RegistryPath,
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
SpyAttachDevice(
PDEVICE_OBJECT DeviceObject,
PWSTR DeviceName
);
NTSTATUS
SpyDetachDevice(
PWSTR deviceName
);
NTSTATUS
SpyGetAttachList(
PVOID buffer,
ULONG bufferSize,
PULONG_PTR returnLength
);
VOID
SpyGetLog(
OUT PVOID OutputBuffer,
IN ULONG OutputBufferLength,
OUT PIO_STATUS_BLOCK IoStatus
);
DBGSTATIC
VOID
SpyCloseControlDevice(
);
#endif /* __MFKRNL_H__ */