【问题标题】:SetEnvironmentVariable within 32bit Process on 64 bit Windows OS64 位 Windows 操作系统上 32 位进程内的 SetEnvironmentVariable
【发布时间】:2010-01-18 09:18:35
【问题描述】:

我最近发现了一个有趣的问题。在使用 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;
}

【问题讨论】:

    标签: 64-bit environment-variables process-explorer


    【解决方案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。

    【讨论】:

    • 那么有没有办法得到正确的结果?我找不到在 32 位进程中更改 64 位 env 块的 API,也找不到任何让 PE 在 32 位模式下工作的开关...
    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 2014-07-05
    • 2015-09-26
    • 1970-01-01
    • 2011-07-07
    • 2011-12-18
    • 2011-07-29
    • 2013-08-29
    相关资源
    最近更新 更多