使用Wow64DisableWow64FsRedirection和Wow64RevertWow64FsRedirection,可以将64位系统文件的静默重定向转换为32位,以及关闭和还原。我们在我们的应用程序中使用它来进行某些文件身份检查。
问题在于,在执行某些任务时,我们可能会调用框架或Windows API,随后调用尚未加载的DLL中的另一个API。如果此时启用了重定向,则可能会加载错误版本的dll,从而导致XXX is not a valid Win32 application
错误。
我已经确定了几个有问题的API调用,我想要做的是在调用期间强制重定向然后将其还原 - 只是提供的Win32的对面蜜蜂。不幸的是,这些调用不像某些注册表方法那样提供任何类型的WOW64兼容性标志。
显而易见的替代方法是使用Wow64EnableWow64FsRedirection,为Wow64FsEanbledRedirection传递TRUE。但是,有关使用此方法的各种警告以及与已替换它的Disable / Revert组合方法不兼容的说明。
是否有一种安全的方法可以强制重定向 以进行Win32调用?
文档说明重定向是特定于线程的,所以我考虑使用适当的锁和等待为特定调用启动一个新线程,但我希望有一个更简单的解决方案。
答案 0 :(得分:0)
在黑暗中刺伤。你可以打开重定向,调用你需要的所有API方法,但忽略结果。这将加载所有相关的dll。然后关闭重定向并重做方法调用,这次使用结果?
答案 1 :(得分:0)
所以我终于走了新的线程路线,结果比预期的要容易。文档声明重定向是特定于线程的,因此新线程将始终启用重定向。
var t = new Thread(() =>
SafeNativeMethods.LoadLibraryExW("NTMARTA.DLL", IntPtr.Zero, 0) );
t.Start();
t.Join();
答案 2 :(得分:-1)
为什么不使用SHGetKnownFolderPath或SHGetFolderPath并查找FOLDERID_SystemX86 / CSIDL_SYSTEMX86以获取加载DLL的基本路径?这应该可以使您找到与文件系统重定向无关的正确文件夹。