0

最近、興味深い問題を見つけました。SetEnvironmentVariable を使用すると、Process Explorer を使用して新しく作成された環境変数を取得できます。ただし、プロセス自体が 32 ビットで OS が 64 ビットの場合、Process Explorer (少なくとも v10 ~ 最新の v11.33) は新しい変数を見つけることができません。プログラムがネイティブ 64 ビットの場合、32 ビット OS で実行されている 32 ビット プロセスと同様に、すべて正常に動作します。

戻り値が TRUE で、GetEnvironmentVariable を呼び出すと正しい値が返されるため、SetEnvironmentVariable API 呼び出しは成功するはずです。また、子プロセスを作成する場合は、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 がどのように機能するかはわかりませんが、32 ビットと 64 ビットの 2 つの PEB (プロセス環境ブロック) が作成されていることは (99%) 確信しています。プロセス パラメーター構造 (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 に答える