導航:首頁 > 凈水問答 > 打開文件過濾驅動失敗

打開文件過濾驅動失敗

發布時間:2022-08-13 09:21:40

① windows10文件驅動過濾

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 發送和在什麼時候發送的,這個已經有很多討論了,相信可以找到。

7、舉例說明關於 IRP 傳遞與完成注意事項

只看 Walter Oney 的那本 《Programming the Microsoft Windows driver model》里介紹的流程,自己沒有實際的體會還是不夠的,那裡只介紹了基礎概念,讓自己有了知識。知道如何用,在什麼情況下用,用哪種方法,能夠用的穩定這叫有了技術。我們從另一個角度出發,把問題分為兩段來看,這樣利於總結。一個 IRP 在過濾驅動中,把它分為需要安裝 CompleteRoutine 的與無需安裝 CompleteRoutine 的。那麼在不需要安裝 CompleteRoutine 的有以下幾類情況。

(1) 拿到這個 IRP 後什麼都不做,直接調用 IoCompleteRequest() 來返回。
(2) 拿到這個 IRP 後什麼都不做,直接傳遞到底層設備,使用IoSkipCurrentIrpStackLocation() 後調用 IoCallDriver() 傳遞。
(3) 使用 IoBuildSynchronousFsdRequest() 或 IoBuildDeviceIoControlRequest()來建立 IRP 的。

以上幾種根據需要直接使用即可,除了一些參數與標志需要注意外,沒有什麼系統機制相關的東西需要注意了。那麼再來看需要安裝 CompleteRoutine 的情況。我們把這種情況再細分為兩種,一是在 CompleteRoutine 中返回標志為STATUS_MORE_PROCESSING_REQUIRED 的情況。二是返回處這個外的標志,需要使用函數IoMarkIrpPending() 的情況。在 CompleteRoutine 中絕大多數就這么兩種情況,你需要使用其中的一種情況。那麼為什麼需要安裝 CompleteRoutine 呢?那是因為我們對其 IRP 從上層驅動,經過我們驅動,在經過底層設備棧返回到我們這一層驅動時需要得到其中內容作為參考依據的,還有對其中內容需要進行修改的。再有一種情況是沒有經過上層驅動,而 IRP 的產生是在我們驅動直接下發到底層驅動,而經過設備棧後返回到我們這一層,且我們不在希望它繼續向上返回的,因為這個 IRP 本身就不是從上層來的。綜上所述,先來看下 IoMarkIrpPending() 的情況。

(1) 在 CompleteRoutine 中判斷 Irp->PendingReturned 並使用 IoMarkIrpPending()然後返回。這種方法在沒有使用 KeSetEvent() 的情況下,且不是自建 IRP 發送到底層驅動返回時使用。也就是說有可能我所做的工作都是在 CompleteRoutine 中進行的。比如加/解密時,我在這里對下層驅動返回數據的判斷並修改。修改後因為沒有使用 STATUS_MORE_PROCESSING_REQUIRED 標志,它會延設備堆一直向上返回並到用戶得到數據為止。這里一定要注意,在這種情況下 CompleteRoutine返回後,不要在碰這個 IRP。也就是說如果這個時候你使用了 IoCompleteRequest()的話會出現一個 MULTIPLE_IRP_COMPLIETE_REQUEST 的 BSOD 錯誤。

(2) 在 CompleteRoutine 中直接返回 STATUS_MORE_PROCESSING_REQUIRED 標志。這種情況在使用了 KeSetEvent() 的函數下出現。這里又有兩個小小的分之。

1) 出現於上層發送到我這里,當我這里使用 IoCallDriver() 後,底層返回數據經過我這一層時,我想讓它暫時停止繼續向上傳遞,讓這個 IRP 稍微歇息一會,等我對這個 IRP 返回的數據操作完成後(一般是沒有在 CompleteRoutine中對返回數據進行操作情況下,也就是說等到完成常式返回後再進行操作),由我來調用 IoCompleteRequest() 讓它延著設備棧繼續返回。這里要注意,我們是想讓它返回的,所以調用了 IoCompleteRequest()。這個可不同於下面所講的自己從頭分配 IRP 時在 CompleteRoutine 中已經調用 IoFreeIrp() 釋放了當前IRP 的情況。比如我在做一個改變文件大小,向文件頭寫入加密標志的驅動時,在上層發來了 IRP_MJ_QUERY_INFORMATION 查詢文件,我想在這個時候獲得文件信息進行判斷,然後根據我的判斷結果再移動文件指針。注意:上面是兩步,第一步是先獲得文件大小,那麼在這個時候我就需要用到上述辦法,先讓這個 IRP傳遞下去,得到我想要的東西後在進行對比。等待適當時機完成這個 IRP,讓數據繼續傳遞,直到用戶收到為止。第二步我會結合下面小節來講。

