64 비트 Windows에서 32 비트 앱을 허용하는 방법 Windows System32에서 제공된 64 비트 앱을 실행합니다.

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

문제

사용자에게 System32 디렉토리를 탐색하고 (Telnet과 같은) 프로그램을 실행할 수있는 기능을 제공하려는 앱이 있다고 가정 해 봅시다.

클라이언트로서 XP를 지원하고 서버를 위해 2K를 지원해야 할 때이를 지원하는 가장 좋은 방법은 무엇입니까?

이 모든 것을 작성한 후에는 탐색기로부터 복사 할 수있는이 작업을 탐색하는 데 너무 많은 시간/노력이 있는지 궁금합니다. 여전히 출시 능력이 필요합니다.

나는 논의를 발견했다 nynaeve.

지금까지 다음 옵션이있는 것 같습니다

  1. Windows에서 Sysnative 폴더를 만들어 64 비트를 탐색/실행할 수 있습니다. 문제는 다음과 같습니다.
    • Vista/Longhorn에서만 사용할 수 있으므로 XP 64에 대한 지원이 없습니다.
    • 다른 경로 명명으로 연결되며 여러 버전에서 동일한 경로를 사용할 수 없습니다.
    • 앱뿐만 아니라 전체 Windows에서 활성화됩니다.
    • 앱을 설치할 때 수행하기에 적합하지 않을 수 있습니다.
    • 32 비트 및 64 비트 버전이있는 경우 출시 할 앱의 어떤 버전 만 경로를 명시 적으로 지정할 수 있습니다.
  2. Windows API를 사용하여 파일 목록을 표시하거나 사용자 실행 명령을 실행할 때 리디렉션을 일시적으로 비활성화하십시오. 문제는 다음과 같습니다.
    • 64 비트에서만 사용 가능 - GetProcadDress를 엉망으로 만들어야합니다.
    • 특정 서비스 팩에서만 사용할 수 있습니다
    • 이것이 구현 해야하는 모든 위치를 개별적으로 식별해야합니다.
    • 사용자는 이것이 64 비트 앱인지 32 비트인지에 대한 별도의 정보를 제공해야합니다.

XP/Vista에 대해 Nativly를 보여주는 Windows OpenFile 대화 상자 (예 : MFC CFiledialog 사용)가 표시되고 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 비트 앱을 시작할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top