Wow64DisableWow64FsRedirection和GetNamedSecurityInfo - 不可避免的ERROR_BAD_EXE_FORMAT?

时间:2011-01-21 23:25:46

标签: c++ winapi wow64

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

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

我尝试使用LoadLibrary(TEXT("Advapi32.dll"))预加载它所带来的DLL,但这没有帮助。我的猜测是它在GetNamedSecurityInfo内加载另一个DLL,但我不知道哪个。

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

感谢。

2 个答案:

答案 0 :(得分:1)

在调用Wow64DisableWow64FsRedirectionLoadLibrary("ntmarta.dll"))之前预先加载 ntmarta.dll 就足够了。 这样,GetNamedSecurityInfo / SetNamedSecurityInfo API在之前预先加载该模块之前不会返回ERROR_BAD_EXE_FORMAT(参见ADVAPI32!AccProvpLoadMartaFunctions功能代码)。

答案 1 :(得分:0)

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

32位cmd.exe,http://screencast.com/t/xbAQJ2XIzoT

64位cmd.exe,http://screencast.com/t/t9iFd9Ruc

由于您遇到的问题,使用Sysnative目录更适合禁用文件系统重定向。