2010-02-16 41 views
3

我會盡量簡短一些,但要充分說明:將文件內容從內核傳遞到用戶模式的最快方法?

這是Windows特有的。使用Windows驅動程序開發工具包(DDK)。

我第一次編寫內核模式驅動程序(KMD),在內核模式中沒有任何經驗。目前我正在使用DDK附帶的「掃描儀」微型過濾器樣本,並將其擴展到練習中。 「掃描儀」微型過濾器是通用「防病毒」型掃描驅動程序的基本概要,該驅動程序鉤住文件創建/關閉並在相關文件上運行以在批准/拒絕請求的操作之前掃描「壞字」。

最終目標是在打開用戶模式應用程序時掃描文件,決定微型過濾器是否應該允許操作完成,而不會顯着減慢進程或用戶的速度試圖打開文件。當試圖確定是否允許保存成功完成或拒絕保存時,我還想要再次掃描整個文件。微型過濾器樣本爲如何掛鉤這些調用奠定了基礎,但在實際的「掃描」部分有點弱。

我期待擴大樣本以掃描已經打開的整個文件,例如生成散列,而不僅僅是第一個1k(樣本的限制)。我修改了示例以讀取整個文件並使用原始示例中的相同機制發送它。此方法使用FltReadFile來讀取KMD內的文件和FltSendMessage以將緩衝區發送到用戶模式組件。用戶模式應用程序使用GetQueuedCompletionStatus從KMD獲取通知並處理緩衝區。

但是,我注意到,與使用標準庫(fstream)的C++中的常規打開/讀取相比,此過程似乎非常慢。這種方法比簡單的打開和讀取簡單的C++用戶應用程序中的文件要長約4-8倍。我調整了緩衝區大小,看看它是否有顯着的改進,雖然它可以略微有所幫助,但好​​處似乎並不顯着。

由於我正在尋找'實時'掃描文件,這種傳輸速率非常令人失望和令人望而卻步。有沒有更快的方式將文件內容從內核模式驅動程序傳輸到用戶模式應用程序?

回答

4

我可以建議幾種解決方案:

  1. 使用的DeviceIoControl與METHOD_OUT_DIRECT傳輸類型傳遞大量的數據。
  2. 創建內存部分並將其映射到您的進程(請記住32位平臺上的有限地址空間)。
  3. 將文件路徑傳遞到您的應用程序並在此處打開。
+0

我一直在分心,無法真正嘗試實現這一點,但信息看起來很有前途,非常感謝。謝謝! – KevenK

相關問題