gpt4 book ai didi

c++ - 列出所有打开的文件

转载 作者:可可西里 更新时间:2023-11-01 13:11:21 26 4
gpt4 key购买 nike

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

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

与另一个问题(上面链接)一样,我不关心语言(尽管 C 或 C++ 解决方案不会造成伤害),但我希望它能在 Windows XP 上运行。此外,我需要避免使用内核模式驱动程序。

这个问题的原始解决方案存在的问题是,如果以某种方式打开文件句柄,NtQueryObject 调用可能会挂起。这在 SysInternals 论坛上有概述 here .

根据 SysInternals 论坛,使用带有超时的 CreateThread 已被接受的解决方案,但这样做似乎并不能使进程每次都正确关闭。即使在 Visual Studio 中对此进行调试,我有时也不得不重新启动计算机。运行此程序时有时必须重新启动我的计算机不是最佳选择。

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

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

谢谢!

编辑:抱歉,我应该更具体地说明我的问题。 NtQuerySystemInformation 调用将获得句柄,使用 ObjectNameInformation 调用的 NtQueryObject 将卡在作为同步管道的句柄上(至少人们看起来是这样的)说)。贴出的例子here使用内核模式驱动程序从 FILE_OBJECT 读取文件名——但我想避免使用驱动程序。所以是的,很像 SysInternals Handle 实用程序,但我相信他们也使用驱动程序,不是吗?

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

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

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

再次感谢!

最佳答案

我认为您可以使用被禁止的 NtQuerySystemInformation() API。 ab/使用此 API 的示例项目是 available here .

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

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

关于c++ - 列出所有打开的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3628919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com