2) 出現於自己從頭建立 IRP,當使用 IoAllocate() 或 IoBuildAsynchronousFsdRequest()創建 IRP 調用 IoCallDriver() 後,底層返回數據到我這一層時,我不想讓這個 IRP 繼續向上延設備棧傳遞。因為這個 IRP 就是在我這層次建立的,上層本就不知道有這么一個 IRP。那麼到這里我就要在 CompleteRoutine 中使用 IoFreeIrp()來釋放掉這個 IRP,並不讓它繼續傳遞。這里一定要注意,在 CompleteRoutine函數返回後,這個 IRP 已經釋放了,如果這個時候在有任何關於這個 IRP 的操作那麼後果是災難性的,必定導致 BSOD 錯誤。前面 1) 小節給出的例子只完成了第一步這里繼續講第二步,第一步我重用這個 IRP 得到了文件大小,那麼這個時候雖然知道大小,但我還是無法知道這個文件是否被我加過密。這時,我就需要在這里自己從頭建立一個 IRP_MJ_READ 的 IRP 來讀取文件來判斷是否我加密過了的文件,如果是,則要減少相應的大小,然後繼續返回。注意:這里的返回是指讓第一步的IRP 返回。而不是我們自己創建的。我們創建的都已經在CompleteRoutine 中銷毀了。

8、關於完成 IRP 的動作簡介

當一個底層驅動調用了 IoCompleteRequest() 函數時,基本上所有設備棧相關 IRP 處理工作都是在它那裡完成的。包括 IRP->Flags 的一些標志的判斷,對 APC 的處理,拋出MULTIPLE_IRP_COMPLETE_REQUESTS 錯誤等。當它延設備棧一直調用驅動所安裝的 CompleteRoutine時,如果發現 STATUS_MORE_PROCESSING_REQUIRED 這個標志,則會停止向上繼續回滾。這也是為什麼在 CompleteRoutine 中使用這個標志即可暫停 IRP 的原因。

9、關於 ObQueryNameString 的使用

這個函數的使用,在有些環境下會有問題。它的上層函數是 ZwQueryObject()。在某些情況下會導致系統掛起,或者直接 BSOD。它是從 對象管理器中的 ObpRootDirectoryObject開始遍歷,通過 OBJECT_HEADER_TO_NAME_INFO 獲得對象名稱。今天問了下 PolyMeta好象是在處理 PIPE 時會掛啟,這個問題出現在 2000 系統。在 XP 上好象補丁了。

10、關於重入問題

其實這個問題在很久前的 IFS FAQ 里已經介紹的很清楚,包括處理方法以及每種方法可能帶來的問題。IFS FAQ 里的 Q34 一共介紹了四種方法,包括自己從頭建立 IRP發送,使用 ShadowDevice,使用特徵字元串,根據線程 ID,在 XP 下使用() 函數。並且把以上幾種在不同環境下使用要處理的問題也做了簡單的介紹。且在 Q33 里介紹了在 CIFS 碰到的 FILE_COMPLETE_IF_OPLOCKED 問題的解決方法。

② 為什麼老是出現打開過濾驅動失敗啊

驅動失敗..?

可能是系統自己掃描驅動程序吧

這種東西不會總出現的啊

是不是自己安了什麼沒必要硬體

③ Load File Filter Driver failed 指的是什麼意思

裝載文件過濾驅動失敗

④ 打開usb過濾驅動失敗,請查看設備管理器中,通用串列匯流排控制器 是否存在

這是裝了usb密碼保護軟體,卻沒有有效的裝載或設置完善,開機時那個設置過密碼的usb介面中的u盤不見了,造成查找提示。。

卸載軟體,重啟。

如果還恢復不了就是流氓軟體,如果想乾乾凈凈,只有重裝系統。。或者臨時使用360啟動管理,關閉啟動項中這個軟體的啟動運行及服務運行。

⑤ 什麼原因會導致注冊表過濾器驅動程序異常,怎麼解決

