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 +有更优雅的解决方案,因此使用未记录的功能确实不是问题.
再次感谢!