我研究过使用 NtQueryDirectoryFile 而不是 FindFirstFile/FindNextFile 来加速目录迭代。
使用 NtQueryDirectoryFile 是软件中常用的策略,所以我主要按照 git 的做法来实现它 (我的实现).
它在 Wine 上完美运行,我发现迭代所有内容的操作速度从 17 秒提高到 14 秒(请注意,这在 Linux 上需要 2 秒,因此优化刻不容缓)。然而,问题是它在 Windows 上失败了,而且没有太多解释“为什么”。 它总是在NtQueryDirectoryFile例程中出现故障,所以我知道这是例程(或我对它的使用)的问题,而不是其他问题。 这是 GDB 和 Visual Studio 回溯(抱歉无法发布图像,它需要信誉):
, 如您所见,R10 是有问题的寄存器(由于某种原因设置为 0),它已从
gs:[0x188]
移出。据我所知,这是 TEB 的
严格保留区域,我无法知道它是什么。 我尝试了一些修复,例如将缓冲区对齐到LONGLONG
,但无济于事。 有谁可以解释一下这个话题吗?我是否错误地使用了这个?我完全被困住了。我真的很感激像使用 FindFirstFileEx 和 FIND_FIRST_EX_LARGE_FETCH 这样的答案,这已经显示出
not 的帮助。 感谢 Raymond Chen,我意识到您必须链接 NTDLL.DLL 而不是 ntoskrnl.exe 才能使用例程的用户空间版本。 (这是一个关闭问题的答案,以防其他人看到它)