Как разрешить 32-битным приложениям в 64-битных Windows выполнять 64-битные приложения, представленные в Windows\System32
-
21-08-2019 - |
Вопрос
Предположим, у вас есть приложение, в котором вы хотите предоставить пользователям возможность просматривать каталог system32 и выполнять в нем программы (например, telnet).
Каков наилучший способ поддержки этого, если вам нужно поддерживать XP и более поздние версии в качестве клиента и начиная с 2k для сервера?
Написав все это, я задаюсь вопросом, не слишком ли много времени/усилий требуется для обеспечения просмотра, чтобы сделать это, где они могли бы просто скопировать его из проводника.Все еще требует возможности запуска.
Я нашел некоторое обсуждение Найнив.
Пока кажется, что есть следующие варианты
- Создайте системную папку в Windows, которая позволит вам просматривать/выполнять 64-разрядную версию.Проблемы:
- доступно только в Vista/Longhorn, поэтому поддержка XP 64 отсутствует.
- приводит к разным именам путей, нельзя использовать один и тот же путь в нескольких версиях.
- будет активен для всех окон, а не только для нашего приложения
- может быть (вероятно, нецелесообразно) делать это при установке приложения
- позволяет явно указать только путь, какую версию приложения запускать, если есть 32-битная и 64-битная версия
- Используйте API Windows, чтобы временно отключить перенаправление при отображении списков файлов или выполнении команд, запускаемых пользователями.Проблемы:
- Доступно только на 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 для тех, кто может быть заинтересован;вот мой быстрый способ управления отключением перенаправления Wow64 с ограниченной областью действия на основе примечаний MS.Выполнит перенаправление, если 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?Я могу запускать 64-битные приложения из Windows/System32 из OpenFile в 32-битном управляемом исполняемом файле.