Windows 10下32位应用无法访问System32部分文件的解决方案咨询
你遇到的这个问题本质是Windows 10的WOW64(Windows-on-Windows 64-bit)文件系统重定向机制在起作用,这是微软为了兼容32位程序在64位系统运行设计的特性,但确实会给开发跨位程序的开发者带来困扰。
问题根源
当32位程序尝试访问C:\Windows\System32时,系统会自动将请求重定向到C:\Windows\SysWOW64——这个文件夹存储的是供32位程序使用的系统文件,而你要读取的ntoskrnl.exe这类原生64位系统文件只存在于真正的System32目录中,所以32位程序直接访问就会触发ERROR_FILE_NOT_FOUND(错误码2)。Windows 7的WOW64重定向逻辑和Win10不同,因此在Win7上32位程序能正常访问这些文件。你提到的Total Commander、x32dbg等32位工具看不到System32里的部分文件,也是同样的原因:它们实际访问的是SysWOW64目录。
可行的解决方案
这里给你几个适配32/64位环境的解决方法:
使用Sysnative虚拟路径
64位系统给32位程序提供了一个特殊的虚拟路径C:\Windows\Sysnative,用它代替System32就能绕过重定向,直接访问真正的64位系统文件目录。比如把你的测试路径改成L"C:\\Windows\\Sysnative\\ntoskrnl.exe",32位程序就能正常打开目标文件;而64位程序访问Sysnative时会自动映射到System32,不会影响功能。临时禁用文件系统重定向
如果需要在代码里灵活控制重定向状态,可以调用Windows API临时关闭重定向,操作完成后再恢复。示例代码如下:PVOID oldRedirectionState = NULL; // 禁用WOW64文件系统重定向 if (Wow64DisableWow64FsRedirection(&oldRedirectionState)) { // 执行文件操作,比如打开目标PE文件 HANDLE hFile = CreateFile( L"C:\\Windows\\System32\\ntoskrnl.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); // 这里添加你的文件读取、解析逻辑 // 恢复重定向,避免影响程序其他部分的行为 Wow64RevertWow64FsRedirection(oldRedirectionState); }注意:这个API只对32位程序生效,64位程序调用不会有任何变化,所以可以安全地加入你的跨位兼容代码中。
针对64位环境编译对应版本
既然你的库目标是支持32和64位模式,那么在64位系统上直接运行64位版本的程序,就不会触发文件系统重定向,能直接访问System32目录。这可以作为64位环境下的最优解,配合前面的方法覆盖32位场景。
备注:内容来源于stack exchange,提问作者Ofdrykkja

