强制在64位系统上为32位应用程序进行文件重定向

4
64位系统文件的静默重定向可以通过 Wow64DisableWow64FsRedirection 和 Wow64RevertWow64FsRedirection 关闭和还原。我们在应用程序中使用此功能进行某些文件身份验证。
问题在于,在执行某些任务时,我们可能会调用框架或Windows API,然后调用尚未加载的DLL中的另一个API。如果此时启用重定向,则可能加载错误版本的dll,导致“XXX不是有效的Win32应用程序”错误。
我已确定了一些相关的API调用,并希望在调用期间强制开启重定向,然后将其恢复回来-与提供的Win32 API相反。不幸的是,这些调用不像某些注册表方法那样提供任何WOW64兼容性标志。
显而易见的替代方案是使用 Wow64EnableWow64FsRedirection,将 Wow64FsEanbledRedirection 设置为TRUE。但是,关于使用此方法有各种警告,并有一个注意事项,即它不兼容已替换它的禁用/还原组合方法。
是否有一种安全的方法来强制针对给定的Win32调用启用重定向?
文档说明重定向是特定于线程的,因此我考虑为具体调用启动一个新线程,带有适当的锁定和等待,但我希望找到一个更简单的解决方案。
3个回答

0

所以我最终选择了新线程路线,结果比预期的要容易。文档说明重定向是线程特定的,因此新线程将始终启用重定向。

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

0

瞎猜测。你能打开重定向,调用所有需要的API方法,但忽略结果。这将加载所有相关的dll文件。然后关闭重定向并重新执行方法调用,这次使用结果。


谢谢Sam,这正是我想要实现的。然而,如果您仔细阅读问题描述,就会发现没有办法做到这一点。Windows API 提供的唯一方法是禁用和恢复重定向状态。Wow64EnableWow64FsRedirection 方法已被弃用,不能与禁用/恢复方法混合使用。 - Paul Alexander
好的,我想我应该检查一下。也许只是我错过了什么,但为什么在禁用重定向状态之前不能调用所有方法以加载您需要的所有dll,然后启用重定向以检查您的dll呢?就像我说的,我可能没有理解某些基本的东西。 - Sam Holder
我也尝试过这个,但遗憾的是调用路径不够可预测。Windows 尝试加载的 DLL 也取决于调用时的应用程序状态,因此在应用程序启动时调用它们可能无法加载所有相关的 DLL。 - Paul Alexander

-1
为什么不使用SHGetKnownFolderPath或SHGetFolderPath,并查找FOLDERID_SystemX86 / CSIDL_SYSTEMX86以获取加载DLL的基本路径?这应该可以让您获得正确的文件夹,而不受文件系统重定向的影响。

@afrazier:我们并没有直接加载DLL,而是通过调用Windows API间接加载它们。 - Paul Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接