2014-02-14 22 views
1

我有一個文件篩選器驅動程序,應該在特定情況下禁止文件/目錄訪問。 我使用IoRegisterFsRegistrationChange來獲取有關文件系統更改的通知,並附加到適當的卷設備對象。文件篩選器驅動程序頁面文件

它通常是一個傳遞過濾器。它處理的唯一事情是IRP_MJ_CREATE(實際上禁止某些類型的文件/目錄訪問)。所有其他IRP和快速I/O請求都只傳遞給底層設備。

它工作正常,除了一件事。如果驅動程序在系統啓動時加載(SERVICE_SYSTEM_START) - 因爲我不太明白系統頁面文件被禁用。用戶登錄後會顯示「性能選項」彈出式對話框。虛擬內存分頁文件被禁用(這是什麼觸發這個對話框彈出恕我直言)。

如果驅動程序在後期動態加載 - 沒有明顯問題,一切正常。

我試圖禁用IRP_MJ_CREATE(只是像所有其他請求一樣傳遞)的處理,但沒有任何更改。

我明白,通常很難說沒有看到代碼就問題出在哪裏。但無論如何,這是一個已知的問題嗎?我應該檢查什麼?這是不是以正確方式傳遞某些請求的一種症狀,或者將設備對象附加到卷設備對象的偶然事實可能會導致這樣的問題?

歡迎所有可能的想法。提前致謝。

回答

1

找到問題的原因。這個問題既沒有處理Fast-I/O請求,也沒有處理我的設備如何連接到目標設備。

發現,最終我沒有在驅動程序調度表中包含一個I/O調度處理程序。也就是說,我的代碼是:

for (UINT i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) 
    pDriverObject->MajorFunction[i] = Dispatch; 

雖然它應該已經:

for (UINT i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) 
    pDriverObject->MajorFunction[i] = Dispatch; 

我錯過的功能是IRP_MJ_PNP - 插件和播放管理者請求處理程序。這是文件系統驅動程序所需的。修復代碼後,問題消失了。

感謝所有擔心:)

相關問題