这是此处找到的另一个问题的附加内容。
简而言之: 我想列出系统上所有打开的文件并检索它们的关联文件名。如果这是错误的方法,或者如果有其他方法,请给我推动正确的方向。或者,如果我遗漏了任何细节或不清楚的地方,请对我大喊大叫。
像另一个问题(上面链接)一样,我不关心语言(虽然 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+ 有更优雅的解决方案,所以使用未记录的函数真的不是问题。
再次感谢!