列出所有打开的文件

时间:2010-09-02 16:01:02

标签: c++ c windows internals

这是here找到的另一个问题的附加组件。

简而言之:我想列出系统中的所有打开文件并检索其关联的文件名。如果这是错误的方法,或者有另一种方法,请给我一个正确的方向。或者,如果我遗漏任何细节或某些不清楚的东西,请对我大喊大叫。

与其他问题(上面链接)一样,我不关心语言(虽然C或C ++解决方案不会受到伤害),但我希望这可以在Windows XP上运行。另外,我要求避免使用内核模式驱动程序。

我对此问题的原始解决方案的问题是,如果以某种方式打开文件句柄,NtQueryObject调用可能会挂起。这在SysInternals论坛here上列出。

根据SysInternals论坛的说法,使用带有超时的CreateThread已经成为公认的解决方案,但这样做似乎不允许每次都正常关闭进程。即使在Visual Studio中进行调试时,我有时也被迫重启计算机。

当我运行它时,不得不重新启动计算机 不是最好的选择。

另一个可接受的解决方案是使用特定GrantedAccess跳过句柄。我遇到的问题是,考虑到上述论坛帖子中列出的GrantedAccess,我错过了太多有用的句柄。

有人能指出我解决问题的方法吗?

谢谢!

修改:抱歉,我应该更加具体地了解我的问题。 NtQuerySystemInformation调用将为我提供句柄,NtQueryObject调用ObjectNameInformation将挂在同步管道的句柄上(至少这是人们似乎所说的)。发布的示例here使用内核模式驱动程序从FILE_OBJECT读取文件名 - 但我想避免使用驱动程序。所以是的,就像SysInternals Handle实用程序一样,但我相信它们也使用了驱动程序,不是吗?

编辑2 :这是一种学术兴趣,因此使用本机API或未来版本中可能会破坏的其他未记录的技术并不是一个问题。另外,只能避免挂起的对象的GrantedAccess将是完美的。

编辑3 :我的最终目标是能够看到系统上当前打开的文件。如果这是完全错误的方法,那么正确方向的另一点将非常受欢迎。

编辑:这只需要在Windows XP上运行,因为Vista +有更优雅的解决方案,因此使用未记录的功能确实不是问题。

再次感谢!

1 个答案:

答案 0 :(得分:5)

我认为您可以使用禁用的NtQuerySystemInformation()API获取某些内容。 ab /使用此API的示例项目是available here

需要提出很多警告标志,你正在使用故意未记录的内部内核数据结构。你肯定做想要做那篇文章提出的建议,不自觉地关闭文件句柄是导致随机文件系统损坏的好方法。

您将很难保持此类代码与未来版本的Windows兼容。一个可能更好但不是更优雅的解决方案是依靠SysInternals的Handle实用程序。它可能会维持一段时间。从您的程序运行此程序,重定向输出。解析文本是可行的。