我使用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吗?还有更好的方法吗?
感谢。
答案 0 :(得分:1)
在调用Wow64DisableWow64FsRedirection
(LoadLibrary("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目录更适合禁用文件系统重定向。