【问题标题】:Forcing file redirection on x64 for a 32-bit application对 32 位应用程序强制在 x64 上重定向文件
【发布时间】:2010-04-20 00:50:27
【问题描述】:

可以使用 Wow64DisableWow64FsRedirection 和 Wow64RevertWow64FsRedirection 关闭 64 位系统文件到其 32 位等效文件的静默重定向关闭恢复。我们将其用于应用程序中的某些文件身份检查。

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

我已经确定了一些有问题的 API 调用,以及我想在调用期间强制重定向然后将其恢复回来 - 只是提供的 Win32 的 相反蜜蜂。不幸的是,这些调用不像某些注册表方法那样提供任何类型的 WOW64 兼容性标志。

显而易见的替代方法是使用 Wow64EnableWow64FsRedirection,将 TRUE 传递给 Wow64FsEanbledRedirection。但是,对于使用此方法有各种警告,并注意它与已替换它的禁用/恢复组合方法不兼容。

是否有一种安全的方法可以为给定的 Win32 调用强制重定向on

文档指出重定向是特定于线程的,因此我考虑为特定调用启动一个新线程,并使用适当的锁和等待,但我希望有一个更简单的解决方案。

【问题讨论】:

    标签: .net winapi 64-bit


    【解决方案1】:

    在黑暗中刺伤。您能否打开重定向,调用您需要的所有 API 方法,但忽略结果。这将加载所有相关的 dll。然后关闭重定向,重做方法调用,这次使用结果?

    【讨论】:

    • 谢谢山姆,这正是我想要完成的。但是,如果您通读问题描述,则无法执行此操作。 Windows API 提供的唯一方法是disablerestore 重定向状态。 Wow64EnableWow64FsRedirection 方法已弃用,不能与禁用/恢复方法混合使用。
    • 好的,我想我会检查的。也许只是我错过了一些东西,但是为什么在禁用重定向状态以加载您需要的所有 dll 之前调用所有方法,然后启用重定向以检查您的 dll。正如我所说,我可能不理解一些基本的东西。
    • 我也试过这个,但遗憾的是调用路径不够可预测。 Windows 尝试加载的 DLL 还取决于调用时的应用程序状态,因此调用它们时,例如应用程序启动可能不会加载所有相关的 DLL。
    【解决方案2】:

    所以我终于走上了新的线程路线,结果比预期的要容易。文档指出重定向是特定于线程的,因此新线程将始终启用重定向。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • @afrazier:我们没有加载 DLL,它们是由我们调用的 Windows API 间接加载的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2012-01-01
      • 2011-03-05
      • 2015-08-07
      • 2011-08-18
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多