一个简单的文件系统过滤驱动框架

 很多人认为文件系统过滤驱动很复杂,其实也有一定道理,因为需要有很多细节需要考虑到,这是一个简单的文件系统过滤驱动,抛去了大部分细节,留下了一个简单的框架,其实这样文件系统过滤驱动就变得蛮简单的,很多接口可以不用实现,只要知道大致流程,其它都将会很清晰。

[cpp]  view plain  copy
  1. #define DBG 1  
  2.   
  3. #include <ntifs.h>  
  4. #include "fsfilter.h"  
  5.   
  6. PDEVICE_OBJECT g_Cdo;  
  7. PDRIVER_OBJECT g_MyDriver;  
  8.   
  9. NTSTATUS   
  10. DriverEntry (   
  11.     __in struct _DRIVER_OBJECT  *DriverObject,  
  12.     __in PUNICODE_STRING  RegistryPath   
  13.     )  
  14. {  
  15.     int i = 0;  
  16.     UNICODE_STRING DeviceName;  
  17.     NTSTATUS Status;  
  18.   
  19.     KdPrintThisFunction();  
  20.   
  21.     g_MyDriver = DriverObject;  
  22.   
  23.     for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {  
  24.         DriverObject->MajorFunction[i] = FsfPassThrough;  
  25.     }  
  26.   
  27.     DriverObject->MajorFunction[IRP_MJ_CREATE] = FsfCreate;  
  28.     DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = FsfCreate;  
  29.     DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = FsfCreate;  
  30.     DriverObject->MajorFunction[IRP_MJ_READ] = FsfRead;  
  31.     DriverObject->MajorFunction[IRP_MJ_WRITE] = FsfWrite;  
  32.     DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = FsfFsControl;  
  33.     DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FsfCleanupClose;  
  34.     DriverObject->MajorFunction[IRP_MJ_CLOSE] = FsfCleanupClose;  
  35.   
  36.     DriverObject->FastIoDispatch = (PFAST_IO_DISPATCH)ExAllocatePool(NonPagedPool, sizeof(FAST_IO_DISPATCH));  
  37.     if (DriverObject->FastIoDispatch == NULL) {  
  38.         KdPrint((FSF_MODULE_NAME_PREFIX "Allocate fast io dispatch rotine memory failed.\n"));  
  39.         return STATUS_FAILED_DRIVER_ENTRY;  
  40.     }  
  41.   
  42.     RtlZeroMemory(DriverObject->FastIoDispatch, sizeof(FAST_IO_DISPATCH));  
  43.   
  44.     DriverObject->FastIoDispatch->SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);  
  45.     DriverObject->FastIoDispatch->FastIoCheckIfPossible = FsfFastIoCheckIfPossible;  
  46.     DriverObject->FastIoDispatch->FastIoRead = FsfFastIoRead;  
  47.     DriverObject->FastIoDispatch->FastIoWrite = FsfFastIoWrite;  
  48.     DriverObject->FastIoDispatch->FastIoQueryBasicInfo = FsfFastIoQueryBasicInfo;  
  49.     DriverObject->FastIoDispatch->FastIoQueryStandardInfo = FsfFastIoQueryStandardInfo;  
  50.     DriverObject->FastIoDispatch->FastIoLock = FsfFastIoLock;  
  51.     DriverObject->FastIoDispatch->FastIoUnlockSingle = FsfFastIoUnlockSingle;  
  52.     DriverObject->FastIoDispatch->FastIoUnlockAll = FsfFastIoUnlockAll;  
  53.     DriverObject->FastIoDispatch->FastIoUnlockAllByKey = FsfFastIoUnlockAllByKey;  
  54.     DriverObject->FastIoDispatch->FastIoDeviceControl = FsfFastIoDeviceControl;  
  55.     DriverObject->FastIoDispatch->FastIoDetachDevice = FsfFastIoDetachDevice;  
  56.     DriverObject->FastIoDispatch->FastIoQueryNetworkOpenInfo = FsfFastIoQueryNetworkOpenInfo;  
  57.     DriverObject->FastIoDispatch->MdlRead = FsfFastIoMdlRead;  
  58.     DriverObject->FastIoDispatch->MdlReadComplete = FsfFastIoMdlReadComplete;  
  59.     DriverObject->FastIoDispatch->PrepareMdlWrite = FsfFastIoPrepareMdlWrite;  
  60.     DriverObject->FastIoDispatch->MdlWriteComplete = FsfFastIoWriteComplete;  
  61.     DriverObject->FastIoDispatch->FastIoReadCompressed = FsfFastIoReadCompressed;  
  62.     DriverObject->FastIoDispatch->FastIoWriteCompressed = FsfFastIoWriteCompressed;  
  63.     DriverObject->FastIoDispatch->MdlReadCompleteCompressed = FsfFastIoReadCompleteCompressed;  
  64.     DriverObject->FastIoDispatch->MdlWriteCompleteCompressed = FsfFastIoWriteCompleteCompressed;  
  65.     DriverObject->FastIoDispatch->FastIoQueryOpen = FsfFastIoQueryOpen;  
  66.   
  67.     DriverObject->DriverUnload = FsfUnload;  
  68.   
  69.     // 生成一个控制设备 CDO  
  70.     RtlInitUnicodeString(&DeviceName, L"\\FileSystem\\Filters\\FsFilter");  
  71.     Status = IoCreateDevice(DriverObject,  
  72.                             0,  
  73.                             &DeviceName,  
  74.                             FILE_DEVICE_DISK_FILE_SYSTEM,  
  75.                             FILE_DEVICE_SECURE_OPEN,  
  76.                             FALSE,  
  77.                             &g_Cdo);  
  78.     if (!NT_SUCCESS(Status)) {  
  79.         KdPrint((FSF_MODULE_NAME_PREFIX "Create the device failed.\n"));  
  80.         goto Fail;  
  81.     }  
  82.   
  83.     // 设置文件系统加载和注销回调  
  84.     Status = IoRegisterFsRegistrationChange(DriverObject, FsfFsNotification);  
  85.     if (!NT_SUCCESS(Status)) {  
  86.         KdPrint((FSF_MODULE_NAME_PREFIX "Register file system chang notification failed!\n"));  
  87.         goto Fail;  
  88.     }  
  89.   
  90.     return STATUS_SUCCESS;  
  91.   
  92. Fail:  
  93.     if (DriverObject->FastIoDispatch != NULL) {  
  94.         ExFreePool(DriverObject->FastIoDispatch);  
  95.     }  
  96.   
  97.     if (g_Cdo != NULL) {  
  98.         IoDeleteDevice(g_Cdo);  
  99.     }  
  100.   
  101.     return Status;  
  102. }  
  103.   
  104. NTSTATUS  
  105. FsfPassThrough (  
  106.     __in struct _DEVICE_OBJECT *DeviceObject,  
  107.     __inout struct _IRP *Irp  
  108.     )  
  109. {  
  110.     PFSF_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;  
  111.   
  112.     IoSkipCurrentIrpStackLocation(Irp);  
  113.     return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);  
  114. }  
  115.   
  116. VOID  
  117. FsfUnload (  
  118.     __in struct _DRIVER_OBJECT *DriverObject  
  119.     )  
  120. {  
  121.     PDEVICE_OBJECT MyDevice;  
  122.   
  123.     KdPrintThisFunction();  
  124.   
  125.     IoUnregisterFsRegistrationChange(DriverObject, FsfFsNotification);  
  126.   
  127.     MyDevice = DriverObject->DeviceObject;  
  128.     while (MyDevice != NULL) {  
  129.         PDEVICE_OBJECT TempDevice = MyDevice->NextDevice;  
  130.   
  131.         // 如果是不是我的控制设备,则面要解除附加  
  132.         if (!IsMyControlDeivce(MyDevice)) {  
  133.             // 如果是文件系统控制设备的过滤设备或文件系统卷设备的过滤设备  
  134.             if (IsMyFilterDevice(MyDevice)) {  
  135.                 PFSF_DEVICE_EXTENSION DeviceExtension = MyDevice->DeviceExtension;  
  136.                 IoDetachDevice(DeviceExtension->AttachedToDeviceObject);  
  137.                 KdPrintWithFuncPrefix("Deattach the fs cdo or volime filter.\n");  
  138.             }  
  139.         }  
  140.           
  141.         IoDeleteDevice(MyDevice);  
  142.         MyDevice = TempDevice;  
  143.     }  
  144.   
  145. }  
  146.   
  147. NTSTATUS  
  148. FsfReadCompletion (  
  149.     __in PDEVICE_OBJECT DeviceObject,  
  150.     __in PIRP Irp,  
  151.     __in_xcount_opt("varies"PVOID Context  
  152.     )  
  153. {  
  154.     PKEVENT WaitEvent = Context;  
  155.   
  156.     KeSetEvent(WaitEvent, IO_NO_INCREMENT, FALSE);  
  157.   
  158.     return STATUS_MORE_PROCESSING_REQUIRED;  
  159. }  
  160.   
  161. NTSTATUS  
  162. FsfCreate (  
  163.     __in struct _DEVICE_OBJECT *DeviceObject,  
  164.     __inout struct _IRP *Irp  
  165.     )  
  166. {  
  167.     PFSF_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;  
  168.     PIO_STACK_LOCATION IoStackLocation = IoGetCurrentIrpStackLocation(Irp);  
  169.     KEVENT WaitEvent;  
  170.     NTSTATUS Status;  
  171.     POBJECT_NAME_INFORMATION NameInfo;  
  172.     char Buffer[512] = {0};  
  173.     ULONG ReturnLength = 0;  
  174.   
  175.     //KdPrintThisFunction();  
  176.   
  177.     // 如果是我的控制设备,则直接完成  
  178.     if (IsMyControlDeivce(DeviceObject)) {  
  179.         IoCompleteRequest(Irp, IO_NO_INCREMENT);  
  180.         Irp->IoStatus.Information = 0;  
  181.         Irp->IoStatus.Status = STATUS_SUCCESS;  
  182.   
  183.         return STATUS_SUCCESS;  
  184.     }  
  185.   
  186.     // 如果是我的文件系统控制设备的过滤设备(控制设备过滤设备没有保存存储卷设备),则直接下发  
  187.     if (DeviceExtension == NULL) {  
  188.         return FsfPassThrough(DeviceObject, Irp);  
  189.     }  
  190.   
  191.     KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE);  
  192.     IoCopyCurrentIrpStackLocationToNext(Irp);  
  193.     IoSetCompletionRoutine(Irp, FsfReadCompletion, &WaitEvent, TRUE, TRUE, TRUE);  
  194.     Status = IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);  
  195.     if (Status == STATUS_PENDING) {  
  196.         KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, FALSE);  
  197.     }  
  198.   
  199.     NameInfo = (POBJECT_NAME_INFORMATION)Buffer;  
  200.     ObQueryNameString(IoStackLocation->FileObject, NameInfo, sizeof(Buffer), &ReturnLength);  
  201.   
  202.     // 打印出文件名  
  203.     KdPrint(("Create: %S.\n", NameInfo->Name.Buffer));  
  204.   
  205.     IoCompleteRequest(Irp, IO_NO_INCREMENT);  
  206.     return Irp->IoStatus.Status;  
  207. }  
  208.   
  209. NTSTATUS  
  210. FsfRead (  
  211.     __in struct _DEVICE_OBJECT *DeviceObject,  
  212.     __inout struct _IRP *Irp  
  213.     )  
  214. {  
  215.     PFSF_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;  
  216.     PIO_STACK_LOCATION IoStackLocation = IoGetCurrentIrpStackLocation(Irp);  
  217.     LARGE_INTEGER Offset;  
  218.     ULONG Length;  
  219.   
  220.     // 如果是我的控制设备,则直接完成  
  221.     if (IsMyControlDeivce(DeviceObject)) {  
  222.         IoCompleteRequest(Irp, IO_NO_INCREMENT);  
  223.         Irp->IoStatus.Information = 0;  
  224.         Irp->IoStatus.Status = STATUS_SUCCESS;  
  225.   
  226.         return STATUS_SUCCESS;  
  227.     }  
  228.   
  229.     // 如果是我的文件系统控制设备的过滤设备(控制设备过滤设备没有保存存储卷设备),则直接下发  
  230.     if (DeviceExtension == NULL) {  
  231.         return FsfPassThrough(DeviceObject, Irp);  
  232.     }  
  233.   
  234.     // 下面是对文件系统卷设备的过滤处理  
  235.     Offset.QuadPart = IoStackLocation->Parameters.Read.ByteOffset.QuadPart;  
  236.     Length = IoStackLocation->Parameters.Read.Length;  
  237.     //KdPrintWithFuncPrefix("Read - ");  
  238.     //KdPrint(("Offset (0x%08x, 0x%08x), Length (0x%08x).\n", Offset.HighPart, Offset.LowPart, Length));  
  239.   
  240.     IoSkipCurrentIrpStackLocation(Irp);  
  241.     return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);  
  242. }  
  243.   
  244. NTSTATUS  
  245. FsfWrite (  
  246.     __in struct _DEVICE_OBJECT *DeviceObject,  
  247.     __inout struct _IRP *Irp  
  248.     )  
  249. {  
  250.     PFSF_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;  
  251.     PIO_STACK_LOCATION IoStackLocation = IoGetCurrentIrpStackLocation(Irp);  
  252.     LARGE_INTEGER Offset;  
  253.     ULONG Length;  
  254.   
  255.     // 如果是我的控制设备,则直接完成  
  256.     if (IsMyControlDeivce(DeviceObject)) {  
  257.         IoCompleteRequest(Irp, IO_NO_INCREMENT);  
  258.         Irp->IoStatus.Information = 0;  
  259.         Irp->IoStatus.Status = STATUS_SUCCESS;  
  260.   
  261.         return STATUS_SUCCESS;  
  262.     }  
  263.   
  264.     // 如果是我的文件系统控制设备的过滤设备(控制设备过滤设备没有保存存储卷设备),则直接下发  
  265.     if (DeviceExtension == NULL) {  
  266.         return FsfPassThrough(DeviceObject, Irp);  
  267.     }  
  268.   
  269.     // 下面是对文件系统卷设备的过滤处理  
  270.     Offset.QuadPart = IoStackLocation->Parameters.Write.ByteOffset.QuadPart;  
  271.     Length = IoStackLocation->Parameters.Write.Length;  
  272.     //KdPrintWithFuncPrefix("Write - ");  
  273.     //KdPrint(("Offset (0x%08x, 0x%08x), Length (0x%08x).\n", Offset.HighPart, Offset.LowPart, Length));  
  274.   
  275.     IoSkipCurrentIrpStackLocation(Irp);  
  276.     return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);  
  277. }  
  278.   
  279. /* 
  280.  * 卷挂载完成事件 
  281.  * 在这里直接进行绑定有一定的风险,因为此时中断级别很高,是 DISPATCH_LEVEL, 
  282.  * 所以进行了推迟绑定,这里只是设置一下事件。 
  283.  */  
  284. NTSTATUS  
  285. FsfMountVolumeCompletion (  
  286.     __in PDEVICE_OBJECT DeviceObject,  
  287.     __in PIRP Irp,  
  288.     __in_xcount_opt("varies"PVOID Context  
  289.     )  
  290. {  
  291.     PKEVENT WaitEvent = (PKEVENT)Context;  
  292.   
  293.     KeSetEvent(WaitEvent, IO_NO_INCREMENT, FALSE);  
  294.   
  295.     return STATUS_MORE_PROCESSING_REQUIRED;  
  296. }  
  297.   
  298. NTSTATUS  
  299. FsfControlMountVolume (  
  300.     __in struct _DEVICE_OBJECT *DeviceObject,  
  301.     __inout struct _IRP *Irp  
  302.     )  
  303. {  
  304.     PDEVICE_OBJECT StorageDevice;  
  305.     PDEVICE_OBJECT MyDevice;  
  306.     NTSTATUS Status;  
  307.     PFSF_DEVICE_EXTENSION DeviceExtension;  
  308.     ULONG ReturnLength = 0;  
  309.     KEVENT CompletionEvent;  
  310.     PFSF_DEVICE_EXTENSION MyCdoFilterDeviceExtension = DeviceObject->DeviceExtension;  
  311.     char Buff[512];  
  312.     POBJECT_NAME_INFORMATION NameInfo;  
  313.   
  314.     // 记录下实际存储媒介设备对象,即磁盘卷设备对象,以便后面可以取回 VPB  
  315.     // Vpb->DeviceObject 才是文件系统卷设备, 这是我们需要挂接的设备,在该 IRP 完成后,它就是有意思的对象了  
  316.     StorageDevice = IoGetCurrentIrpStackLocation(Irp)->Parameters.MountVolume.Vpb->RealDevice;  
  317.     Status = IoCreateDevice(g_MyDriver,  
  318.                             sizeof(FSF_DEVICE_EXTENSION),  
  319.                             NULL,  
  320.                             DeviceObject->DeviceType,  
  321.                             0,  
  322.                             FALSE,  
  323.                             &MyDevice);  
  324.   
  325.     DeviceExtension = MyDevice->DeviceExtension;  
  326.     DeviceExtension->StorageDevice = StorageDevice;  
  327.     DeviceExtension->TypeFlag = FSF_DEVICE_FLAG;  
  328.   
  329.     // 记录下存储设备的名字  
  330.     RtlInitEmptyUnicodeString(&DeviceExtension->AttachedToDeviceName,   
  331.                               DeviceExtension->AttachedToDeviceNameBuff,   
  332.                               sizeof(DeviceExtension->AttachedToDeviceNameBuff));  
  333.     NameInfo = (POBJECT_NAME_INFORMATION)Buff;  
  334.     ObQueryNameString(StorageDevice,  
  335.                       NameInfo,   
  336.                       sizeof(Buff),   
  337.                       &ReturnLength);  
  338.     RtlCopyUnicodeString(&DeviceExtension->AttachedToDeviceName, &NameInfo->Name);  
  339.   
  340.     // 调用下层驱动并等待其完成  
  341.     KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE);  
  342.     IoCopyCurrentIrpStackLocationToNext(Irp);  
  343.     IoSetCompletionRoutine(Irp, FsfMountVolumeCompletion, &CompletionEvent, TRUE, TRUE, TRUE);  
  344.     // 发送给我的控制设备所附加的下层对象  
  345.     KdPrint(("Call next fs cdo (0x%08x).\n", MyCdoFilterDeviceExtension->AttachedToDeviceObject));  
  346.     Status = IoCallDriver(MyCdoFilterDeviceExtension->AttachedToDeviceObject, Irp);  
  347.     if (Status == STATUS_PENDING) {  
  348.         KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, FALSE);  
  349.     }  
  350.   
  351.     if (NT_SUCCESS(Irp->IoStatus.Status)) {  
  352.         // 这里可以检查 Irp 中 vpb 值是否改变,有些可插拔设备是会改变的  
  353.   
  354.         PDEVICE_OBJECT FsVolumeDevice = StorageDevice->Vpb->DeviceObject;  
  355.   
  356.         // 由于设备的一些标志在前面没有初始化过,此时文件系统卷设备已经可以,可以根据它来初始化我们的过滤驱动标识了  
  357.         if (FsVolumeDevice->Flags & DO_BUFFERED_IO) {  
  358.             MyDevice->Flags |= DO_BUFFERED_IO;  
  359.         }  
  360.   
  361.         if (FsVolumeDevice->Flags & DO_DIRECT_IO) {  
  362.             MyDevice->Flags |= DO_DIRECT_IO;  
  363.         }  
  364.   
  365.         MyDevice->Flags &= ~DO_DEVICE_INITIALIZING;  
  366.   
  367.         IoAttachDeviceToDeviceStackSafe(MyDevice, FsVolumeDevice, &DeviceExtension->AttachedToDeviceObject);  
  368.   
  369.         KdPrintWithFuncPrefix("Attached a fs volume deivce.\n");  
  370.     } else {  
  371.         IoDeleteDevice(MyDevice);  
  372.         KdPrintWithFuncPrefix("Attach fs volume deivce failed");  
  373.         KdPrint((" (0x%08x).\n", Irp->IoStatus.Status));  
  374.     }  
  375.       
  376.     IoCompleteRequest(Irp, IO_NO_INCREMENT);  
  377.     return Irp->IoStatus.Status;  
  378. }  
  379.   
  380. /* 
  381.  * 当文件系统的卷被挂载或解挂载时,这个函数会被调用。 
  382.  * 本驱动的控制设备和文件系统控制设备的过滤设备共用这些例程。 
  383.  * 暂不考虑控制设备发过来的请求,一般也不会有这样的请求产生。 
  384.  */  
  385. NTSTATUS  
  386. FsfFsControl (  
  387.     __in struct _DEVICE_OBJECT *DeviceObject,  
  388.     __inout struct _IRP *Irp  
  389.     )  
  390. {  
  391.     PIO_STACK_LOCATION IoStackLocation = IoGetCurrentIrpStackLocation(Irp);  
  392.     PFSF_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;  
  393.   
  394.     KdPrintThisFunction();  
  395.   
  396.     // 如果是我的控制设备,则直接完成  
  397.     if (IsMyControlDeivce(DeviceObject)) {  
  398.         IoCompleteRequest(Irp, IO_NO_INCREMENT);  
  399.         Irp->IoStatus.Information = 0;  
  400.         Irp->IoStatus.Status = STATUS_SUCCESS;  
  401.         KdPrintWithFuncPrefix("Is my cdo.\n");  
  402.         return STATUS_SUCCESS;  
  403.     }  
  404.   
  405.     // 主要处理文件系统控制设备的过滤设备  
  406.     switch (IoStackLocation->MinorFunction) {  
  407.     case IRP_MN_MOUNT_VOLUME:  
  408.         // 文件系统卷被挂载  
  409.         return FsfControlMountVolume(DeviceObject, Irp);  
  410.     case IRP_MN_LOAD_FILE_SYSTEM:  
  411.         KdPrintWithFuncPrefix("Load file system.\n");  
  412.         break;  
  413.     case IRP_MN_USER_FS_REQUEST:  
  414.         KdPrintWithFuncPrefix("User fs request.\n");  
  415.         if (IoStackLocation->Parameters.FileSystemControl.FsControlCode == FSCTL_DISMOUNT_VOLUME) {  
  416.             // 暂不处理文件系统卷被卸载的情况  
  417.         }  
  418.         break;  
  419.     }  
  420.   
  421.     IoSkipCurrentIrpStackLocation(Irp);  
  422.     return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);  
  423. }  
  424.   
  425. NTSTATUS  
  426. FsfCleanupClose (  
  427.     __in struct _DEVICE_OBJECT *DeviceObject,  
  428.     __inout struct _IRP *Irp  
  429.     )  
  430. {  
  431.     PFSF_DEVICE_EXTENSION DeviceExtension;  
  432.   
  433.     //KdPrintThisFunction();  
  434.   
  435.     // 如果是我的控制设备,则直接完成  
  436.     if (IsMyControlDeivce(DeviceObject)) {  
  437.         IoCompleteRequest(Irp, IO_NO_INCREMENT);  
  438.         Irp->IoStatus.Information = 0;  
  439.         Irp->IoStatus.Status = STATUS_SUCCESS;  
  440.   
  441.         return STATUS_SUCCESS;  
  442.     }  
  443.   
  444.     DeviceExtension = DeviceObject->DeviceExtension;  
  445.   
  446.     IoSkipCurrentIrpStackLocation(Irp);  
  447.   
  448.     return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);  
  449. }  
  450.   
  451. BOOLEAN  
  452. FsfFastIoCheckIfPossible (  
  453.     __in struct _FILE_OBJECT *FileObject,  
  454.     __in PLARGE_INTEGER FileOffset,  
  455.     __in ULONG Length,  
  456.     __in BOOLEAN Wait,  
  457.     __in ULONG LockKey,  
  458.     __in BOOLEAN CheckForReadOperation,  
  459.     __out PIO_STATUS_BLOCK IoStatus,  
  460.     __in struct _DEVICE_OBJECT *DeviceObject  
  461.     )  
  462. {  
  463.     return FALSE;  
  464. }  
  465.   
  466. BOOLEAN  
  467. FsfFastIoRead (  
  468.     __in struct _FILE_OBJECT *FileObject,  
  469.     __in PLARGE_INTEGER FileOffset,  
  470.     __in ULONG Length,  
  471.     __in BOOLEAN Wait,  
  472.     __in ULONG LockKey,  
  473.     __out PVOID Buffer,  
  474.     __out PIO_STATUS_BLOCK IoStatus,  
  475.     __in struct _DEVICE_OBJECT *DeviceObject  
  476.     )  
  477. {  
  478.     return FALSE;  
  479. }  
  480.   
  481. BOOLEAN  
  482. FsfFastIoWrite (  
  483.     __in struct _FILE_OBJECT *FileObject,  
  484.     __in PLARGE_INTEGER FileOffset,  
  485.     __in ULONG Length,  
  486.     __in BOOLEAN Wait,  
  487.     __in ULONG LockKey,  
  488.     __in PVOID Buffer,  
  489.     __out PIO_STATUS_BLOCK IoStatus,  
  490.     __in struct _DEVICE_OBJECT *DeviceObject  
  491.     )  
  492. {  
  493.     return FALSE;  
  494. }  
  495.   
  496. BOOLEAN  
  497. FsfFastIoQueryBasicInfo (  
  498.     __in struct _FILE_OBJECT *FileObject,  
  499.     __in BOOLEAN Wait,  
  500.     __out PFILE_BASIC_INFORMATION Buffer,  
  501.     __out PIO_STATUS_BLOCK IoStatus,  
  502.     __in struct _DEVICE_OBJECT *DeviceObject  
  503.     )  
  504. {  
  505.     return FALSE;  
  506. }  
  507.   
  508. BOOLEAN  
  509. FsfFastIoQueryStandardInfo (  
  510.     __in struct _FILE_OBJECT *FileObject,  
  511.     __in BOOLEAN Wait,  
  512.     __out PFILE_STANDARD_INFORMATION Buffer,  
  513.     __out PIO_STATUS_BLOCK IoStatus,  
  514.     __in struct _DEVICE_OBJECT *DeviceObject  
  515.     )  
  516. {  
  517.     return FALSE;  
  518. }  
  519.   
  520. BOOLEAN  
  521. FsfFastIoLock (  
  522.     __in struct _FILE_OBJECT *FileObject,  
  523.     __in PLARGE_INTEGER FileOffset,  
  524.     __in PLARGE_INTEGER Length,  
  525.     __in PEPROCESS ProcessId,  
  526.     __in ULONG Key,  
  527.     __in BOOLEAN FailImmediately,  
  528.     __in BOOLEAN ExclusiveLock,  
  529.     __out PIO_STATUS_BLOCK IoStatus,  
  530.     __in struct _DEVICE_OBJECT *DeviceObject  
  531.     )  
  532. {  
  533.     return FALSE;  
  534. }  
  535.   
  536. BOOLEAN  
  537. FsfFastIoUnlockSingle (  
  538.     __in struct _FILE_OBJECT *FileObject,  
  539.     __in PLARGE_INTEGER FileOffset,  
  540.     __in PLARGE_INTEGER Length,  
  541.     __in PEPROCESS ProcessId,  
  542.     __in ULONG Key,  
  543.     __out PIO_STATUS_BLOCK IoStatus,  
  544.     __in struct _DEVICE_OBJECT *DeviceObject  
  545.     )  
  546. {  
  547.     return FALSE;  
  548. }  
  549.   
  550. BOOLEAN  
  551. FsfFastIoUnlockAll (  
  552.     __in struct _FILE_OBJECT *FileObject,  
  553.     __in PEPROCESS ProcessId,  
  554.     __out PIO_STATUS_BLOCK IoStatus,  
  555.     __in struct _DEVICE_OBJECT *DeviceObject  
  556.     )  
  557. {  
  558.     return FALSE;  
  559. }  
  560.   
  561. BOOLEAN  
  562. FsfFastIoUnlockAllByKey (  
  563.     __in struct _FILE_OBJECT *FileObject,  
  564.     __in PVOID ProcessId,  
  565.     __in ULONG Key,  
  566.     __out PIO_STATUS_BLOCK IoStatus,  
  567.     __in struct _DEVICE_OBJECT *DeviceObject  
  568.     )  
  569. {  
  570.     return FALSE;  
  571. }  
  572.   
  573. BOOLEAN  
  574. FsfFastIoDeviceControl (  
  575.     __in struct _FILE_OBJECT *FileObject,  
  576.     __in BOOLEAN Wait,  
  577.     __in_opt PVOID InputBuffer,  
  578.     __in ULONG InputBufferLength,  
  579.     __out_opt PVOID OutputBuffer,  
  580.     __in ULONG OutputBufferLength,  
  581.     __in ULONG IoControlCode,  
  582.     __out PIO_STATUS_BLOCK IoStatus,  
  583.     __in struct _DEVICE_OBJECT *DeviceObject  
  584.     )  
  585. {  
  586.     return FALSE;  
  587. }  
  588.   
  589. VOID  
  590. FsfFastIoDetachDevice (  
  591.     __in struct _DEVICE_OBJECT *SourceDevice,  
  592.     __in struct _DEVICE_OBJECT *TargetDevice  
  593.     )  
  594. {  
  595. }  
  596.   
  597. BOOLEAN  
  598. FsfFastIoQueryNetworkOpenInfo (  
  599.     __in struct _FILE_OBJECT *FileObject,  
  600.     __in BOOLEAN Wait,  
  601.     __out struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,  
  602.     __out struct _IO_STATUS_BLOCK *IoStatus,  
  603.     __in struct _DEVICE_OBJECT *DeviceObject  
  604.     )  
  605. {  
  606.     return FALSE;  
  607. }  
  608.   
  609. BOOLEAN  
  610. FsfFastIoMdlRead (  
  611.     __in struct _FILE_OBJECT *FileObject,  
  612.     __in PLARGE_INTEGER FileOffset,  
  613.     __in ULONG Length,  
  614.     __in ULONG LockKey,  
  615.     __out PMDL *MdlChain,  
  616.     __out PIO_STATUS_BLOCK IoStatus,  
  617.     __in struct _DEVICE_OBJECT *DeviceObject  
  618.     )  
  619. {  
  620.     return FALSE;  
  621. }  
  622.   
  623. BOOLEAN  
  624. FsfFastIoMdlReadComplete (  
  625.     __in struct _FILE_OBJECT *FileObject,  
  626.     __in PMDL MdlChain,  
  627.     __in struct _DEVICE_OBJECT *DeviceObject  
  628.     )  
  629. {  
  630.     return FALSE;  
  631. }  
  632.   
  633. BOOLEAN  
  634. FsfFastIoPrepareMdlWrite (  
  635.     __in struct _FILE_OBJECT *FileObject,  
  636.     __in PLARGE_INTEGER FileOffset,  
  637.     __in ULONG Length,  
  638.     __in ULONG LockKey,  
  639.     __out PMDL *MdlChain,  
  640.     __out PIO_STATUS_BLOCK IoStatus,  
  641.     __in struct _DEVICE_OBJECT *DeviceObject  
  642.     )  
  643. {  
  644.     return FALSE;  
  645. }  
  646.   
  647. BOOLEAN  
  648. FsfFastIoWriteComplete (  
  649.     __in struct _FILE_OBJECT *FileObject,  
  650.     __in PLARGE_INTEGER FileOffset,  
  651.     __in PMDL MdlChain,  
  652.     __in struct _DEVICE_OBJECT *DeviceObject  
  653.     )  
  654. {  
  655.     return FALSE;  
  656. }  
  657.   
  658. BOOLEAN  
  659. FsfFastIoReadCompressed (  
  660.     __in struct _FILE_OBJECT *FileObject,  
  661.     __in PLARGE_INTEGER FileOffset,  
  662.     __in ULONG Length,  
  663.     __in ULONG LockKey,  
  664.     __out PVOID Buffer,  
  665.     __out PMDL *MdlChain,  
  666.     __out PIO_STATUS_BLOCK IoStatus,  
  667.     __out struct _COMPRESSED_DATA_INFO *CompressedDataInfo,  
  668.     __in ULONG CompressedDataInfoLength,  
  669.     __in struct _DEVICE_OBJECT *DeviceObject  
  670.     )  
  671. {  
  672.     return FALSE;  
  673. }  
  674.   
  675. BOOLEAN  
  676. FsfFastIoWriteCompressed (  
  677.     __in struct _FILE_OBJECT *FileObject,  
  678.     __in PLARGE_INTEGER FileOffset,  
  679.     __in ULONG Length,  
  680.     __in ULONG LockKey,  
  681.     __in PVOID Buffer,  
  682.     __out PMDL *MdlChain,  
  683.     __out PIO_STATUS_BLOCK IoStatus,  
  684.     __in struct _COMPRESSED_DATA_INFO *CompressedDataInfo,  
  685.     __in ULONG CompressedDataInfoLength,  
  686.     __in struct _DEVICE_OBJECT *DeviceObject  
  687.     )  
  688. {  
  689.     return FALSE;  
  690. }  
  691.   
  692. BOOLEAN  
  693. FsfFastIoReadCompleteCompressed (  
  694.     __in struct _FILE_OBJECT *FileObject,  
  695.     __in PMDL MdlChain,  
  696.     __in struct _DEVICE_OBJECT *DeviceObject  
  697.     )  
  698. {  
  699.     return FALSE;  
  700. }  
  701.   
  702. BOOLEAN  
  703. FsfFastIoWriteCompleteCompressed (  
  704.     __in struct _FILE_OBJECT *FileObject,  
  705.     __in PLARGE_INTEGER FileOffset,  
  706.     __in PMDL MdlChain,  
  707.     __in struct _DEVICE_OBJECT *DeviceObject  
  708.     )  
  709. {  
  710.     return FALSE;  
  711. }  
  712.   
  713. BOOLEAN  
  714. FsfFastIoQueryOpen (  
  715.     __inout struct _IRP *Irp,  
  716.     __out PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,  
  717.     __in struct _DEVICE_OBJECT *DeviceObject  
  718.     )  
  719. {  
  720.     return FALSE;  
  721. }  
  722.   
  723. /* 
  724.  * 文件系统激活和注销时的回调 
  725.  * DeviceObject: 为文件系统控制设备,但为了提高效率,也有可能是文件系统识别器设备(该设备一般由 Fs_Rec 生成); 
  726.  * FsActive:     是激活还是注销 
  727.  */  
  728. VOID  
  729. FsfFsNotification (  
  730.     __in struct _DEVICE_OBJECT *DeviceObject,  
  731.     __in BOOLEAN FsActive  
  732.     )  
  733. {  
  734.     UNICODE_STRING DriverName;  
  735.     POBJECT_NAME_INFORMATION NameInfo;  
  736.     ULONG ReturnLength = 0;  
  737.     NTSTATUS Status = STATUS_SUCCESS;  
  738.     PDEVICE_OBJECT NewDeviceObject;  
  739.     PFSF_DEVICE_EXTENSION DeviceExtension;  
  740.     char Buff[512];  
  741.   
  742.     KdPrintThisFunction();  
  743.   
  744.     // 检查是不是想要处理文件系统设备类型  
  745.     if (DeviceObject->DeviceType != FILE_DEVICE_DISK_FILE_SYSTEM /*&& 
  746.         DeviceObject->DeviceType != FILE_DEVICE_CD_ROM_FILE_SYSTEM*/) {  
  747.         return;  
  748.     }  
  749.   
  750.     if (FsActive) {  
  751.         // 如果是激活  
  752.   
  753.         KdPrintWithFuncPrefix("Active.\n");  
  754.   
  755.         // 检查该设备是否为微软的文件系统识别器设备(是否是 \FileSystem\Fs_Rec 驱动生成的设备, 这种方法现在可行,但不能保证一直有效)  
  756.         RtlInitUnicodeString(&DriverName, L"\\FileSystem\\Fs_Rec");  
  757.         NameInfo = (POBJECT_NAME_INFORMATION)Buff;  
  758.         ObQueryNameString(DeviceObject->DriverObject, NameInfo, sizeof(Buff), &ReturnLength);  
  759.         if (RtlCompareUnicodeString(&NameInfo->Name, &DriverName, TRUE) == 0) {  
  760.             KdPrintWithFuncPrefix("A file system recognizer here!.\n");  
  761.             return;  
  762.         }  
  763.   
  764.   
  765.   
  766.         // 创建过滤设备, 匿名,类型和属性与文件系统设备相同  
  767.         Status = IoCreateDevice(g_MyDriver,  
  768.                                 sizeof(FSF_DEVICE_EXTENSION),  
  769.                                 NULL,  
  770.                                 DeviceObject->DeviceType,  
  771.                                 0,  
  772.                                 FALSE,  
  773.                                 &NewDeviceObject);  
  774.         if (!NT_SUCCESS(Status)) {  
  775.             return;  
  776.         }  
  777.   
  778.         // 设置新设备的属性  
  779.         if (DeviceObject->Flags & DO_BUFFERED_IO) {  
  780.             NewDeviceObject->Flags |= DO_BUFFERED_IO;  
  781.         }  
  782.   
  783.         if (DeviceObject->Flags & DO_DIRECT_IO) {  
  784.             NewDeviceObject->Flags |= DO_DIRECT_IO;  
  785.         }  
  786.   
  787.         if (DeviceObject->Characteristics & FILE_DEVICE_SECURE_OPEN) {  
  788.             NewDeviceObject->Characteristics |= FILE_DEVICE_SECURE_OPEN;  
  789.         }  
  790.   
  791.         DeviceExtension = NewDeviceObject->DeviceExtension;  
  792.         IoAttachDeviceToDeviceStackSafe(NewDeviceObject, DeviceObject, &DeviceExtension->AttachedToDeviceObject);  
  793.         // 在扩展中打上标志,以识别为该驱动的文件系统控制设备过滤驱动  
  794.         DeviceExtension->TypeFlag = FSF_DEVICE_FLAG;  
  795.   
  796.         // 记录控制设备的名字  
  797.         RtlInitEmptyUnicodeString(&DeviceExtension->AttachedToDeviceName, DeviceExtension->AttachedToDeviceNameBuff, sizeof(DeviceExtension->AttachedToDeviceNameBuff));  
  798.         ObQueryNameString(DeviceObject, NameInfo, sizeof(Buff), &ReturnLength);  
  799.         RtlCopyUnicodeString(&DeviceExtension->AttachedToDeviceName, &NameInfo->Name);  
  800.   
  801.         KdPrintWithFuncPrefix("Create and attach the fs control device ");  
  802.         KdPrint(("(0x%08x).\n", DeviceObject));  
  803.   
  804.         NewDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;  
  805.   
  806.   
  807.         // 前面绑定文件系统控制设备只是为了去监听那些还未被挂载进系统的卷,对于已挂载的文件系统卷需要手动枚举  
  808.         // 文件系统驱动生成两种设备,一种为文件系统控制设备(一般来说只生成一个 CDO),即此函数传入的设备对象参数,另一种为文件系统卷设备,即我们最终需要挂接并过滤的  
  809.         // 文件系统卷设备有可能有多个,文件系统驱动会为每一个该文件系统类型的磁盘卷生成一个文件系统卷设备  
  810.         {  
  811.             ULONG DeviceCount = 0;  
  812.             PDEVICE_OBJECT *DeviceList;  
  813.             PDEVICE_OBJECT StorageDevice;  
  814.             PDEVICE_OBJECT MyDevice;  
  815.             PFSF_DEVICE_EXTENSION DeviceExtension;  
  816.             ULONG i = 0;  
  817.   
  818.             IoEnumerateDeviceObjectList(DeviceObject->DriverObject, NULL, 0, &DeviceCount);  
  819.             DeviceList = (PDEVICE_OBJECT *)ExAllocatePool(NonPagedPool, DeviceCount * sizeof(PDEVICE_OBJECT));  
  820.             IoEnumerateDeviceObjectList(DeviceObject->DriverObject, DeviceList, DeviceCount * sizeof(PDEVICE_OBJECT), &DeviceCount);  
  821.             for (; i < DeviceCount; i++) {  
  822.                 PDEVICE_OBJECT DeviceObjectEntry = DeviceList[i];  
  823.   
  824.                 // 如果该设备对象是文件系统驱动的控制对象,则略过, 如果是其它设备类型的也略过,如 U 盘类型呀,因为上面我们只关注 Disk 类型  
  825.                 // 暂不考虑已经被我们挂接过的设备  
  826.                 if (DeviceObjectEntry == DeviceObject || DeviceObjectEntry->DeviceType != DeviceObject->DeviceType) {      
  827.                     continue;  
  828.                 }  
  829.   
  830.                 // 得到卷设备驱动  
  831.                 IoGetDiskDeviceObject(DeviceObjectEntry, &StorageDevice);  
  832.                 Status = IoCreateDevice(g_MyDriver,  
  833.                                         sizeof(FSF_DEVICE_EXTENSION),  
  834.                                         NULL,  
  835.                                         DeviceObject->DeviceType,  
  836.                                         0,  
  837.                                         FALSE,  
  838.                                         &MyDevice);  
  839.   
  840.                 DeviceExtension = MyDevice->DeviceExtension;  
  841.                 DeviceExtension->StorageDevice = StorageDevice;  
  842.                 DeviceExtension->TypeFlag = FSF_DEVICE_FLAG;  
  843.   
  844.                 // 记录下存储设备的名字  
  845.                 RtlInitEmptyUnicodeString(&DeviceExtension->AttachedToDeviceName,   
  846.                                           DeviceExtension->AttachedToDeviceNameBuff,   
  847.                                           sizeof(DeviceExtension->AttachedToDeviceNameBuff));  
  848.                 NameInfo = (POBJECT_NAME_INFORMATION)Buff;  
  849.                 ObQueryNameString(StorageDevice,  
  850.                                   NameInfo,   
  851.                                   sizeof(Buff),   
  852.                                   &ReturnLength);  
  853.                 RtlCopyUnicodeString(&DeviceExtension->AttachedToDeviceName, &NameInfo->Name);  
  854.   
  855.                 // 由于设备的一些标志在前面没有初始化过,此时文件系统卷设备已经可以,可以根据它来初始化我们的过滤驱动标识了  
  856.                 if (DeviceObjectEntry->Flags & DO_BUFFERED_IO) {  
  857.                     MyDevice->Flags |= DO_BUFFERED_IO;  
  858.                 }  
  859.   
  860.                 if (DeviceObjectEntry->Flags & DO_DIRECT_IO) {  
  861.                     MyDevice->Flags |= DO_DIRECT_IO;  
  862.                 }  
  863.   
  864.                 MyDevice->Flags &= ~DO_DEVICE_INITIALIZING;  
  865.   
  866.                 IoAttachDeviceToDeviceStackSafe(MyDevice, DeviceObjectEntry, &DeviceExtension->AttachedToDeviceObject);  
  867.                 KdPrintWithFuncPrefix("Create and attach a fs volume device ");  
  868.                 KdPrint(("(0x%08x).\n", MyDevice));  
  869.             }  
  870.         }  
  871.     } else {  
  872.         // 如果是注销  
  873.   
  874.         // 遍历该设备上的所有附加设备,如果是我的设备,则去掉附加并删除  
  875.         PDEVICE_OBJECT MyDeivce = DeviceObject->AttachedDevice;  
  876.   
  877.         KdPrintWithFuncPrefix("Inactive.\n");  
  878.   
  879.         while (MyDeivce != NULL) {  
  880.             PDEVICE_OBJECT TempDevice = MyDeivce->AttachedDevice;  
  881.   
  882.             if (IsMyControlDeivce(MyDeivce)) {  
  883.                 IoDetachDevice(MyDeivce);  
  884.                 IoDeleteDevice(MyDeivce);  
  885.                 return;  
  886.             }  
  887.   
  888.             MyDeivce = TempDevice;  
  889.         }  
  890.     }  
  891. }  

