2

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

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

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

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

谢谢。

4

2 回答 2

1

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

于 2013-10-09T00:07:55.727 回答
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 目录比禁用文件系统重定向更可取。

于 2011-05-02T22:19:49.427 回答