前面說了關於sfilter的裝置的掛載,主要是針對deviceobject, 通過將驅動建立多個過濾裝置,掛載到系統的卷裝置上, 系統就會將所有到該卷的irp操作都重定向到我們的驅動派遣函式中
接著,我們這裡要分析關於針對檔案的操作了,經過幾天的研究,發現了幾個有趣的地方,首先了解下大致的流程。
irp_mj_create: 建立檔案例程
首先,我們操作檔案的時候,都要先開啟乙個檔案,有些使用notepad.exe開啟,有些是word.exe, 有些是winrar.exe之類的,所有的檔案都需要由某個應用程式的程序來開啟,實際上,內部的操作,應該都是該應用程式的操作,例如:createfile(), readfile(), writefile()之類的。(你也可以自己寫乙個程序,然後開啟某個路徑的檔案,那麼此時開啟該檔案的控制代碼,就是你所寫的程序所開啟的控制代碼)。
所以首先,我們一般handle hfilehandle=createfile(read|write); 這樣開啟乙個檔案的時候,nt的i/o管理器就會產生乙個irp請求,並且如果此時載入了我們的過濾驅動,那麼該操作就會被我們捕獲,這樣nt的i/o管理器會將該irp請求(create)的請求傳送給了我們之前附加的最頂層的過濾裝置,然後重定向到我們的驅動中的irp_mj_create中註冊的函式中來(強調一次: 每個i/o管理器的irp請求,都只是針對該操作產生一次,處理完就會釋放掉,如果有新的操作,那麼就會再次產生新的irp),此時我們的create註冊函式類似這樣:
ntstatus sfcreate( in pdevice_object deviceobject, in pirp irp )
---deviceobject就是過濾裝置,irp就是該次的i/o請求
我這裡做的測試是,開啟乙個text檔案,然後編輯新增幾個位元組,關閉。
通過列印除錯,我們看到sfcreate()有多次進入,在sfcreate()的時候,該fileobject是會變化的,並且此時的
fileobject->fscontext都是null,但是後面出現irp的read和irp的write請求的時候,我們找到了其中的乙個fileobject, 這個
fileobject->fscontext的指標是不為null的,並且read和write的兩個不同的irp的請求的指標是一樣的。
例如這個日誌列印:
sfcreate!-----fileobject=87017428,filepath path=c:\users\cloud\desktop\1111.txt, context=00000000, context2=00000000;
pfpread! equal--!filepath=c:\users\cloud\desktop\1111.txt,fileobject=8700d490,context=a339b860
pfpread! equal--!filepath=c:\users\cloud\desktop\1111.txt,fileobject=8700d490, pfcb->opencount=4
sfwrite! equal--!filepath=c:\users\cloud\desktop\1111.txt,fileobject=886e28c8, context=a339b860
sfwrite! equal--!filepath=c:\users\cloud\desktop\1111.txt,fileobject=886e28c8, pfcb->opencount=2
也就是說,我們看到不同的irp請求的fileobject都是不一樣的,但是關鍵的fileobject->context是一樣的,所以我們可以自己建立乙個鍊錶,用於create的時候,通過判斷,我們記錄對應的檔名稱是要加密或者解密的,然後在read和write的時候,找到該檔案鍊錶,並且通過將context記錄到該鍊錶中,後面就可以通過這個指標是否相同來判斷,是否是乙個相同的檔案流控制代碼,主要是很多情況下,我們應用層明明只開啟了乙個檔案,但是系統內部會有很多個針對該檔案不同的操作,例如不同的irp_read還有fastioread之類的,所以我們要有手段來識別什麼是相同的檔案流。
搞定了上面說的相同的檔案流的讀和寫的識別,那麼我們接下來就可以針對資料進行處理了。
可以參考好文:
---sfilter框架理解
二 檔案與目錄
struct stat include include include int open char pathname,int o mode t mode 返回檔案描述符 include int close int fd 關閉檔案 include ssize t read int fd,void bu...
SpringBoot (二) 檔案上傳
新建乙個springboot專案 springboot uploadfile 工程目錄 pom.xml依賴 org.springframework.boot spring boot starter web org.springframework.boot spring boot starter th...
SpringMVC(二) 檔案上傳
傳統檔案上傳回顧 匯入檔案上傳的jar包 commons fileupload commons fileupload 1.3.1 commons io commons io 2.4編寫檔案上傳的jsp頁面 編寫檔案上傳的controller控制器 檔案上傳 建立磁碟檔案項工廠 diskfileite...