代码之家  ›  专栏  ›  技术社区  ›  Francis

64位Windows操作系统上32位进程内的setenvironmentvariable

  •  0
  • Francis  · 技术社区  · 14 年前

    我最近发现了一个有趣的问题。使用setenvironmentvariable时,我可以使用process explorer获取新创建的环境变量。但是,当进程本身是32位,而操作系统是64位时,进程资源管理器(至少是v10 ~最新的v11.33)找不到新的变量。如果程序是本机64位的,那么一切都可以正常工作,就像32位操作系统上运行的32位进程一样。

    setenvironmentvariable API调用应成功,因为返回值为true,而调用getenvironmentvariable将返回正确的值。此外,如果创建子进程,则可以使用进程资源管理器发现变量在新进程中设置正确。

    如果这是SysWow64的限制,或者是ProcessExplorer中的一个bug,我不会这样做。有人知道吗?

    还有,有没有办法正确地得到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 回复  |  直到 14 年前
        1
  •  1
  •   wj32    14 年前

    我不确定wow64是如何工作的,但我很确定(99%)有两个创建的pebs(进程环境块)-一个32位的和一个64位的。过程参数结构(rtl_user_process_参数)也可能是重复的。因此,当调用setenvironmentvariable时,它只修改32位环境块。PE将作为本机64位程序运行,这意味着它只知道64位PEB和64位环境块(它没有改变)。

    更新(2010-07-10):

    关于这个旧主题的一些新信息:您可以通过用processw64信息调用ntqueryinformationprocess来找到32位的peb。它给你一个pvoid,地址是peb。