Как разрешить 32-битным приложениям в 64-битных Windows выполнять 64-битные приложения, представленные в Windows\System32

StackOverflow https://stackoverflow.com/questions/509989

Вопрос

Предположим, у вас есть приложение, в котором вы хотите предоставить пользователям возможность просматривать каталог system32 и выполнять в нем программы (например, telnet).

Каков наилучший способ поддержки этого, если вам нужно поддерживать XP и более поздние версии в качестве клиента и начиная с 2k для сервера?

Написав все это, я задаюсь вопросом, не слишком ли много времени/усилий требуется для обеспечения просмотра, чтобы сделать это, где они могли бы просто скопировать его из проводника.Все еще требует возможности запуска.

Я нашел некоторое обсуждение Найнив.

Пока кажется, что есть следующие варианты

  1. Создайте системную папку в Windows, которая позволит вам просматривать/выполнять 64-разрядную версию.Проблемы:
    • доступно только в Vista/Longhorn, поэтому поддержка XP 64 отсутствует.
    • приводит к разным именам путей, нельзя использовать один и тот же путь в нескольких версиях.
    • будет активен для всех окон, а не только для нашего приложения
    • может быть (вероятно, нецелесообразно) делать это при установке приложения
    • позволяет явно указать только путь, какую версию приложения запускать, если есть 32-битная и 64-битная версия
  2. Используйте 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-битном управляемом исполняемом файле.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top