0

我最近发现了一个有趣的问题。在使用 SetEnvironmentVariable 时,我可以使用 Process Explorer 来获取新创建的环境变量。但是,当进程本身为 32 位且操作系统为 64 位时,Process Explorer(至少 v10 ~ 最新 v11.33)无法找到新变量。如果程序是本机 64 位的,那么一切正常,就像在 32 位操作系统上运行的 32 位进程一样。

SetEnvironmentVariable API 调用应该是成功的,因为返回值为 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;
}
4

1 回答 1

1

我不确定 WOW64 是如何工作的,但我很确定(99%)创建了两个 PEB(进程环境块)——一个 32 位和一个 64 位。过程参数结构 (RTL_USER_PROCESS_PARAMETERS) 也可能重复。因此,当您调用 SetEnvironmentVariable 时,它​​只是在修改 32 位环境块。PE 将作为本机 64 位程序运行,这意味着它只知道 64 位 PEB 和 64 位环境块(未更改)。

更新(2010-07-10):

只是关于这个旧主题的一些新信息:您可以通过使用 ProcessWow64Information 调用 NtQueryInformationProcess 来找到 32 位 PEB。它为您提供了一个带有 PEB 地址的 PVOID。

于 2010-01-18T09:39:50.680 回答