如何允许 64 位 Windows 上的 32 位应用程序执行 Windows\System32 中提供的 64 位应用程序
-
21-08-2019 - |
题
假设您有一个应用程序,您希望为用户提供浏览 system32 目录并在其中执行程序(如 telnet)的能力。
当您需要支持 XP 以上的客户端和 2k 以上的服务器时,支持此功能的最佳方法是什么?
写完所有这些后,我想知道提供浏览器来执行此操作是否需要花费太多时间/精力,他们可以从浏览器中复制它。仍然需要启动能力。
我发现了一些讨论 奈奈维.
目前看来有以下几种选择
- 在 Windows 中创建一个 sysnative 文件夹,该文件夹将允许您浏览/执行 64 位。问题是:
- 仅适用于 Vista/Longhorn,因此不支持 XP 64
- 导致路径命名不同,不能在多个版本上使用相同的路径。
- 将对整个窗口有效,而不仅仅是我们的应用程序
- 安装应用程序时可能不(可能不)适合执行此操作
- 如果有 32 位和 64 位版本,则允许通过路径明确指定仅启动哪个版本的应用程序
- 在显示文件列表或执行用户运行命令时,使用 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;这是我根据 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
其他提示
您是否被重定向到 Windows/SysWoW64?我可以从 32 位托管可执行文件中的 OpenFile 从 Windows/System32 启动 64 位应用程序。
不隶属于 StackOverflow