2010-01-18 146 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

相關問題