如何确定进程打开文件的顺序?

时间:2012-10-03 14:45:38

标签: c++ winapi internal ntdll

有没有办法获取进程的所有打开文件句柄并按时间文件打开进行排列?我们有一个项目,需要这个 - 我们需要确定哪些文件是由Dj软件打开的,比如Traktor或Serato。我们需要知道它的顺序的原因是确定哪个文件在第一个套牌中,哪个文件在第二个套牌中。

目前,我们正在使用Ntdll.dll(Winternl.h)中的Windows内部API来确定进程的所有已打开文件的列表。也许这不是最好的方法。任何建议都非常感谢。

我们依赖于在某些操作系统版本和某些Dj软件版本上观察到的API行为,这是一个进程的所有打开文件的列表永远不会重新排列,即遵守订单。我知道这是一个不好的做法,但在发布之前它是客户的“应该”功能,所以我们必须这样做。问题是现在我们有一个错误,当这些句柄有时随机重新排列而没有任何特殊原因。那刹车了一切。我想也许在这些获胜结构中会有一个字段来获取文件的打开时间,但似乎没有这样的东西。有关该API的文档非常糟糕。

我考虑过一些代码粘贴,但它是一个200行的函数,它使用函数指针从dll进行间接调用,WinAPI的所有结构都是手动重新定义的,所以很难读取它。实际上,甚至不包括Winternl.h头文件 - 所有内容也是手动加载的,如:

GetProcAddress( GetModuleHandleA("ntdll.dll"), "NtQuerySystemInformation" );

跨平台应用真的很头疼......

P.S。我发布了一个相关的问题here,关于任何跨平台或Qt方式来获取打开的文件句柄,也许这些东西会有用或相关。

1 个答案:

答案 0 :(得分:1)

如果只是为了调试目的检查其他操作系统中的行为,你可以使用在调试模式下创建进程的技术并按顺序拦截所有dll加载事件,这里是一个很好的article谈论那个