1.病毒木馬造成的,在當今互聯網時代,病毒坐著為了獲得更多的牟利,常用病毒綁架應用程序和系統文件,然後某些安全殺毒軟體把被病毒木馬感染的應用程序和系統文件當病毒殺了導致的。
2.應用程序組件丟失,應用程序完整的運行需要一些系統文件或者某些ll文件支持的,如果應用程序組件不完整也會導致的。
3.系統文件損壞或丟失,盜版系統或Ghost版本系統,很容易出現該問題。
4.操作系統自身的問題,操作系統本身也會有bug 。
5.硬體問題,例如內存條壞了或者存在質量問題,或者內存條的金手指的灰塵特別多。

⑥ North Bridge 過濾器驅動程序安裝失敗

一、解決USB故障的華山第一道
如果你的USB設備在安裝或使用時出現故障,首先要檢查系統是否專正確識別USB晶元組。操作屬步驟如下:
在Windows
2000/XP中(Windows
9x/Me的操作步驟基本類似),依次點擊「開始→設置→控制面板→系統→硬體→設備管理器」,找到並雙擊「通用串列匯流排控制器」。其中應當至少列出兩類條目,一類是USB控制器,另一個是USB
Root
Hub(見圖1)。如果你的主板支持USB
2.0,並正常安裝了驅動程序,一般會在此處顯示USB
2.0
Root
Hub。

⑦ 用CreateFile打開過濾驅動失敗,這是咋回事

方法一 1首先滑鼠右擊(計算機),點擊(屬性)。 2顯示頁面左邊找到(設備管理器),然後在右邊框里的最下方選擇顯示卡,滑鼠右擊顯示卡欄,再點擊(更新驅動程序)。 3在硬體更新向導里, 如圖選擇安裝,在搜索最佳驅動程序項中,點擊瀏覽找到...

⑧ 過濾驅動中打開文件時如何避免重入

