4

假设您有一个应用程序,您希望用户能够浏览 system32 目录并在其中执行程序(如 telnet)。

当您需要支持 XP 以上作为客户端并支持 2k 以上作为服务器时,支持此功能的最佳方法是什么?

写完所有这些后,我想知道是否需要太多时间/精力来提供浏览器来执行此操作,他们可以从资源管理器中复制它。仍然需要启动能力。

我发现了一些关于Nynaeve的讨论。

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

  1. 在 Windows 中创建一个 sysnative 文件夹,它允许您浏览/执行 64 位。问题是:
    • 仅适用于 Vista/Longhorn,因此不支持 XP 64
    • 导致路径命名不同,不能在多个版本上使用相同的路径。
    • 将激活整个窗口,而不仅仅是我们的应用程序
    • 安装应用程序时可能不适合(可能不适合)
    • 如果有 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);
4

2 回答 2

4

我选择了选项 2,对于那些可能感兴趣的人;这是我对基于 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
于 2009-02-05T03:16:09.933 回答
0

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

于 2009-02-04T21:26:20.247 回答