64 비트 Windows에서 32 비트 앱을 허용하는 방법 Windows System32에서 제공된 64 비트 앱을 실행합니다.
-
21-08-2019 - |
문제
사용자에게 System32 디렉토리를 탐색하고 (Telnet과 같은) 프로그램을 실행할 수있는 기능을 제공하려는 앱이 있다고 가정 해 봅시다.
클라이언트로서 XP를 지원하고 서버를 위해 2K를 지원해야 할 때이를 지원하는 가장 좋은 방법은 무엇입니까?
이 모든 것을 작성한 후에는 탐색기로부터 복사 할 수있는이 작업을 탐색하는 데 너무 많은 시간/노력이 있는지 궁금합니다. 여전히 출시 능력이 필요합니다.
나는 논의를 발견했다 nynaeve.
지금까지 다음 옵션이있는 것 같습니다
- Windows에서 Sysnative 폴더를 만들어 64 비트를 탐색/실행할 수 있습니다. 문제는 다음과 같습니다.
- Vista/Longhorn에서만 사용할 수 있으므로 XP 64에 대한 지원이 없습니다.
- 다른 경로 명명으로 연결되며 여러 버전에서 동일한 경로를 사용할 수 없습니다.
- 앱뿐만 아니라 전체 Windows에서 활성화됩니다.
- 앱을 설치할 때 수행하기에 적합하지 않을 수 있습니다.
- 32 비트 및 64 비트 버전이있는 경우 출시 할 앱의 어떤 버전 만 경로를 명시 적으로 지정할 수 있습니다.
- 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 비트 앱을 시작할 수 있습니다.