进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:
一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。
另一个是地址空间,它包含所有可执行模块或D L L 模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。
BOOL CreateProcess(
PCTSTR pszApplicationName, //pszApplicationName指定要创建进程的应用程序名,如在此设置需要全名PTSTR pszCommandLine, //需要创建进程的命令行参数,一般第一个字符用来存储应用程序名,不需要全地址PSECURITY_ATTRIBUTES psaProcess, //描述进程的可继承特征,为SECURITY_ATTRIBUTES结构体PSECURITY_ATTRIBUTES psaThread,
//描述主线程的可继承性
BOOL bInheritHandles,
//被创建的进程是否继承当前进程的内核操作权限
DWORD fdwCreate,
//规定如何创建进程
PVOID pvEnvironment, //pvEnvironment参数用于指向包含新进程将要使用的环境字符串的内存块。
//在大多数情况下,为该参数传递N U L L ,使子进程能够继承它的父进程正在使用的一组环境字符串。
PCTSTR pszCurDir, // pszCurDir允许父进程设置子进程的当前驱动器和目录。
//如果本参数是N U L L ,则新进程的工作目录将与生成新进程的应用程序的目录相同。
PSTARTUPINFO psiStartInfo, //位置窗口标题显示名称光标等信息,包含了控制台模式和窗体模式,但我并不关心
//一般使用默认值但是需要初始化长度
PPROCESS_INFORMATION ppiProcInfo);
当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,其初始使用计数是1 。该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个较小的数据结构。可以将进程内核对象视为由进程的统计信息组成的一个较小的数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件或任何必要的D L L 文件的代码和数据加载到该进程的地址空间中。
Code
/**//************************************************************
Module name: Inherit.c
Notices:Copyright(c)2000 Jeffrey Richter
************************************************************/
#include <Windows.h>
int WINAPI WinMain (HINSTANCE hinstExe,HINSTANCE, PSTR pszCmdLine,int nCmdShow)
{
//Prepare a STARTUPINFO structure
//for spawning processes.
//定义STARTUPINFO结构体为创建进程做准备
STARTUPINFO si = { sizeof(si) };
//将该结构中的所有成员初始化为零,然后将c b 成员设置为该结构的大小:SECURITY_ATTRIBUTES saProcess,saThread;
PROCESS_INFORMATION piProcessB,piProcessC;
TCHAR szPath[MAX_PATH];
//Prepare to spawn Process B from Process A.
//The handle identifying the new process
//object should be inheritable.
//准备从进程A中创建进程B
//saProcess.bInheritHandle = TRUE;
//标示表示新的进程能够被继承
saProcess.nLength = sizeof(saProcess);
saProcess.lpSecurityDescriptor = NULL;
saProcess.bInheritHandle = TRUE;
//The handle identifying the new thread
//object should NOT be inheritable.
//saThread.bInheritHandle = FALSE;
//这个标示线程不能被继承
saThread.nLength = sizeof(saThread);
saThread.lpSecurityDescriptor = NULL;
saThread.bInheritHandle = FALSE;
//Spawn Process B.
//创建进程B
lstrcpy(szPath,TEXT("ProcessB"));
CreateProcess(NULL,szPath, &saProcess,&saThread, FALSE,0,NULL,NULL,&si,
&piProcessB);
//The pi structure contains two handles
//relative to Process A:
//hProcess,which identifies Process B's process //object and is inheritable; and hThread,
//which identifies Process B's primary thread
//object and is NOT inheritable.
//Prepare to spawn Process C from Process A.
//Since NULL is passed for the psaProcess and
//psaThread parameters,the handles to Process C's
//process and primary thread objects default
//to "noninheritable."
//If Process A were to spawn another process,
//this new process would NOT inherit handles
//to Process C's process and thread objects.
//Because TRUE is passed for the bInheritHandles
//parameter,Process C will inherit the handle that
//identifies Process B's process object but will
//not inherit a handle to Process B's primary
//thread object.
//PI结构体包含两个句柄
//并且关联到进程A中:
//被声明为可继承的进程B(hProcess),
//和被声明为不可继承的进程B的主线程(hThread)
//从进程A中创建进程C
//是通过一个空的psaProcess和一个空的psaThread参数
//所以进程C的进程和主线程是默认不可继承的
//如果进程A创建一个新的进程
//这个新的进程是不能继承进程C的进程和主线程的
//由于在创建进程C的时候CreateProcess的参数
//bInheritHandles被置为True,进程C将会继承进程B //的进程,但是不会进程进程B的主线程
lstrcpy(szPath,TEXT("ProcessC"));
CreateProcess(NULL,szPath,NULL,NULL, TRUE,0,NULL,NULL,&si,&piProcessC);
return(0);
}
责任编辑:小草