2012年7月5日星期四

file_system_filter_driver.cpp


//这是我精简的文件系统过滤驱动的框架,很精简,精简的不可思议,精简的有点变态,很危险,没有卸载的功能。
//在Windows xp sp3和Windows 7下测试成功,没有蓝屏等问题,测试了近百次。
//看微软的示范例子,成千上万行代码,上百kb大小,让我头大,如坠五里雾。
//微软真他妈的让程序员变傻瓜,脑残。

//至今对文件系统过滤驱动仍不是很明白,不足之处,敬请指导。
//可能文件系统过滤驱动不是最底层的,继续往底层,精细处出发。
#include <ntifs.h>

typedef struct _FSFILTER_DEVICE_EXTENSION{
  PDEVICE_OBJECT AttachedToDeviceObject;
} FSFILTER_DEVICE_EXTENSION, * PFSFILTER_DEVICE_EXTENSION;

PDRIVER_OBJECT g_fsFilterDriverObject = 0;

NTSTATUS FsFilterDispatchPassThrough(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{//全部通过
  PFSFILTER_DEVICE_EXTENSION pDevExt = (PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
  IoSkipCurrentIrpStackLocation(Irp);
  return IoCallDriver(pDevExt->AttachedToDeviceObject, Irp);
}

NTSTATUS FsFilterDispatchCreate(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{//显示文件的路径。
  PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
  DbgPrint("%wZ\n", & pFileObject->FileName);
  return FsFilterDispatchPassThrough(DeviceObject, Irp);
}

NTSTATUS FsFilterAttachToDevice(__in PDEVICE_OBJECT DeviceObject,__out_opt PDEVICE_OBJECT * pFilterDeviceObject)
{//附加设备
  PDEVICE_OBJECT filterDeviceObject = 0;
  IoCreateDevice(g_fsFilterDriverObject,sizeof(FSFILTER_DEVICE_EXTENSION),0,DeviceObject->DeviceType,0,0,& filterDeviceObject);
  PFSFILTER_DEVICE_EXTENSION pDevExt = (PFSFILTER_DEVICE_EXTENSION)filterDeviceObject->DeviceExtension;
  if (FlagOn(DeviceObject->Flags, DO_BUFFERED_IO)) SetFlag(filterDeviceObject->Flags, DO_BUFFERED_IO);
  if (FlagOn(DeviceObject->Flags, DO_DIRECT_IO)) SetFlag(filterDeviceObject->Flags, DO_DIRECT_IO);
  if (FlagOn(DeviceObject->Characteristics, FILE_DEVICE_SECURE_OPEN)) SetFlag(filterDeviceObject->Characteristics, FILE_DEVICE_SECURE_OPEN); 
  IoAttachDeviceToDeviceStackSafe(filterDeviceObject,DeviceObject,& pDevExt->AttachedToDeviceObject);
  ClearFlag(filterDeviceObject->Flags, 0x00000080); //DO_DEVICE_INITIALIZING == 0x00000080 filterDeviceObject->Flags &= ~0x00000080;
  return 0;
}

VOID FsFilterNotificationCallback(__in PDEVICE_OBJECT DeviceObject,__in BOOLEAN FsActive)
{//回调函数。
  PDEVICE_OBJECT filterDeviceObject = 0;
  FsFilterAttachToDevice(DeviceObject, & filterDeviceObject);//一下代码windows 7下不可以删除。
  ULONG numDevices = 0; 
  PDEVICE_OBJECT devList[64];
  IoEnumerateDeviceObjectList( DeviceObject->DriverObject, devList, sizeof(devList), & numDevices);
  numDevices = min(numDevices, RTL_NUMBER_OF(devList));
  for (ULONG i = 0; i < numDevices; ++i) 
  {
    if (devList[i] != DeviceObject && devList[i]->DeviceType == DeviceObject->DeviceType ) FsFilterAttachToDevice(devList[i], 0);
    ObDereferenceObject(devList[i]);
  } 
}

#include "fastio.h"

extern "C" NTSTATUS DriverEntry(__inout PDRIVER_OBJECT DriverObject,__in PUNICODE_STRING RegistryPath)
{ //驱动入口。
  //_asm int 3;
  g_fsFilterDriverObject = DriverObject; 
  for (ULONG i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; ++i) DriverObject->MajorFunction[i] = FsFilterDispatchPassThrough;
  DriverObject->MajorFunction[IRP_MJ_CREATE] = FsFilterDispatchCreate;
  DriverObject->FastIoDispatch = & g_fastIoDispatch;
  IoRegisterFsRegistrationChange(DriverObject, FsFilterNotificationCallback); 
  return STATUS_SUCCESS;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
fastio.h文件的内容如下:
#define VALID_FAST_IO_DISPATCH_HANDLER(_FastIoDispatchPtr, _FieldName) \
  (((_FastIoDispatchPtr) != NULL) && (((_FastIoDispatchPtr)->SizeOfFastIoDispatch) >= (FIELD_OFFSET(FAST_IO_DISPATCH, _FieldName) + sizeof(void *))) && ((_FastIoDispatchPtr)->_FieldName != NULL))
  
BOOLEAN FsFilterFastIoCheckIfPossible(__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)
{  
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoCheckIfPossible)) return (fastIoDispatch->FastIoCheckIfPossible)(FileObject, FileOffset, Length, Wait, LockKey, CheckForReadOperation, IoStatus, nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoRead(__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)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoRead)) return (fastIoDispatch->FastIoRead)( FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoWrite(__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)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoWrite)) return (fastIoDispatch->FastIoWrite)( FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoQueryBasicInfo(__in PFILE_OBJECT FileObject,__in BOOLEAN Wait,__out PFILE_BASIC_INFORMATION Buffer,__out PIO_STATUS_BLOCK IoStatus,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoQueryBasicInfo)) return (fastIoDispatch->FastIoQueryBasicInfo)( FileObject, Wait, Buffer, IoStatus, nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoQueryStandardInfo(__in PFILE_OBJECT FileObject,__in BOOLEAN Wait,__out PFILE_STANDARD_INFORMATION Buffer,__out PIO_STATUS_BLOCK IoStatus,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoQueryStandardInfo)) return (fastIoDispatch->FastIoQueryStandardInfo)(FileObject,Wait,Buffer,IoStatus,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoLock(__in PFILE_OBJECT FileObject,__in PLARGE_INTEGER FileOffset,__in PLARGE_INTEGER Length,__in PEPROCESS ProcessId,__in ULONG Key,__in BOOLEAN FailImmediately,__in BOOLEAN ExclusiveLock,__out PIO_STATUS_BLOCK IoStatus,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoLock)) return (fastIoDispatch->FastIoLock)(FileObject,FileOffset,Length,ProcessId,Key,FailImmediately,ExclusiveLock,IoStatus,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoUnlockSingle(__in PFILE_OBJECT FileObject,__in PLARGE_INTEGER FileOffset,__in PLARGE_INTEGER Length,__in PEPROCESS ProcessId,__in ULONG Key,__out PIO_STATUS_BLOCK IoStatus,__in PDEVICE_OBJECT DeviceObject)
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoUnlockSingle)) return (fastIoDispatch->FastIoUnlockSingle)(FileObject,FileOffset,Length,ProcessId,Key,IoStatus,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoUnlockAll(__in PFILE_OBJECT FileObject,__in PEPROCESS ProcessId,__out PIO_STATUS_BLOCK IoStatus,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoUnlockAll)) return (fastIoDispatch->FastIoUnlockAll)(FileObject,ProcessId,IoStatus,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoUnlockAllByKey(__in PFILE_OBJECT FileObject,__in PVOID ProcessId,__in ULONG Key,__out PIO_STATUS_BLOCK IoStatus,__in PDEVICE_OBJECT DeviceObject)
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoUnlockAllByKey)) return (fastIoDispatch->FastIoUnlockAllByKey)(FileObject,ProcessId,Key,IoStatus,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoDeviceControl(__in PFILE_OBJECT FileObject,__in BOOLEAN Wait,__in_opt PVOID InputBuffer,__in ULONG InputBufferLength,__out_opt PVOID OutputBuffer,__in ULONG OutputBufferLength,__in ULONG IoControlCode,__out PIO_STATUS_BLOCK IoStatus,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoDeviceControl)) return (fastIoDispatch->FastIoDeviceControl)(FileObject,Wait,InputBuffer,InputBufferLength,OutputBuffer,OutputBufferLength,IoControlCode,IoStatus,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoQueryNetworkOpenInfo(__in PFILE_OBJECT FileObject,__in BOOLEAN Wait,__out PFILE_NETWORK_OPEN_INFORMATION Buffer,__out PIO_STATUS_BLOCK IoStatus,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoQueryNetworkOpenInfo)) return (fastIoDispatch->FastIoQueryNetworkOpenInfo)(FileObject,Wait,Buffer,IoStatus,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoMdlRead(__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)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, MdlRead)) return (fastIoDispatch->MdlRead)(FileObject,FileOffset,Length,LockKey,MdlChain,IoStatus,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoMdlReadComplete(__in PFILE_OBJECT FileObject,__in PMDL MdlChain,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, MdlReadComplete)) return (fastIoDispatch->MdlReadComplete)(FileObject,MdlChain,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoPrepareMdlWrite(__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)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, PrepareMdlWrite)) return (fastIoDispatch->PrepareMdlWrite)(FileObject,FileOffset,Length,LockKey,MdlChain,IoStatus,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoMdlWriteComplete(__in PFILE_OBJECT FileObject,__in PLARGE_INTEGER FileOffset,__in PMDL MdlChain,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, MdlWriteComplete)) return (fastIoDispatch->MdlWriteComplete)(FileObject,FileOffset,MdlChain,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoReadCompressed(__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)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoReadCompressed)) return (fastIoDispatch->FastIoReadCompressed)(FileObject,FileOffset,Length,LockKey,Buffer,MdlChain,IoStatus,CompressedDataInfo,CompressedDataInfoLength,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoWriteCompressed(__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)
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoWriteCompressed)) return (fastIoDispatch->FastIoWriteCompressed)(FileObject,FileOffset,Length,LockKey,Buffer,MdlChain,IoStatus,CompressedDataInfo,CompressedDataInfoLength,nextDeviceObject );
  return FALSE;
}

