8

这是此处找到的另一个问题的附加内容。

简而言之: 我想列出系统上所有打开的文件并检索它们的关联文件名。如果这是错误的方法,或者如果有其他方法,请给我推动正确的方向。或者,如果我遗漏了任何细节或不清楚的地方,请对我大喊大叫。

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

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

根据 SysInternals 论坛,使用带有超时的 CreateThread 是公认的解决方案,但这样做似乎并不能让进程每次都正确关闭。即使在 Visual Studio 中调试它,我有时也会被迫重新启动计算机。有时当我运行它时必须重新启动我的计算机不是最好的选择。

另一个公认的解决方案是跳过带有特定GrantedAccess. GrantedAccess我遇到的问题是,鉴于上述论坛帖子中的概述,我错过了太多有用的句柄。

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

谢谢!

编辑:对不起,我应该更具体地说明我的问题。该NtQuerySystemInformation调用将为我提供句柄,被NtQueryObject调用的 withObjectNameInformation将挂在同步管道的句柄上(至少人们似乎是这么说的)。此处发布的示例使用内核模式驱动程序从 FILE_OBJECT 读取文件名——但我想避免使用驱动程序。所以是的,很像 SysInternals Handle 实用程序,但我相信他们也使用驱动程序,不是吗?

编辑 2:这是一种学术兴趣,因此无需担心使用本机 API 或其他可能在未来版本中被破坏的未记录技术。此外,GrantedAccess避免悬挂物体的a将是完美的。

编辑 3:我的最终目标是能够查看系统上当前打开了哪些文件。如果这完全是错误的方法,那么正确方向的另一点将不胜感激。

编辑:这只需要在 Windows XP 上工作,因为 Vista+ 有更优雅的解决方案,所以使用未记录的函数真的不是问题。

再次感谢!

4

1 回答 1

6

我认为您可以使用禁止的 NtQuerySystemInformation() API 到达某个地方。此处提供了 ab/使用此 API 的示例项目。

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

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

于 2010-09-02T17:32:21.507 回答