C++ WOW64禁用WOW64FSRedirection和GetNamedSecurityInfo-不可避免的错误\u错误\u EXE\u格式?

C++ WOW64禁用WOW64FSRedirection和GetNamedSecurityInfo-不可避免的错误\u错误\u EXE\u格式?,c++,winapi,wow64,C++,Winapi,Wow64,我正在使用Wow64DisableWow64FsRedirection/Wow64RevertWow64FsRedirection来禁用和恢复WOW-64文件重定向(使system32\变为syswow64\和一些注册表更改)。MSDN页面警告您应该紧密使用这些对,因为它们会影响所有I/O操作,包括加载DLL 我已经成功地使用了一段时间,但现在遇到了一个看似不可能的情况。我试图调用的函数是GetNamedSecurityInfo,它采用文件路径。文件路径经常会进入system32文件夹,因此我需

我正在使用
Wow64DisableWow64FsRedirection
/
Wow64RevertWow64FsRedirection
来禁用和恢复WOW-64文件重定向(使system32\变为syswow64\和一些注册表更改)。MSDN页面警告您应该紧密使用这些对,因为它们会影响所有I/O操作,包括加载DLL

我已经成功地使用了一段时间,但现在遇到了一个看似不可能的情况。我试图调用的函数是
GetNamedSecurityInfo
,它采用文件路径。文件路径经常会进入system32文件夹,因此我需要禁用重定向。但是,如果禁用重定向,函数将返回
ERROR\u BAD\u EXE\u FORMAT

我曾尝试使用
LoadLibrary(TEXT(“Advapi32.DLL”)
预加载它所在的DLL,但没有帮助。我猜它正在
GetNamedSecurityInfo
中加载另一个DLL,但我不知道是哪个

现在的问题是。处理这种情况的最佳方法是什么?在使用
Wow64DisableWow64FsRedirection
之前,我是否应该预加载所有可能的DLL?有更好的办法吗


谢谢。

在应用程序中,您应该尝试访问目录%SystemRoot%\SysNative,而不是%SystemRoot%\System32。这样就不需要FS重定向。所有32位进程都可以访问此伪目录。它对64位进程不可见

32位cmd.exe

64位cmd.exe


使用Sysnative目录比禁用文件系统重定向更可取,因为您遇到了各种各样的问题。

在调用
wow64禁用wow64fsredirection
加载库(“ntmarta.dll”)
)之前预加载ntmarta.dll就足够了。
通过这种方式,
GetNamedSecurityInfo
/
SetNamedSecurityInfo
API将不会在模块预加载之前返回
ERROR\u BAD\u EXE\u FORMAT
(请参阅
ADVAPI32!accprovploadmartaffunctions
函数代码).

一种可能有效的预加载方法:尝试使用您知道不会被虚拟化的路径调用GetNamedSecurityInfo,以便它加载其所有DLL,然后禁用虚拟化并尝试相关的system32文件。我刚刚想到了这一点,它就起作用了!我使用以下内容预加载:GetNamedSecurityInfo(文本(“.”),SE_文件_对象,0,NULL,NULL,NULL,NULL,NULL);很好,我可以给它所有的空值…我尽可能使用
sysnative
,但是很多路径都来自外部源(例如BCD)。我想我可以用\Windows\SysNative替换\Windows\System32,但是\Windows\System32中可能有文件不是系统目录(例如,在装载的WIM映像中),并且\Windows\SysNative会在那里失败。@ChrisV在上面的评论中给出的解决方案非常有效。