BOOLEAN FsFilterFastIoMdlReadCompleteCompressed(__in PFILE_OBJECT FileObject,__in PMDL MdlChain,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, MdlReadCompleteCompressed)) return (fastIoDispatch->MdlReadCompleteCompressed)(FileObject,MdlChain,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoMdlWriteCompleteCompressed(__in PFILE_OBJECT FileObject,__in PLARGE_INTEGER FileOffset,__in PMDL MdlChain,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, MdlWriteCompleteCompressed)) return (fastIoDispatch->MdlWriteCompleteCompressed)(FileObject,FileOffset,MdlChain,nextDeviceObject);
  return FALSE;
}

BOOLEAN FsFilterFastIoQueryOpen(__in PIRP Irp,__out PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,__in PDEVICE_OBJECT DeviceObject)
{
  PDEVICE_OBJECT  nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject;
  PFAST_IO_DISPATCH fastIoDispatch  = nextDeviceObject->DriverObject->FastIoDispatch;
  if (VALID_FAST_IO_DISPATCH_HANDLER(fastIoDispatch, FastIoQueryOpen)) 
  {
    BOOLEAN result;
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp ); 
    irpSp->DeviceObject = nextDeviceObject;
    result = (fastIoDispatch->FastIoQueryOpen)(Irp,NetworkInformation,nextDeviceObject); 
    irpSp->DeviceObject = DeviceObject;
    return result;
  }
  return FALSE;
}

