SetEnvironmentVariable в 32-битном процессе на 64-битной ОС Windows - PullRequest
0 голосов
/ 18 января 2010

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

Вызов API-интерфейса SetEnvironmentVariable должен быть успешным, поскольку возвращаемое значение равно TRUE, а вызов 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 Ответ

1 голос
/ 18 января 2010

Я не уверен, как работает WOW64, но я почти (99%) уверен, что создано два PEB (Process Environment Blocks) - 32-битный и 64-битный. Структуры параметров процесса (RTL_USER_PROCESS_PARAMETERS), вероятно, также дублированы. Поэтому, когда вы вызываете SetEnvironmentVariable, он только изменяет 32-битный блок среды. PE будет работать как собственная 64-битная программа, что означает, что он знает только о 64-битной PEB и 64-битном блоке среды (который не изменился).

Обновление (2010-07-10):

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...