1. 程式人生 > >一個簡單的檔案系統過濾驅動框架

一個簡單的檔案系統過濾驅動框架

 很多人認為檔案系統過濾驅動很複雜,其實也有一定道理,因為需要有很多細節需要考慮到,這是一個簡單的檔案系統過濾驅動,拋去了大部分細節,留下了一個簡單的框架,其實這樣檔案系統過濾驅動就變得蠻簡單的,很多介面可以不用實現,只要知道大致流程,其它都將會很清晰。

  1. #define DBG 1
  2. #include <ntifs.h>
  3. #include "fsfilter.h"
  4. PDEVICE_OBJECT g_Cdo;  
  5. PDRIVER_OBJECT g_MyDriver;  
  6. NTSTATUS   
  7. DriverEntry (   
  8.     __in struct _DRIVER_OBJECT  *DriverObject,  
  9.     __in PUNICODE_STRING  RegistryPath   
  10.     )  
  11. {  
  12.     int i = 0;  
  13.     UNICODE_STRING DeviceName;  
  14.     NTSTATUS Status;  
  15.     KdPrintThisFunction();  
  16.     g_MyDriver = DriverObject;  
  17.     for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {  
  18.         DriverObject->MajorFunction[i] = FsfPassThrough;  
  19.     }  
  20.     DriverObject->MajorFunction[IRP_MJ_CREATE] = FsfCreate;  
  21.     DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = FsfCreate;  
  22.     DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = FsfCreate;  
  23.     DriverObject->MajorFunction[IRP_MJ_READ] = FsfRead;  
  24.     DriverObject->MajorFunction[IRP_MJ_WRITE] = FsfWrite;  
  25.     DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = FsfFsControl;  
  26.     DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FsfCleanupClose;  
  27.     DriverObject->MajorFunction[IRP_MJ_CLOSE] = FsfCleanupClose;  
  28.     DriverObject->FastIoDispatch = (PFAST_IO_DISPATCH)ExAllocatePool(NonPagedPool, sizeof(FAST_IO_DISPATCH));  
  29.     if (DriverObject->FastIoDispatch == NULL) {  
  30.         KdPrint((FSF_MODULE_NAME_PREFIX "Allocate fast io dispatch rotine memory failed.\n"));  
  31.         return STATUS_FAILED_DRIVER_ENTRY;  
  32.     }  
  33.     RtlZeroMemory(DriverObject->FastIoDispatch, sizeof(FAST_IO_DISPATCH));  
  34.     DriverObject->FastIoDispatch->SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);  
  35.     DriverObject->FastIoDispatch->FastIoCheckIfPossible = FsfFastIoCheckIfPossible;  
  36.     DriverObject->FastIoDispatch->FastIoRead = FsfFastIoRead;  
  37.     DriverObject->FastIoDispatch->FastIoWrite = FsfFastIoWrite;  
  38.     DriverObject->FastIoDispatch->FastIoQueryBasicInfo = FsfFastIoQueryBasicInfo;  
  39.     DriverObject->FastIoDispatch->FastIoQueryStandardInfo = FsfFastIoQueryStandardInfo;  
  40.     DriverObject->FastIoDispatch->FastIoLock = FsfFastIoLock;  
  41.     DriverObject->FastIoDispatch->FastIoUnlockSingle = FsfFastIoUnlockSingle;  
  42.     DriverObject->FastIoDispatch->FastIoUnlockAll = FsfFastIoUnlockAll;  
  43.     DriverObject->FastIoDispatch->FastIoUnlockAllByKey = FsfFastIoUnlockAllByKey;  
  44.     DriverObject->FastIoDispatch->FastIoDeviceControl = FsfFastIoDeviceControl;  
  45.     DriverObject->FastIoDispatch->FastIoDetachDevice = FsfFastIoDetachDevice;  
  46.     DriverObject->FastIoDispatch->FastIoQueryNetworkOpenInfo = FsfFastIoQueryNetworkOpenInfo;  
  47.     DriverObject->FastIoDispatch->MdlRead = FsfFastIoMdlRead;  
  48.     DriverObject->FastIoDispatch->MdlReadComplete = FsfFastIoMdlReadComplete;  
  49.     DriverObject->FastIoDispatch->PrepareMdlWrite = FsfFastIoPrepareMdlWrite;  
  50.     DriverObject->FastIoDispatch->MdlWriteComplete = FsfFastIoWriteComplete;  
  51.     DriverObject->FastIoDispatch->FastIoReadCompressed = FsfFastIoReadCompressed;  
  52.     DriverObject->FastIoDispatch->FastIoWriteCompressed = FsfFastIoWriteCompressed;  
  53.     DriverObject->FastIoDispatch->MdlReadCompleteCompressed = FsfFastIoReadCompleteCompressed;  
  54.     DriverObject->FastIoDispatch->MdlWriteCompleteCompressed = FsfFastIoWriteCompleteCompressed;  
  55.     DriverObject->FastIoDispatch->FastIoQueryOpen = FsfFastIoQueryOpen;  
  56.     DriverObject->DriverUnload = FsfUnload;  
  57.     // 生成一個控制裝置 CDO
  58.     RtlInitUnicodeString(&DeviceName, L"\\FileSystem\\Filters\\FsFilter");  
  59.     Status = IoCreateDevice(DriverObject,  
  60.                             0,  
  61.                             &DeviceName,  
  62.                             FILE_DEVICE_DISK_FILE_SYSTEM,  
  63.                             FILE_DEVICE_SECURE_OPEN,  
  64.                             FALSE,  
  65.                             &g_Cdo);  
  66.     if (!NT_SUCCESS(Status)) {  
  67.         KdPrint((FSF_MODULE_NAME_PREFIX "Create the device failed.\n"));  
  68.         goto Fail;  
  69.     }  
  70.     // 設定檔案系統載入和登出回撥
  71.     Status = IoRegisterFsRegistrationChange(DriverObject, FsfFsNotification);  
  72.     if (!NT_SUCCESS(Status)) {  
  73.         KdPrint((FSF_MODULE_NAME_PREFIX "Register file system chang notification failed!\n"));  
  74.         goto Fail;  
  75.     }  
  76.     return STATUS_SUCCESS;  
  77. Fail:  
  78.     if (DriverObject->FastIoDispatch != NULL) {  
  79.         ExFreePool(DriverObject->FastIoDispatch);  
  80.     }  
  81.     if (g_Cdo != NULL) {  
  82.         IoDeleteDevice(g_Cdo);  
  83.     }  
  84.     return Status;  
  85. }  
  86. NTSTATUS  
  87. FsfPassThrough (  
  88.     __in struct _DEVICE_OBJECT *DeviceObject,  
  89.     __inout struct _IRP *Irp  
  90.     )  
  91. {  
  92.     PFSF_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;  
  93.     IoSkipCurrentIrpStackLocation(Irp);  
  94.     return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);  
  95. }  
  96. VOID
  97. FsfUnload (  
  98.     __in struct _DRIVER_OBJECT *DriverObject  
  99.     )  
  100. {  
  101.     PDEVICE_OBJECT MyDevice;  
  102.     KdPrintThisFunction();  
  103.     IoUnregisterFsRegistrationChange(DriverObject, FsfFsNotification);  
  104.     MyDevice = DriverObject->DeviceObject;  
  105.     while (MyDevice != NULL) {  
  106.         PDEVICE_OBJECT TempDevice = MyDevice->NextDevice;  
  107.         // 如果是不是我的控制裝置,則面要解除附加
  108.         if (!IsMyControlDeivce(MyDevice)) {  
  109.             // 如果是檔案系統控制裝置的過濾裝置或檔案系統卷裝置的過濾裝置
  110.             if (IsMyFilterDevice(MyDevice)) {  
  111.                 PFSF_DEVICE_EXTENSION DeviceExtension = MyDevice->DeviceExtension;  
  112.                 IoDetachDevice(DeviceExtension->AttachedToDeviceObject);  
  113.                 KdPrintWithFuncPrefix("Deattach the fs cdo or volime filter.\n");  
  114.             }  
  115.         }  
  116.         IoDeleteDevice(MyDevice);  
  117.         MyDevice = TempDevice;  
  118.     }  
  119. }  
  120. NTSTATUS  
  121. FsfReadCompletion (  
  122.     __in PDEVICE_OBJECT DeviceObject,  
  123.     __in PIRP Irp,  
  124.     __in_xcount_opt("varies"PVOID Context  
  125.     )  
  126. {  
  127.     PKEVENT WaitEvent = Context;  
  128.     KeSetEvent(WaitEvent, IO_NO_INCREMENT, FALSE);  
  129.     return STATUS_MORE_PROCESSING_REQUIRED;  
  130. }  
  131. NTSTATUS  
  132. FsfCreate (  
  133.     __in struct _DEVICE_OBJECT *DeviceObject,  
  134.     __inout struct _IRP *Irp  
  135.     )  
  136. {  
  137.     PFSF_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;  
  138.     PIO_STACK_LOCATION IoStackLocation = IoGetCurrentIrpStackLocation(Irp);  
  139.     KEVENT WaitEvent;  
  140.     NTSTATUS Status;  
  141.     POBJECT_NAME_INFORMATION NameInfo;  
  142.     char Buffer[512] = {0};  
  143.     ULONG

    相關推薦

    一個簡單檔案系統過濾驅動框架

     很多人認為檔案系統過濾驅動很複雜,其實也有一定道理,因為需要有很多細節需要考慮到,這是一個簡單的檔案系統過濾驅動,拋去了大部分細節,留下了一個簡單的框架,其實這樣檔案系統過濾驅動就變得蠻簡單的,很多介面可以不用實現,只要知道大致流程,其它都將會很清晰。#define DBG

    檔案系統過濾驅動開發(一)—Win32底層開發小組

        宣告:本文無太多新意,只是介紹下學習經驗,大神級人物(如總監大人)請略過,謝謝合作>_<     吐槽一下:學驅動算起來也是從上學期9月份開始吧,之前在家買了<Windows驅動開發技術詳解>這本書,搭了個環境之後,其實也沒碰很多,編了個經典的Hello,World!之後就無

    整理一份我對Windows檔案系統過濾驅動的sFilter工程程式碼的詳細說明(精華僑)

    標 題: 【分享】整理一份我對Windows檔案系統過濾驅動的sFilter工程程式碼的詳細說明 作 者: tianhz 時 間: 2012-06-19,18:32:07 鏈 接: http://bbs.pediy.com/showthread.php?t=1523

    Windows檔案系統過濾驅動中開啟檔案時如何避免重入

    呼叫下面的函式可以避免在打開回調中開啟新的檔案的時候引起重入 NTSTATUS IoCreateFileSpecifyDeviceObjectHint( __out PHANDLE FileHandle, __in ACCESS_MASK Desir

    程式碼:編寫一個簡單的字元裝置驅動(自動建立裝置檔案

    說明: (1)該篇在上篇的基礎上實現了自動建立裝置檔案的功能; (2)自動建立檔案主要用到了class_create()、device_create()兩個函式,宣告在inclue/linux/device.h裡; (3)裝置檔案的建立和銷燬放在模組載入和解除安裝函式中;

    嵌入式Linux驅動開發(一)一個簡單的Linux核心模組框架

    #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> static

    pyFormUI: 一個簡單的Python GUI介面框架

    Python開發GUI介面, 可以使用pyQT或者wxpython。 不過不論pyQT還是wxpython都需要比較多的學習成本。Python工程往往是用於快速開發的,有些時候引入pyQT,wxpython會讓python工程變得比較複雜。 在很多情況下,python開發的都是命令列程式,使用者

    [原始碼和文件分享]基於C語言的簡單檔案系統的實現

    1 題目介紹 通過具體的檔案儲存空間的管理、檔案物理結構、目錄結構和檔案操作的實現,加深對檔案系統內部的資料結構、功能以及實現過程的理解。 1.1 要求 在記憶體中開闢一個虛擬磁碟空間作為檔案儲存分割槽,在其上實現一個簡單的基於多級目錄的單使用者單任務系統中的檔案系統。在推出該檔

    一個簡單後臺系統的開發

    大概花了4,5天時間,做了一個對資料庫幾張表的維護的系統,採用的是MVC4+easyui構建,先附上幾張截圖讓大家瞭解下: 功能無非就是,增,刪,改,查,分頁顯示,功能很簡單,但是,主要是講下碰到的幾個問題: 一,大家都知道,通過點選左邊的選單,會在右邊產生tab頁面,一個頁面沒什麼,

    通過記憶體模擬硬碟實現一個簡單的塊裝置驅動

    本文的主要工作是通過硬碟來模擬記憶體,按照塊裝置驅動程式設計的框架實現一個簡單的塊裝置驅動程式。 一、前期的準備工作 1、基本開發環境 Linux核心版本:Linux-3.4.10 開發板 : JZ2440(ARM9) 2、塊裝置驅動的一般開發步驟 a、分配一個gendi

    linux裝置驅動第三篇:寫一個簡單的字元裝置驅動

    在linux裝置驅動第一篇:裝置驅動程式簡介中簡單介紹了字元驅動,本篇簡單介紹如何寫一個簡單的字元裝置驅動。本篇借鑑LDD中的原始碼,實現一個與硬體裝置無關的字元裝置驅動,僅僅操作從核心中分配的一些記憶體。 下面就開始學習如何寫一個簡單的字元裝置驅動。首先我們來分解一下字元

    程式碼:編寫一個簡單的字元裝置驅動——建立多個同類型裝置

    編寫同類型多個裝置字元驅動應注意一下幾個問題: 1、申請裝置號alloc_chrdev_region時須指定次裝置號範圍; 2、動態分配裝置空間時同時分配NUM個裝置的空間; 3、根據次裝置號和統一的主裝置號生成針對單個裝置的devno,然後完成cdev_add註冊; 4、

    檔案系統Minifilter驅動(一)

    檔案系統Minifilter驅動 宣告: 本系列文章源於WDK,所有權利歸原作者所有,翻譯的目的只為交流和學習。 說明: 所有preoperation及postoperation均簡寫為pre-oper和post-oper 所有檔案系統過濾驅動均簡寫為FS

    一個簡單的後端驗證框架

    1.前端驗證框架用jquery validate即可滿足; 2.後端驗證框架有hibernate validate,可以滿足大部分的驗證功能。但是該驗證框架不能指定順序單獨返回錯誤資訊,例如在一個介面呼叫中,我想實現指定引數順序單個返回驗證提示資訊。如是自己寫了一個簡單的驗

    Sfilter過濾驅動框架

    原理 Sfilter框架是基於NT驅動框架之上通過裝置棧繫結的形式繫結的,驅動自己生成一個裝置(過濾裝置物件),呼叫系統提供的繫結API,繫結到目標裝置上。並返回一個在未繫結之前目標裝置所在裝置棧的最頂層裝置。這樣發往下層的IRP或者發往上層的資料都會被過濾裝

    如何實現一個簡單教務系統的課程表查詢

    一、設計思路1.     首先做好課程表靜態頁面(可用Sublime,Dreawvear等開發工具編寫,本人用Sublime編寫,程式碼稍後附上)2.     資料庫設計(可用access資料庫、sql資料庫或者mysql資料庫,根據自己習慣選用資料庫,本人選用access資

    解決安裝ubuntu18.04分割槽後出現SCSI......第...分割槽...裝置的一個vfat檔案系統掛載到/boot/efi失敗

    答案就是進bios,關閉裝有其它系統硬碟的供電。不要問我為什麼這樣做。實踐出真章。 在未關閉另一塊硬碟時,博主重灌ubuntu不下10次,都以失敗告終。在網路上搜索找到的答案都不對。 完整error message:  “SCSI 4(0,0,0), 第一分割槽(sd

    杭州電子科技大學作業系統課程設計:簡單檔案系統的實現

    emmmm想寫一個作業系統的課程設計說明,因為自己寫的時候也遇到了好多問題,外加感覺對實驗指導書的說明有些疑問,覺得寫出來可以給別人看看。但是感覺寫出來的東西……沒什麼好看的。 因為這個系統還是有點複雜,但是自己又沒有太多的時間和能力把這個複雜的系統說清楚

    檔案系統Minifilter驅動(十)

    在Minifilter驅動中管理上下文 上下文是minifilter驅動定義的一個結構,可以與一個filter管理器物件關聯起來. Minifilter驅動可以為以下型別的物件建立和設定上下文:  · 檔案(僅Vista及以後版本.)  · 例項 · 卷 · 流

    Nginx開發一個簡單的HTTP過濾模組

    開發一個HTTP過濾模組的步驟和相關知識跟開發一個普通的HTTP模組是類似的,只不過HTTP過濾模組的地位、作用與正常的HTTP過濾模組不同,它的工作是對傳送給使用者的HTTP響應包做一些加工。 本文將學習開發一個簡單的HTTP過濾模組,它能夠對Content