2012-05-23 41 views
0

有沒有辦法在Windows執行刪除之前檢測文件的刪除?我發現了FileSystemWatcher類,但是隻有在執行了刪除操作後纔會引發事件,但是我想在用戶/進程選擇刪除操作時捕獲刪除操作。您可以監視文件系統表,但要尋找更好的方法。謝謝你的幫助。攔截FILESytemCall刪除

+0

通過使用mhook庫來喚醒NtSetFileInformation API,工作就像一個魅力。多謝你們。 – vgeta

回答

1

我覺得simpliest的方法是使用一個鉤子得到通知(並最終停止)的過程。它不能在.NET中完成,因此您必須爲DllImport許多結構和P/Invoke功能很少。

讓我們從NtSetFileInformation(未記錄的)函數開始您的工作。當需要刪除文件時(這是FileDispositionInformation結構),這是所有其他功能調用的函數。

現在的問題是如何掛鉤該功能(祝你好運,這是不容易的)。一個不錯的選擇可以使用Microsoft Detours。以this article爲例。它的問題是它不是免費的。另一種解決方案(具有合理的價格和.NET界面)是Deviare,但我從來沒有試過甚至他們的免費版本,所以我不知道它有多好。如果別人知道一個好的攔截工具...

+0

謝謝,我其實不想停止刪除文件的過程。我想製作一個安全的文件副本並讓刪除發生。 – vgeta

+0

@Gopikanna這是一樣的(困難)的方式。最大的問題是當某人/某些東西試圖刪除一個文件時**檢測**(不同的函數使用不同的方法,NtSetFileInformation只是最深的一個)。當你在那裏做什麼是(善良的)微不足道的。 –

+0

謝謝,我會嘗試API掛鉤,並希望我可以做到:) – vgeta

1

您需要一個文件系統過濾器驅動程序。不過,我強烈建議,如果你不知道答案,你可能不應該這樣做。

http://msdn.microsoft.com/en-us/library/windows/hardware/gg462968.aspx

+0

謝謝,但沒有尋找驅動程序級解決方案。寫一個驅動程序對我來說是不可行的:)。我正在尋找api級解決方案。 – vgeta

+0

我可能是完全錯誤的,是否有可能運行一個服務來保存文件上的鎖,以便每當有東西試圖刪除它時,我的服務就可以找到它。 – vgeta

+0

如果您想阻止刪除,只需按住打開的句柄(打開並訪問FILE_READ_ATTRIBUTES),但不需要FILE_SHARE_DELETE。發現有人企圖刪除它更困難。 – Ben