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在上面的评论中给出的解决方案非常有效。