[cpp]  view plain  copy
  1. /* 
  2.   文件系统过滤驱动 
  3.   1. 文件系统驱动一般会生成两种设备,一种为 CDO (文件系统控制设备),用于自身的控制,每个文件系统驱动会生成一个, 
  4.      另一种为文件系统卷设备,FS Driver 会为每个为该类型文件系统的卷(逻辑盘)生成一个文件系统卷设备(不同于磁盘卷设备)。 
  5.   2. 文件系统过滤驱动就是通过附加到文件系统卷设备来完成功能的。 
  6.  */  
  7.   
  8. #ifndef FS_FILTER_HENZOX_H  
  9. #define FS_FILTER_HENZOX_H  
  10.   
  11.   
  12. #include <ntddk.h>  
  13.   
  14.   
  15. #define FSF_MODULE_NAME_PREFIX            "FsFilter!"  
  16. #define KdPrintThisFunction()             KdPrint((FSF_MODULE_NAME_PREFIX"%s\n", __FUNCTION__))  
  17. #define KdPrintWithFuncPrefix(x, ...)     KdPrint((FSF_MODULE_NAME_PREFIX"%s: "x, __FUNCTION__))  
  18.   
  19. #define FSF_DEVICE_FLAG                   'tfsF'  
  20.   
  21. // 检查是否是我的文件系统控制设备的过滤设备对象或者是文件系统卷设备过滤设备对象  
  22. #define IsMyFilterDevice(x)            (x->DeviceExtension != NULL && *(PULONG)(x->DeviceExtension) == FSF_DEVICE_FLAG)  
  23. // 检查是否是我的控制设备对象 CDO  
  24. #define IsMyControlDeivce(x)              (x == g_Cdo)  
  25.   
  26. typedef struct _FSF_DEVICE_EXTENSION {  
  27.     ULONG TypeFlag;  
  28.     PDEVICE_OBJECT AttachedToDeviceObject;  
  29.     UNICODE_STRING AttachedToDeviceName;  
  30.     WCHAR AttachedToDeviceNameBuff[64];  
  31.     PDEVICE_OBJECT StorageDevice;  
  32. } FSF_DEVICE_EXTENSION, *PFSF_DEVICE_EXTENSION;  
  33.   
  34. VOID  
  35. FsfUnload (  
  36.     __in struct _DRIVER_OBJECT *DriverObject  
  37.     );  
  38.   
  39. NTSTATUS  
  40. FsfPassThrough (  
  41.     __in struct _DEVICE_OBJECT *DeviceObject,  
  42.     __inout struct _IRP *Irp  
  43.     );  
  44.   
  45. NTSTATUS  
  46. FsfCreate (  
  47.     __in struct _DEVICE_OBJECT *DeviceObject,  
  48.     __inout struct _IRP *Irp  
  49.     );  
  50.   
  51. NTSTATUS  
  52. FsfRead (  
  53.     __in struct _DEVICE_OBJECT *DeviceObject,  
  54.     __inout struct _IRP *Irp  
  55.     );  
  56.   
  57. NTSTATUS  
  58. FsfWrite (  
  59.     __in struct _DEVICE_OBJECT *DeviceObject,  
  60.     __inout struct _IRP *Irp  
  61.     );  
  62.   
  63. NTSTATUS  
  64. FsfFsControl (  
  65.     __in struct _DEVICE_OBJECT *DeviceObject,  
  66.     __inout struct _IRP *Irp  
  67.     );  
  68.   
  69. NTSTATUS  
  70. FsfCleanupClose (  
  71.     __in struct _DEVICE_OBJECT *DeviceObject,  
  72.     __inout struct _IRP *Irp  
  73.     );  
  74.   
  75. /*--------Fast Io Dispatch--------*/  
  76. BOOLEAN  
  77. FsfFastIoCheckIfPossible (  
  78.     __in struct _FILE_OBJECT *FileObject,  
  79.     __in PLARGE_INTEGER FileOffset,  
  80.     __in ULONG Length,  
  81.     __in BOOLEAN Wait,  
  82.     __in ULONG LockKey,  
  83.     __in BOOLEAN CheckForReadOperation,  
  84.     __out PIO_STATUS_BLOCK IoStatus,  
  85.     __in struct _DEVICE_OBJECT *DeviceObject  
  86.     );  
  87.   
  88. BOOLEAN  
  89. FsfFastIoRead (  
  90.     __in struct _FILE_OBJECT *FileObject,  
  91.     __in PLARGE_INTEGER FileOffset,  
  92.     __in ULONG Length,  
  93.     __in BOOLEAN Wait,  
  94.     __in ULONG LockKey,  
  95.     __out PVOID Buffer,  
  96.     __out PIO_STATUS_BLOCK IoStatus,  
  97.     __in struct _DEVICE_OBJECT *DeviceObject  
  98.     );  
  99.   
  100. BOOLEAN  
  101. FsfFastIoWrite (  
  102.     __in struct _FILE_OBJECT *FileObject,  
  103.     __in PLARGE_INTEGER FileOffset,  
  104.     __in ULONG Length,  
  105.     __in BOOLEAN Wait,  
  106.     __in ULONG LockKey,  
  107.     __in PVOID Buffer,  
  108.     __out PIO_STATUS_BLOCK IoStatus,  
  109.     __in struct _DEVICE_OBJECT *DeviceObject  
  110.     );  
  111.   
  112. BOOLEAN  
  113. FsfFastIoQueryBasicInfo (  
  114.     __in struct _FILE_OBJECT *FileObject,  
  115.     __in BOOLEAN Wait,  
  116.     __out PFILE_BASIC_INFORMATION Buffer,  
  117.     __out PIO_STATUS_BLOCK IoStatus,  
  118.     __in struct _DEVICE_OBJECT *DeviceObject  
  119.     );  
  120.   
  121. BOOLEAN  
  122. FsfFastIoQueryStandardInfo (  
  123.     __in struct _FILE_OBJECT *FileObject,  
  124.     __in BOOLEAN Wait,  
  125.     __out PFILE_STANDARD_INFORMATION Buffer,  
  126.     __out PIO_STATUS_BLOCK IoStatus,  
  127.     __in struct _DEVICE_OBJECT *DeviceObject  
  128.     );  
  129.   
  130. BOOLEAN  
  131. FsfFastIoLock (  
  132.     __in struct _FILE_OBJECT *FileObject,  
  133.     __in PLARGE_INTEGER FileOffset,  
  134.     __in PLARGE_INTEGER Length,  
  135.     __in PEPROCESS ProcessId,  
  136.     __in ULONG Key,  
  137.     __in BOOLEAN FailImmediately,  
  138.     __in BOOLEAN ExclusiveLock,  
  139.     __out PIO_STATUS_BLOCK IoStatus,  
  140.     __in struct _DEVICE_OBJECT *DeviceObject  
  141.     );  
  142.   
  143. BOOLEAN  
  144. FsfFastIoUnlockSingle (  
  145.     __in struct _FILE_OBJECT *FileObject,  
  146.     __in PLARGE_INTEGER FileOffset,  
  147.     __in PLARGE_INTEGER Length,  
  148.     __in PEPROCESS ProcessId,  
  149.     __in ULONG Key,  
  150.     __out PIO_STATUS_BLOCK IoStatus,  
  151.     __in struct _DEVICE_OBJECT *DeviceObject  
  152.     );  
  153.   
  154. BOOLEAN  
  155. FsfFastIoUnlockAll (  
  156.     __in struct _FILE_OBJECT *FileObject,  
  157.     __in PEPROCESS ProcessId,  
  158.     __out PIO_STATUS_BLOCK IoStatus,  
  159.     __in struct _DEVICE_OBJECT *DeviceObject  
  160.     );  
  161.   
  162. BOOLEAN  
  163. FsfFastIoUnlockAllByKey (  
  164.     __in struct _FILE_OBJECT *FileObject,  
  165.     __in PVOID ProcessId,  
  166.     __in ULONG Key,  
  167.     __out PIO_STATUS_BLOCK IoStatus,  
  168.     __in struct _DEVICE_OBJECT *DeviceObject  
  169.     );  
  170.   
  171. BOOLEAN  
  172. FsfFastIoDeviceControl (  
  173.     __in struct _FILE_OBJECT *FileObject,  
  174.     __in BOOLEAN Wait,  
  175.     __in_opt PVOID InputBuffer,  
  176.     __in ULONG InputBufferLength,  
  177.     __out_opt PVOID OutputBuffer,  
  178.     __in ULONG OutputBufferLength,  
  179.     __in ULONG IoControlCode,  
  180.     __out PIO_STATUS_BLOCK IoStatus,  
  181.     __in struct _DEVICE_OBJECT *DeviceObject  
  182.     );  
  183.   
  184. VOID  
  185. FsfFastIoDetachDevice (  
  186.     __in struct _DEVICE_OBJECT *SourceDevice,  
  187.     __in struct _DEVICE_OBJECT *TargetDevice  
  188.     );  
  189.   
  190. BOOLEAN  
  191. FsfFastIoQueryNetworkOpenInfo (  
  192.     __in struct _FILE_OBJECT *FileObject,  
  193.     __in BOOLEAN Wait,  
  194.     __out struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,  
  195.     __out struct _IO_STATUS_BLOCK *IoStatus,  
  196.     __in struct _DEVICE_OBJECT *DeviceObject  
  197.     );  
  198.   
  199. BOOLEAN  
  200. FsfFastIoMdlRead (  
  201.     __in struct _FILE_OBJECT *FileObject,  
  202.     __in PLARGE_INTEGER FileOffset,  
  203.     __in ULONG Length,  
  204.     __in ULONG LockKey,  
  205.     __out PMDL *MdlChain,  
  206.     __out PIO_STATUS_BLOCK IoStatus,  
  207.     __in struct _DEVICE_OBJECT *DeviceObject  
  208.     );  
  209.   
  210. BOOLEAN  
  211. FsfFastIoMdlReadComplete (  
  212.     __in struct _FILE_OBJECT *FileObject,  
  213.     __in PMDL MdlChain,  
  214.     __in struct _DEVICE_OBJECT *DeviceObject  
  215.     );  
  216.   
  217. BOOLEAN  
  218. FsfFastIoPrepareMdlWrite (  
  219.     __in struct _FILE_OBJECT *FileObject,  
  220.     __in PLARGE_INTEGER FileOffset,  
  221.     __in ULONG Length,  
  222.     __in ULONG LockKey,  
  223.     __out PMDL *MdlChain,  
  224.     __out PIO_STATUS_BLOCK IoStatus,  
  225.     __in struct _DEVICE_OBJECT *DeviceObject  
  226.     );  
  227.   
  228. BOOLEAN  
  229. FsfFastIoWriteComplete (  
  230.     __in struct _FILE_OBJECT *FileObject,  
  231.     __in PLARGE_INTEGER FileOffset,  
  232.     __in PMDL MdlChain,  
  233.     __in struct _DEVICE_OBJECT *DeviceObject  
  234.     );  
  235.   
  236. BOOLEAN  
  237. FsfFastIoReadCompressed (  
  238.     __in struct _FILE_OBJECT *FileObject,  
  239.     __in PLARGE_INTEGER FileOffset,  
  240.     __in ULONG Length,  
  241.     __in ULONG LockKey,  
  242.     __out PVOID Buffer,  
  243.     __out PMDL *MdlChain,  
  244.     __out PIO_STATUS_BLOCK IoStatus,  
  245.     __out struct _COMPRESSED_DATA_INFO *CompressedDataInfo,  
  246.     __in ULONG CompressedDataInfoLength,  
  247.     __in struct _DEVICE_OBJECT *DeviceObject  
  248.     );  
  249.   
  250. BOOLEAN  
  251. FsfFastIoWriteCompressed (  
  252.     __in struct _FILE_OBJECT *FileObject,  
  253.     __in PLARGE_INTEGER FileOffset,  
  254.     __in ULONG Length,  
  255.     __in ULONG LockKey,  
  256.     __in PVOID Buffer,  
  257.     __out PMDL *MdlChain,  
  258.     __out PIO_STATUS_BLOCK IoStatus,  
  259.     __in struct _COMPRESSED_DATA_INFO *CompressedDataInfo,  
  260.     __in ULONG CompressedDataInfoLength,  
  261.     __in struct _DEVICE_OBJECT *DeviceObject  
  262.     );  
  263.   
  264. BOOLEAN  
  265. FsfFastIoReadCompleteCompressed (  
  266.     __in struct _FILE_OBJECT *FileObject,  
  267.     __in PMDL MdlChain,  
  268.     __in struct _DEVICE_OBJECT *DeviceObject  
  269.     );  
  270.   
  271. BOOLEAN  
  272. FsfFastIoWriteCompleteCompressed (  
  273.     __in struct _FILE_OBJECT *FileObject,  
  274.     __in PLARGE_INTEGER FileOffset,  
  275.     __in PMDL MdlChain,  
  276.     __in struct _DEVICE_OBJECT *DeviceObject  
  277.     );  
  278.   
  279. BOOLEAN  
  280. FsfFastIoQueryOpen (  
  281.     __inout struct _IRP *Irp,  
  282.     __out PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,  
  283.     __in struct _DEVICE_OBJECT *DeviceObject  
  284.     );  
  285.   
  286. VOID  
  287. FsfFsNotification (  
  288.     __in struct _DEVICE_OBJECT *DeviceObject,  
  289.     __in BOOLEAN FsActive  
  290.     );  
  291. #endif  

猜你喜欢

转载自blog.csdn.net/snowfoxmonitor/article/details/80549783