轉自:http://blog.csdn.net/leehq/article/details/3959565
* 打開文件系統對象的特殊方式
文件系統驅動接收到IRP請求IRP_MJ_CREATE時,若是IrpSp->Flags指定了 SL_OPEN_TARGET_DIRECTORY,則表示並非真的要打開指定的文件系統對象,而是要檢查對象是否能夠刪除已經它所在的目錄是否能夠進行建立操做。 一般這樣的請求會發生在重命名文件系統對象以前。
* 文件系統驅動處理相對路徑
處理IRP_MJ_CREATE時,若是IRP的FileObject使用的相對路徑,能夠經過FileObject的RelatedFileObject得到相對路徑所在的目錄信息。
* 提供正確的存儲空間信息
處理IRP_MJ_QUERY_VOLUME_INFORMATION時,若是要查詢的信息類型爲FileFsSizeInformation或者 FileFsFullSizeInformation,必須沒有提供正確的存儲空間參數,可能會形成資源管理器查看文件屬性時崩潰。尤爲是信息結構的 BytesPerSector成員,千萬不要設置爲0。
* 支持文件的內存映射
Windows的文件內存映射機制可以緩解文件的IO次數,好比CreateFileMapping函數。要實現最基本的文件映射支持,文件系統驅動必須在處理IRP_MJ_CREATE時給FileObject的SectionObjectPointer成員賦值,並設置 SectionObjectPointer的成員都爲NULL值。FileObject的FsContext成員必須指向一塊已分配的並所有填充爲0的內存區,這塊內存區的大小不能小於FSRTL_COMMON_FCB_HEADER類型的字節數。在處理IRP_MJ_CLEANUP時,若是 FileObject的SectionObjectPointer的DataSectionObject成員不爲NULL,應該調用 CcPurgeCacheSection函數清除緩存管理器產生的數據。
* 正確處理IRP_MJ_CREATE
文件系統驅動的IRP_MJ_CREATE不只要處理打開文件或目錄,還要處理打開卷。若是FileObject的FileName字節數爲0,則表示要打開的是卷。
* FltRegisterFilter函數返回STATUS_OBJECT_NAME_NOT_FOUND
一個文件系統迷你過濾驅動的註冊表項(HKLM/System/CurrentControlSet/Services/<驅動的服務名>) 下面必須有一個名爲"Instances"的子項用於存放驅動的實例信息,該子項下面的字符串值"DefaultInstance"指定了默認實例的名稱。"Instances"項下面的每個子項表示一個實例,每一個實例子項必須有一個字符串值"Altitude"。
FltRegisterFilter函數執行時,若是在註冊表中沒有找到默認實例的"Altitude"值,將會返回STATUS_OBJECT_NAME_NOT_FOUND錯誤。緩存