2010-01-18 3 views
0

최근에 흥미로운 문제가 발견되었습니다. SetEnvironmentVariable을 사용할 때 Process Explorer를 사용하여 새로 만든 환경 변수를 가져올 수 있습니다. 그러나 프로세스 자체가 32 비트이고 OS가 64 비트 인 경우 프로세스 탐색기 (최소 v10 ~ 최신 v11.33)는 새 변수를 찾을 수 없습니다. 프로그램이 네이티브 64 비트라면 32 비트 OS에서 실행되는 32 비트 프로세스뿐만 아니라 모든 것이 잘 작동합니다.SetEnvironmentVariable in 32bit 64 비트 Windows OS에서 처리

반환 값이 TRUE이고 GetEnvironmentVariable을 호출하면 올바른 값을 반환하므로 SetEnvironmentVariable API 호출이 성공해야합니다. 또한 자식 프로세스를 만들면 프로세스 탐색기를 사용하여 새 프로세스에서 변수가 올바르게 설정되었는지 확인할 수 있습니다.

이것이 SysWOW64의 제한 사항이거나 Process Explorer의 버그 인 경우 아닙니다. 누구?

그리고 32 비트 환경 변수를 올바르게 가져올 수있는 방법이 있습니까? (

#include <stdio.h> 
#include <windows.h> 

int main(int argc, char *argv[]) 
{ 
    printf("setting variable... %s\n", 
     SetEnvironmentVariable("a_new_var", "1.0") ? "OK" : "FAILED"); 
    printf("press anykey to continue...\n"); 
    getchar(); 
    // system(argv[0]); // uncomment to inspect the child process 
    return 0; 
} 

답변

1

잘 모르겠어요 WOW64가 어떻게 작동하는지,하지만 난 꽤 있어요 : (예를 들어, 힘 프로세스 탐색기는 32 비트 모드에서 실행하거나 다른 도구)

샘플 소스를 재현 99 %)에는 두 개의 PEB (Process Environment Blocks)가 생성되어 있습니다 (32 비트 1 및 64 비트 1). 프로세스 매개 변수 구조 (RTL_USER_PROCESS_PARAMETERS)는 아마도 복제 될 수도 있습니다. 따라서 SetEnvironmentVariable을 호출하면 32 비트 환경 블록 만 수정됩니다. PE는 64 비트 PEB와 64 비트 환경 블록 (변경되지 않음)에 대해서만 알고 있다는 것을 의미하는 원시 64 비트 프로그램으로 실행됩니다.

업데이트 (2010-07-10) :

이 오래된 주제에 그냥 몇 가지 새로운 정보 : 당신은 ProcessWow64Information와 방법 NtQueryInformationProcess를 호출하여 32 비트 PEB를 찾을 수 있습니다. PEB의 주소가있는 PVOID를 제공합니다.

+0

어쨌든 정확한 결과를 얻으 려니? 32 비트 프로세스에서 64 비트 env 블록을 변경하거나 32 비트 모드에서 작동하는 PE 스위치를 찾을 수 없습니다. – Francis

+0

나는 그렇게 생각하지 않습니다. 네가 필사적이라면 나는 다른 도구를 추천 할 수있다 ... – wj32