列出所有打开的文件

mrd*_*law 7 c c++ windows internals

这是此处发现的另一个问题的附加内容.

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

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

我对此问题的原始解决方案的问题是,如果以某种方式打开文件句柄,则NtQueryObject调用可能会挂起.这是概述了Sysinternals的论坛在这里.

根据SysInternals论坛,使用带有超时的CreateThread已经被接受的解决方案,但这样做似乎不允许每次都正确关闭进程.即使在Visual Studio中进行调试时,我有时也被迫重启计算机.有时在我运行时重启计算机不是最好的选择.

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

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

谢谢!

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

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

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

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

再次感谢!

Han*_*ant 6

我认为你可以使用禁止的NtQuerySystemInformation()API.此处提供了使用此API的示例项目.

需要提出许多警告标志,你正在使用故意未记录的内部内核数据结构.你肯定也不会想这样做,本文提出什么,关闭文件句柄不由自主是一个伟大的方式来引起随机文件系统损坏.

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