代码之家  ›  专栏  ›  技术社区  ›  Paul Alexander

为32位应用程序在x64上强制文件重定向

  •  4
  • Paul Alexander  · 技术社区  · 16 年前

    可以将64位系统文件的无提示重定向到其32位等效文件 远离的 回复的 使用wow64disablewow64fsredirection和wow64revertwow64fsredirection。我们将此用于应用程序中的某些文件标识检查。

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

    我已经确定了几个有问题的api调用,我想做的是在调用期间强制重新定向,然后将其还原回来-只是 相反的 提供的win32api。不幸的是,这些调用不像某些注册表方法那样提供任何类型的WOW64兼容性标志。

    明显的替代方法是使用wow64enablew64fsredirection,对wow64fseanbledredirection传递true。但是,有很多关于使用此方法的警告,并注意它与替换它的禁用/还原组合方法不兼容。

    有没有安全的方法强制重定向 给win32打个电话?

    这些文档声明重定向是线程特定的,因此我已经考虑为特定的调用使用适当的锁和等待来启动一个新线程,但我希望有一个更简单的解决方案。

    3 回复  |  直到 16 年前
        1
  •  0
  •   Sam Holder Brian Adams    16 年前

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

        2
  •  0
  •   Paul Alexander    16 年前

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

    var t = new Thread(() => 
        SafeNativeMethods.LoadLibraryExW("NTMARTA.DLL", IntPtr.Zero, 0) );
    t.Start();
    t.Join();
    
        3
  •  -1
  •   afrazier    16 年前

    为什么不使用shgetknownfolderpath或shgetfolderpath并查找folderid_systemx86/csidl_systemx86以获取加载dll的基本路径?这将使您获得与文件系统重定向无关的正确文件夹。

    推荐文章