2010-04-09 140 views
7

我想知道是否有可能在c#中枚舉文件句柄,也許使用Win32API。這對於窗口和進程句柄很容易完成,但似乎文件句柄不可行。在C中枚舉文件句柄#

儘管NtQuerySystemInformation提供了一些功能,但這些功能正在逐步淘汰,因此不建議使用這種方法。

+0

可能的重複http://stackoverflow.com/questions/231547/tracing-which-process-that-has-opened-a-particular-file – 2010-04-10 00:00:37

回答

7

嗯,你知道這是可能的,Sysinternals的手柄工具做的。 NtQueryInformation不會被淘汰,它是Win32和「真實」操作系統之間的一個基本的低級接口。

然而,永遠不會發生的是允許迭代句柄的NtQueryInformation參數將被記錄。因爲它不僅僅停留在那裏,所以一些muppet會使用它來調用CloseHandle(),以便不想被鎖定的文件上。哪個是非常好破壞硬盤內容的好方法。

擁有句柄的進程不知道句柄已關閉。它會繼續寫入,可能完全忽略WriteFile()中的「它沒有工作」的返回碼。在程序打開另一個句柄之前,它是無害的,並獲得與之前關閉的值相同的值。現在它開始寫入混合垃圾(專用於前一個句柄)和新數據到句柄。徹底摧毀任何正在寫入的內容。如果這是關鍵任務數據庫的話,請將備份磁帶分開。