VOID FsFilterFastIoDetachDevice(__in PDEVICE_OBJECT SourceDevice,__in PDEVICE_OBJECT TargetDevice)
{
  IoDetachDevice(TargetDevice);
  IoDeleteDevice(SourceDevice);
}

FAST_IO_DISPATCH g_fastIoDispatch ={
  sizeof(FAST_IO_DISPATCH),
  FsFilterFastIoCheckIfPossible,
  FsFilterFastIoRead,
  FsFilterFastIoWrite,
  FsFilterFastIoQueryBasicInfo,
  FsFilterFastIoQueryStandardInfo,
  FsFilterFastIoLock,
  FsFilterFastIoUnlockSingle,
  FsFilterFastIoUnlockAll,
  FsFilterFastIoUnlockAllByKey,
  FsFilterFastIoDeviceControl,
  NULL,
  NULL,
  FsFilterFastIoDetachDevice,
  FsFilterFastIoQueryNetworkOpenInfo,
  NULL,
  FsFilterFastIoMdlRead,
  FsFilterFastIoMdlReadComplete,
  FsFilterFastIoPrepareMdlWrite,
  FsFilterFastIoMdlWriteComplete,
  FsFilterFastIoReadCompressed,
  FsFilterFastIoWriteCompressed,
  FsFilterFastIoMdlReadCompleteCompressed,
  FsFilterFastIoMdlWriteCompleteCompressed,
  FsFilterFastIoQueryOpen,
  NULL,
  NULL,
  NULL,};
/////////////////////////////////////////////
sources文件内容如下:
TARGETNAME  = FsFilter
TARGETPATH  = obj
TARGETTYPE  = DRIVER
DRIVERTYPE  = FS
SOURCES     = fsf.cpp
/////////////////////////////////////////////
makefile文件内容如下:
!include $(NTMAKEENV)\makefile.def
//此文于2011年整理于网络。

没有评论:

发表评论