2024年3月21日发(作者:)

CreateProcess函数原型如下:

[cpp] view plaincopy

1. BOOL CreateProcess(

2. PCTSTR pszApplicationName,

3. PTSTR pszCommandLine,

4. PSECURITY_ATTRIBUTES psaProcess,

5. PSECURITY_ATTRIBUTES psaThread,

6. BOOL bInheritHandles,

7. DWORD fdwCreate,

8. PVOID pvEnvironment,

9. PCTSTR pszCurDir,

10. PSTARTUPINFO psiStartInfo,

11. PPROCESS_INFORMATION ppiProcInfo);

一、参数

PCTSTR pszApplicationName

和 参数

PTSTR pszCommandLine

该参数类型为PTSTR,在函数运行过程中,CreateProcess函数会修改其值,但是在

CreateProcess返回前又会复原为原来传入时的值.当CreateProcess试图修改该字符串时,

就会发生违规访问(较早的Visual C++版本将该字符串放入读/写内存,因此调用

CreateProcess不会导致违规访问的问题)。

解决这个问题的最好办法是在调用CreateProcess之前像下面这样将常量字符串拷贝到临

时缓存中:

[cpp] view plain copy

1. //所以如下调用可能会出错:

2. STARTUPINFO si = { sizeof(si) };

3. PROCESS_INFORMATION pi;

4. CreateProcess(NULL, TEXT("NOTEPAD"), NULL, NULL,FALSE, 0, NULL, NULL, &si, &

pi);

5.

6. //正确的调用应该是先将其传给一个变量,然后将该变量作为参数传入:

7. STARTUPINFO si = { sizeof(si) };

8. PROCESS_INFORMATION pi;

9. TCHAR szCommandLine[] = TEXT("NOTEPAD");

10. CreateProcess(NULL, szCommandLine, NULL, NULL,FALSE, 0, NULL, NULL, &si, &pi

);

如果pszApplicationName 值为NULL时,CreateProcess函数就会解析pszCommandLine参

数,pszCommandLine参数需要包含一个进程创建的所有参数,如新进程的可执行文件名。

如果程序没有后缀名,默认的后缀名是.exe。CreateProcess函数会按照如下五种顺序来搜

寻对应的程序名:

主调进程.exe文件的所在目录。

主调进程的的当前目录。

windows 系统目录,即GetSystemDirectory返回的System32子文件夹。

1

windows目录。

PATH环境变量中列出的目录。

如果如果pszApplicationName 值不为NULL时,你必须在pszApplicationName传入可执行

文件名(包含后缀名)。并且没有指定可执行文件的路径,reateProcess函数假设可执行文

件就在当前目录,如果没有找到,则函数直接返回FALSE,不会按照上面那五种目录进行查

找。实例如下:

[cpp] view plain copy

1. // Make sure that the path is in a r

ead/write section of memory.

2. TCHAR szPath[] = TEXT("WORDPAD ");

3. // Spawn the new process.

4. CreateProcess(TEXT("C:"),szPath,...);

二、参数psaProcess, psaThread, 和 bInheritHandles

创建一个新进程时一个进程和一个基线程。由于两个都是Kernel Object,都需要有两个对

应的PSECURITY_ATTRIBUTES的结构体。psaProcess 和 psaThread 分别指向这两个结构体。

你可以通过设置这两个结构体的值来设置对应的子进程和基线程的安全属性,如果这两个值

都为NULL时,则系统将赋予进程和基线程默认的安全描述符。父进程在以后再创建子进程

时,通过把bInhertHandles参数设置为TRUE,就可以让新的子进程继承父进程所有可继承

的句柄(handle)。为bInhertHandles传递FA L S E ,那么子进程 将不能继承父进程目前

使用的任何句柄。一个实例如下:

[cpp] view plain copy

1. /************************************************************

2. Module name: Inherit.c

3. Notices:Copyright(c)2000 Jeffrey Richter

4. ************************************************************/

5. #include

6.

7. int WINAPI WinMain (HINSTANCE hinstExe,HINSTANCE,

8. PSTR pszCmdLine,int nCmdShow)

9. {

10.

11. //Prepare a STARTUPINFO structure

12. //for spawning processes.

13. STARTUPINFO si = { sizeof(si) };

14. SECURITY_ATTRIBUTES saProcess,saThread;

15. PROCESS_INFORMATION piProcessB,piProcessC;

16. TCHAR szPath[MAX_PATH];

17.

18. //Prepare to spawn Process B from Process A.

19. //The handle identifying the new process

2