在處理IRP_MJ_CREATE請求時,過濾驅動可能會使用不同的屬性/許可權等打開這個文件。這種情況經常發生在第二次調用ZwCreatefile時。這會導致生成一個對FSD 過濾驅動的回調(就是重入了).因而,正常的過濾驅動就要有能力檢測這種重入的問題。
There are several ways of dealing with reentrancy ring an IRP_MJ_CREATE operation, and the appropriate solution for your particular driver will depend upon the circumstances. In addition, there are a number of techniques that might work for a single file system filter driver, but that fail when used in a multi-filter environment.
在處理IRP_MJ_CREATE操作過程中,有幾種方法可以處理重入,處理你的驅動(中的重入)的適當方法取決於你的環境。另外,有許多種技術可以在單個文件系統過濾驅動上工作,但在多層過濾的環境下可能會失效。
For Windows XP and newer versions of Windows, the best mechanism for opening a file within the filter is to use . A filter driver can call this function and specify a given device object. The IRP_MJ_CREATE that is built will be passed to the specified device object. This technique avo
ids reentrancy issues and is the best mechanism available for a filter to open a file.
對Windows xp或者更新版的Windows來說,在過濾驅動中打開一個文件的最好方法是使用.文件過濾驅動可以調用這個函數並且指定一個給定的設備對象。
For versions of Windows prior to Windows XP, this mechanism is not available. The best mechanism in this environment is to implement your own functional equivalent of . This can be done by creating a second device object for each device you are filtering.
對Windows xp以前的Windows操作系統,這種方法無效。在這種環境下最好的方法是實現你自己的與等價的功能。這可以通過給你要過濾的設備創建第二個設備對象來實現。
For example, suppose you decide to filter some given file system device object, FSDVolumeDeviceObject. You then create a device object MyFilterDeviceObject and attach it using IoAttachDeviceToDeviceStack (of course, in Windows XP you would use instead). In addition, you create a second device object MyFilterShadowDeviceObject. This device object must be assigned a name ("DeviceMyFilterDevice27", for example). The name can be anything, but it must obviously be unique. In your device extension for your two device objects, you need to track this name, and you need to maintain pointers to the respective device objects (that is, the device extension for MyFilterShadowDeviceObject should point to MyFilterDeviceObject and the device object extension for MyFilterDeviceObject should point to yFilterShadowDeviceObject). Don't forget to set the StackSize field of the device object correctly!)
例如,假設你要過濾某個特定的文件系統設備對象,FSDVolumeDeviceObject(文件系統卷設備對象).這時你要創建一個設備對象MyFilterDeviceObject 並且使用IoAttachDeviceToDeviceStack 函數(在windows xp下使用 )來掛接它。另外,你還要創建第二個設備對象yFilterShadowDeviceObject.這個設備對象必須被指定一個名字(例如"DeviceMyFilterDevice27",注: 這里指的第二個設備對象,即Shadow device object )。名字可以是任意的,但必須唯一的。在這兩個設備的設備擴展結構中,你需要跟蹤這個名字
(注,其實就是做標志,你要知道你當前是處在哪個設備中,是第一個設備對象還是Shadow object )你需要維護一些指向相應的設備對象的指針(也就是說,MyFilterShadowDeviceObject的設備擴展要指向MyFilterDeviceObject,MyFilterDeviceObject的設備擴展對象要指向MyFilterShadowDeviceObject.不要忘了正確設置設備對象的StackSize成員變數。
Now, an IRP_MJ_CREATE request arrives in your filter, specifying MyFilterDeviceObject. To open the file without experiencing reentrancy problems, you call IoCreateFile (or ZwCreateFile). Since you must pass the name of the file being opened, you construct that by using both the name you gave MyFilterShadowDeviceObject and the name that is in the FileObject of the I/O stack Location (IoGetCurrentIr
pStackLocation(Irp)->FileObject).
現在,當IRP_MJ_CREATE 請求到達你的過濾驅動時,指定了 MyFilterDeviceObject.你調用IoCreateFile(或ZwCreateFile) 打開文件就沒有重入的問題了.以後,你必須傳遞這個打開的文件的名字,這個名字是用你設置在MyFilterShadowDeviceObject中的名字和從I/O 堆棧區域中得到的文件對象中的名字一起構造的。
Since you are passing a name in that points to your second device object, the I/O Manager will build the IRP_MJ_CREATE and pass the resulting I/O request packet to your driver, but specifying MyFilterShadowDeviceObject.

當你傳遞一個指向你的第二個設備對象的名字,I/O管理器會構建IRP_MJ_CREATE 並且傳遞I/O請求的結果到你的驅動,但指定了MyFilterShadowDeviceObject.
In your IRP_MJ_CREATE dispatch handler you must detect that this is a "shadow" device object, rather than a typical filter device object. In this case, you should send the IRP_MJ_CREATE operation down to the device being filtered by MyFilterDeviceObject. Indeed, since you should not need to do any further processing, you can use IoSkipCurrentIrpStackLocation (rather than ).
在你的IRP_MJ_CREATE 分發常式處理函數中,你必須檢測它是一個"Sahdow"設備對象而不是是一個典型的過濾設備對象。在這種情況下,你必須將IRP_MJ_CREATE操作下傳到已經被 MyFilterDeviceObject過濾了的設備中。確實,此後你不需要作進一步的處理,你可以用IoSkipCurrentIrpStackLocation函數(不是).

⑨ 台式電腦開機後顯示"打開usb過濾驅動失敗,請查看設備管理器中,通用

這是裝了usb密碼保護軟體,卻沒有有效的裝載或設置完善,開機時那個設置過密碼的usb介面中的u盤不見了,造成查找提示。。

卸載軟體,重啟。

如果還恢復不了就是流氓軟體,如果想乾乾凈凈,只有重裝系統。。或者臨時使用360啟動管理,關閉啟動項中這個軟體的啟動運行及服務運行。

⑩ 打開易語言應用程序後,注入時顯示寫出驅動文件失敗c:\windows\Lodr.sys怎麼解決

這個問題的話你可以用360安全衛士里的系統修復工具來修復一下,修復完了把電腦重啟一下

閱讀全文

與打開文件過濾驅動失敗相關的資料

熱點內容
反滲透膜進口和國產價格差別 瀏覽:187
魚缸過濾設計圖紙 瀏覽:506
飲水機和花灑各什麼價 瀏覽:659
沉雨凈水是什麼意思 瀏覽:744
農村別墅屋頂用樹脂瓦選什麼顏色 瀏覽:790
廈門前場污水處理廠 瀏覽:634
springmvc多個過濾器 瀏覽:907
凈水器一g代表什麼 瀏覽:546
生物方法在污水處理中的應用 瀏覽:281
污水管過河走河底用什麼管 瀏覽:158
豪爵鷹鑽125空氣濾芯怎麼更換 瀏覽:452
ro膜中的白色 瀏覽:126
卧式機油濾芯如何安裝 瀏覽:469
德國生活污水處理 瀏覽:988
超濾濃縮膜包進液出液區分 瀏覽:384
歐琳濾芯怎麼換 瀏覽:826
沃爾沃怎麼更換空調濾芯 瀏覽:190
什麼地方有賣飲水機 瀏覽:762
金利源凈水機RO膜 瀏覽:820
開一家凈水器店需要投多少錢 瀏覽:740