Windows檔案過濾驅動經驗總結

來源:互聯網
上載者:User

看了 ChuKuangRen 的第二版《檔案過濾驅動開發教程》後,頗有感觸。我想,交流都是 建立在平等的基礎上,在抱怨氛圍和環境不好的同時應該先想一想自己究竟付出了多少?只 知索取不願付出的人也就不用抱怨了,要怪也只能怪自己。發自己心得的人無非是兩種目的 ,一是引發一些討論,好糾正自己錯誤的認識,以便從中擷取更多的知識使自己進步的更快 。二是做一份備忘,當自己遺忘的時候能夠馬上找到相關資料。我這裡也總結了近幾年做文 件過濾驅動時所積累下來的一些小小經驗,這分筆記也是看了 ChuKuangRen 的教程後,臨時 想到的一小部分而已,是想到哪寫到哪,不是很全,如果以後再回想起什麼也會不斷補充。 因其工作原因,近段時間在 SOLARIS 驅動與 Linux 核心方面投入的精力比較多,Windows 下的檔案過濾驅動一直也沒有怎麼去碰,所以最後還是那句老話 FIXME。

1、獲得文 件全路徑以及判斷時機

除在所有 IRP_MJ_XXX 之前自己從頭建立 IRP 發送到下層設 備查詢全路徑外,不要嘗試在 IRP_MJ_CREATE 以外的地方獲得全路徑,因為只有在 IRP_MJ_CREATE

中才會使用 ObCreateObject() 來建立一個有效 FILE_OBJECT。而 在 IRP_READ IRP_WRITE 中它們是直接操作 FCB (File Control Block)的。

2、從頭 建立 IRP 發送關注點

無論你建立什麼樣的 IRP,是 IRP_MJ_CREATE 也好還是 IRP_MJ_DIRECTORY_CONTROL也罷,最要提醒的就是一些標誌。不同的標誌會代來不同的結果 ,有些結果是直接返回失敗。這裡指的標誌不光是 IRP->Flags,還要考慮 IO_STACK_LOCATION->Flags還有其它等等。尤其是你要達到一些特殊目的,這時候更需要 注意,如 IRP_MN_QUERY_DIRECTORY,不同的標誌結果有很大的不同。

3、從頭建立 IRP 擷取全路徑注意點

自己從頭建立一個 IRP_MJ_QUERY_INFORMATION 的 IRP 擷取 全路徑時需要注意,不僅在 IRP_MJ_CREATE 要做區別處理,在 IRP_MJ_CLOSE 也要做同樣的 處理,否則如果目標是 NTFS 檔案系統的話可能產生 deadlock。如果是 NTFS 那麼在 IRP_MJ_CLEANUP 的時候也需要對 FO_STREAM_FILE 類型的檔案做同樣處理。

4、獲得 本地/遠端存取使用者名稱(網域名稱/SID)

方法只有在 IRP_MJ_CREATE 中才可用,那是因為 IO_SECURITY_CONTEXT 只有在 IO_STACK_LOCATION- >Parameters.Create.SecurityContext 才會有效。這樣你才有可能從 IO_SECURITY_CONTEXT->SecurityContext->AccessState- >SubjectSecurityContext.XXXToken 中獲得訪問 TOKEN,從而進一步得到使用者名稱或 SID 。記得 IFS 中有一個庫,它的 LIB 匯出一個函數可以讓你在獲得以上資訊後得到使用者名稱與 網域名稱。但如果你想相容 NT4 的話,只能自己分析來得出本地和遠端 SID。

5、檔案 與目錄的判斷

正確的方法在楚狂人的文檔裡已經說過了,再補充一句。如果你的檔案 過濾驅動要相容所有檔案系統,那麼不要十分相信從 FileObject->FsContext 裡取得的 資料。正確的方法還是在你傳遞下去 IRP_MJ_CREATE 後從最下層檔案系統延裝置棧返回到你 這裡後再獲得。

6、加/解密中判斷點

只判斷 IRP_PAGING_IO, IRP_SYNCHRONOUS_PAGING_IO,IRP_NOCACHE 是沒錯的。如果有問題,相信是自己的問題。關 於有人提到在 FILE_OBJECT->Flags中的 FO_NO_INTERMEDIATE_BUFFERING 是否需要判斷 ,對此問題的回答是只要你判斷了 IRP_NOCACHE 就不用再判斷 FILE_OBJECT 中的,因為它 最終會設定 IRP->Flags 為 IRP_NOCACHE。關於你看到的諸如 IRP_DEFER_IO_COMPLETION 等 IRP 不要去管它,因為它只是一個過程。最終讀寫還是如上所介紹。至於以上這些 IRP 哪個是由 CC MGR 發送的,哪些是由 I/O MGR 發送和在什麼時候發送的,這個已經有很多討 論了,相信可以找到。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.