2010-01-18 1 views
0

Недавно я нашел интересную проблему. При использовании SetEnvironmentVariable я могу использовать Process Explorer для получения вновь созданной переменной окружения. Однако, когда сам процесс составляет 32 бит, а ОС - 64 бит, Process Explorer (по крайней мере, v10 ~ последний v11.33) не может найти новые переменные. Если программа является родной 64-битной, все работает нормально, так же как и 32-разрядный процесс, запущенный на 32-битной ОС.SetEnvironmentVariable в течение 32-битного процесса на 64-битной ОС Windows

Вызов API SetEnvironmentVariable должен быть успешным, поскольку возвращаемое значение имеет значение ИСТИНА, а вызов GetEnvironmentVariable возвращает правильное значение. Также, если вы создаете дочерний процесс, вы можете найти, что переменная была правильно установлена ​​в новом процессе с помощью Process Explorer.

Я не, если это ограничение SysWOW64 или ошибка в Process Explorer. Кто-нибудь знает?

И, есть ли способ получить 32-битные переменные среды правильно? (Например, сила 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, но я довольно (99%) уверены, что созданы два PEB (блоки процесса среды) - 32-разрядные и 64-разрядные. Структуры параметров процесса (RTL_USER_PROCESS_PARAMETERS), вероятно, также дублируются. Поэтому, когда вы вызываете SetEnvironmentVariable, он только модифицирует 32-битный блок среды. PE будет работать как собственная 64-разрядная программа, которая будет означать, что он знает только о 64-битном PEB и 64-битном блоке среды (который не изменился).

Update (2010-07-10):

Просто некоторая новая информация по этой старой теме: Вы можете найти 32-битный PEB по телефону NtQueryInformationProcess с ProcessWow64Information. Он дает вам PVOID с адресом PEB.

+0

Так или иначе, чтобы получить правильные результаты? Я не могу найти API для изменения 64-битного блока env внутри 32-битного процесса, а также никаких переключателей для PE для работы в 32-битном режиме ... – Francis

+0

Я так не думаю. Если вы в отчаянии, я могу порекомендовать другие инструменты, хотя ... – wj32