CreateProcess所需要的最少环境变量

来源:互联网 发布:淘宝店铺首页代码 编辑:程序博客网 时间:2024/04/30 06:12

关于CreateProcess,在MSDN里面有比较详细的文档,但是关于其中的lpEnvironment参数却语焉不详,它只是告诉我们这个参数该以什么形式使用,但是对于这个参数可以传递的内容却闭口不谈,那么什么样的环境变量是必须传递的,什么是不可以传递的呢?本文就此做一番讨论。当然,你大可将这个参数设置为NULL,那也就没必要再往下看了。

1.1    正常情况下的环境变量

Windows提供了一个叫GetEnviromentString的函数用以取得程序中可用的环境变量,我们先看看正常情况下定义了什么变量。

     WCHAR* pEnv = GetEnvironmentStrings();

     while(*pEnv != 0)

     {

         wprintf((wchar_t*)pEnv);

         wprintf(L"/n");

         pEnv += wcslen(pEnv) + 1;

     }

     FreeEnvironmentStrings(pEnv);

上面的代码将输出所有的环境变量,注意到GetEnvironmentStrings的返回值是0x10000,这是进程环境块的地址,难怪不可以直接修改!上述代码得到的变量里面,有一些可以在系统属性的环境变量中看到,有一些则不行。

1.2    创建进程的最少环境变量

在上面列出的环境变量里面,哪些是创建一个进程所必须的呢?尝试用这样的代码创建一个子进程:

     WCHAR env[20000];

     memset(env, 0, sizeof(WCHAR) * 20000);

     STARTUPINFO si;

     memset(&si, 0, sizeof(si));

     si.cb = sizeof(si);

     PROCESS_INFORMATION pi;

     memset(&pi, 0, sizeof(pi));

     CreateProcessW(L"e://windows//notepad.exe", NULL, NULL, NULL, FALSE,

         CREATE_UNICODE_ENVIRONMENT, env, NULL, &si, &pi);

这段代码传递的env参数没有任何内容,这个时候vs会提示应用程序初始化失败,但是CreateProcess的返回值为TRUE,且pi可以取得新进程的id。如果是在子进程中调用CreateProcessW,将不会有任何错误提示!

GetEnviromentString取得的环境变量值一个个代入,可以发现CreateProcess要成功至少需要一个叫SYSTEMROOT的环境变量,且这个变量的值不可改写,必须指向windows的根目录。

在调试cygwin.dll的时候还发现不能往子进程传递HOMEHOMEPATHAPPDATA三个变量,但是在单独写的测试程序中又可以传递,奇怪!