2010-01-18 109 views
0

我最近发现了一个有趣的问题。当使用SetEnvironmentVariable时,我可以使用Process Explorer来获取新创建的环境变量。但是,当进程本身为32位,OS为64位时,Process Explorer(至少v10〜最新的v11.33)无法找到新变量。如果程序是原生64位,那么一切正常,就像在32位操作系统上运行的32位进程一样。64位Windows操作系统中的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; 
} 

回答

1

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

更新(2010-07-10):

就在这个老话题了一些新的信息:你可以通过调用NtQueryInformationProcess与ProcessWow64Information找到32位PEB。它为您提供了PEB地址的PVOID。

+0

那么无论如何要得到正确的结果吗?我无法找到API来更改32位进程内的64位env块,也没有任何开关让PE在32位模式下工作... – Francis 2010-01-18 10:13:46

+0

我不这么认为。如果你绝望,我可以推荐其他工具,但... – wj32 2010-01-18 11:34:46

相关问题