2010-04-20 26 views
4

的64位的系统文件的无声重定向到其32位等效可关断收归和Wow64DisableWow64FsRedirection Wow64RevertWow64FsRedirection。我们在我们的应用程序中使用它来进行某些文件身份检查强制文件重定向在x64用于32位应用程序

问题是,在执行这些任务时,我们可能会调用一个框架或Windows API,随后调用另一个尚未加载的DLL中的API。如果当时启用重定向,则可能会加载错误版本的dll,导致出现XXX is not a valid Win32 application错误。

我已经确定了几个有问题的API调用,并且我想要做的事情是在该调用期间强制重定向,然后将其恢复 - 仅提供提供的Win32 API的。不幸的是,这些调用并没有提供像注册表方法那样的任何类型的WOW64兼容性标志。

明显的选择是使用Wow64EnableWow64FsRedirection,为Wow64FsEanbledRedirection传递TRUE。然而,关于使用这种方法的警告有很多种,并且注意到它与取代它的禁用/恢复组合方法不兼容。

有没有一种安全的方式来强制重定向给一个Win32调用?

文档状态重定向是线程特定的,所以我已经考虑为特定的调用启用适当的锁和等待的新线程,但我希望有一个更简单的解决方案。

回答

0

因此,我终于去了新的线程路线,结果比预期容易。文档声明重定向是线程特定的,因此新线程将始终启用重定向。

var t = new Thread(() => 
    SafeNativeMethods.LoadLibraryExW("NTMARTA.DLL", IntPtr.Zero, 0)); 
t.Start(); 
t.Join(); 
-1

为什么不使用SHGetKnownFolderPath或SHGetFolderPath并查找FOLDERID_SystemX86/CSIDL_SYSTEMX86以获取加载DLL的基路径?这应该让你获得独立于文件系统重定向的正确文件夹。

+0

@afrazier:我们不加载DLL文件,他们正在间接我们呼吁 – 2010-04-20 01:35:15

0

在黑暗中刺伤。你可以打开重定向,调用所需的所有API方法,但忽略结果。这将加载所有相关的dll。然后关闭重定向并重新执行方法调用,这次使用结果?

+0

感谢山姆的Windows API加载,这正是我试图完成。但是,如果您仔细阅读问题描述,则无法执行此操作。 Windows API提供的唯一方法是_disable_和_restore_重定向状态。 Wow64EnableWow64FsRedirection方法已弃用,不能与禁用/恢复方法混合使用。 – 2010-04-24 09:03:11

+0

好吧,我想我会检查。也许它只是我错过了一些东西,但为什么不能在你禁用重定向状态来加载你需要的所有dll之前调用所有的方法,然后启用重定向来检查你的dll。正如我所说,我可能不了解根本性的东西。 – 2010-04-24 09:21:12

+0

我也试过这个,但遗憾的是通话路径不够可预测。 Windows试图加载的DLL也取决于调用时的应用程序状态,因此调用它们,比如应用程序启动可能不会加载所有依赖的DLL。 – 2010-04-24 22:43:53

相关问题