如何让64位Windows上的32位应用程序执行Windows\System32中提供的64位应用程序

4

假设你有一个应用程序,想要为用户提供浏览system32目录并在其中执行程序(如telnet)的能力。

当你需要支持XP及以上版本的客户端和2k及以上版本的服务器时,最好的支持方法是什么?

写完所有内容后,我在想是否提供浏览器来实现这一点会花费太多时间/精力,他们可以从资源管理器中复制它。但仍需要启动的能力。

我在Nynaeve上找到了一些讨论。

到目前为止,似乎有以下几个选项:

  1. 在Windows中创建一个sysnative文件夹,它将允许您浏览/执行64位。问题是:
    • 仅适用于Vista / Longhorn,因此不支持XP 64
    • 会导致不同的路径命名,不能在多个版本上使用相同的路径。
    • 将在整个Windows上激活,而不仅仅是我们的应用程序
    • 在安装应用程序时可能不(很可能不)合适
    • 如果存在32位和64位版本,则仅允许通过路径显式指定要启动的应用程序版本
  2. 使用Windows API在显示文件列表或执行用户运行命令时暂时禁用重定向。问题是:
    • 仅适用于64位-必须使用GetProcAddress进行操作
    • 仅在某些服务包下可用
    • 必须单独识别所有应实现此功能的位置
    • 用户需要提供有关此是否为64位应用程序或32位应用程序的单独信息。

如果有人有一些示例代码,可以显示一个Windows OpenFile对话框(例如使用MFC CFileDialog),并在XP / Vista上本地显示,并允许查看64位system32目录,那就太棒了。

如果有人有启动所命名应用程序的示例,那就太好了!

编辑:
目前我们使用CreateProcess来启动该应用程序(但失败了)。
err = CreateProcess((wchar_t*)exeName.c_str(), (wchar_t*)cmdLine.c_str(), NULL, NULL, FALSE, CREATE_SEPARATE_WOW_VDM, NULL, workingDir.c_str(), &startupInfo, &processInfo);
2个回答

4

我选择了第二个选项, 对于那些可能感兴趣的人,这是我快速修改的一个范围版本,用于管理基于MS注释的Wow64重定向禁用。如果API可用,则会重定向,预计kernel32.dll已经可用。

class Wow64RedirectOff {
    typedef BOOL (WINAPI *FN_Wow64DisableWow64FsRedirection) ( __out PVOID *OldValue );
    typedef BOOL (WINAPI *FN_Wow64RevertWow64FsRedirection) ( __in  PVOID OldValue );

public:
    Wow64RedirectOff() {
        LPFN_Disable = (FN_Wow64DisableWow64FsRedirection)GetProcAddress(
            GetModuleHandle(TEXT("kernel32")),"Wow64DisableWow64FsRedirection");
        if( LPFN_Disable ) {
            LPFN_Disable(&OldValue);
        }
    }

    ~Wow64RedirectOff() {
        if( LPFN_Disable ) {
            FN_Wow64RevertWow64FsRedirection LPFN_Revert = (FN_Wow64RevertWow64FsRedirection)GetProcAddress(
                GetModuleHandle(TEXT("kernel32")),"Wow64RevertWow64FsRedirection");
            if( LPFN_Revert ) {
                LPFN_Revert(OldValue);
            }
        }
    }

private:
    FN_Wow64DisableWow64FsRedirection LPFN_Disable;
    PVOID OldValue; 
};

因此使用方法将会是:

Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess

0

你是否被重定向到Windows/SysWoW64?我可以从32位托管可执行文件的OpenFile中启动64位应用程序,而这些应用程序位于Windows/System32中。


本机C++,不确定与托管有何主要区别。我不确定OpenFile是一个好的例子,我不只想读取telnet.exe的内容。就像OpenFile函数可以创建、打开、重新打开或删除文件一样。这是你的意思吗? - Greg Domjan
作为一个微不足道的测试,我右键点击并从OpenFile对话框中运行了System32中的一个64位exe。我只是想通过最简单的方式看看是否有可能。 - Cat Zimmermann
啊,我现在明白你的意思了,但是我们甚至无法看到64位版本的System32文件夹来执行这样的操作。 - Greg Domjan

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