重读Windows核心编程--CreateProcess

先来看看CreateProcess的定义

BOOL CreateProcess (

PCTSTR pszApplicationName,

PTSTR pszCommandLine,

PSECURITY_ATTRIBUTES psaProcess,

PSECURITY_ATTRIBUTES psaThread,

BOOL bInheritHandles,

DWORD fdwCreate,

PVOID pvEnvironment,

PCTSTR pszCurDir,

PSTARTUPINFO psiStartInfo,

PROCESS_INFORMATION ppiProcInfo

)

第一个参数为程序名,不能省略.exe,如果为NULL的话,就默认第二个字符串的前面一段是程序名

第二个参数是PTSTR,因此不能传递一个常量字符串

第三个和第四个参数中有个hInheritHandles的成员,举个例子来说,A生成B,C,D......,B的这两个参数决定了其进程和线程的句柄是否能被C,D...所继承

但是第五个参数相当于一个总开关,不管前面怎么设置,但是一旦bInheritHandles为FALSE,则所有的句柄都不能被父进程A继承

第六个参数fdwCreate有多个flag,参见中文版p89.

DEBUG_PROCESS,DEBUG_ONLY_THIS_PROCESS 表示调试子进程,后面的那个参数表示A调试B,但是B生成C,A只会收到任何从B到达的事件

CREATE_SUSPENDED 创建时挂起进程

DETACHED_PROCESS 字面意思分离进程,假设一个CUI程序A生成了另一个CUI程序B,默认B会使用A的控制台,这个参数组织这类情况,并且指定一个额外的控制台让B输出

CREATE_NEW_CONSOLE 表示为新进程创建一个新的控制台,不能与上面的混用

CREATE_NO_WINDOW 指示不要为进程创建任何控制台窗口

CREATE_NEW_PROCESS_GROUP 父进程A生成了一组进程,如果某一个cui获得了ctrl-c ctrl+break 整组的进程都讲获得这个信息

CRREATE_DEFAULT_ERROR_MODE 进程不会继承父进程的error mode,而是默认的

CREATE_SEPARATE_WOW_VDM 只有当程序是16位才有用,表示为其创建一个新的DOS虚拟机

CREATE_SHARED_WOW_VDM 只有当程序是16位才有用,表示所有的16位程序都在一个DOS虚拟机中(同时这也是默认情况,可修改注册表改变这种情况)

CREATE_UNICODE_ENVIRONMENT 进程的环境块为unicode,默认和ansi

CREATGE_FORCEDOS 强制系统一个嵌入在16位OS/2应用程序中的MS-DOS程序

CREATE_BREAKWAY_FROM_JOB 

EXTENDED_STARTUPINFO_PRESENT 表示psiStartInof是个STARTINFOEX结构

同时还可以指定优先级

IDLE_PRIORITY_CLASS

BELOW_NORMAL_PRI...

NORMAL_PRI...

ABOVE_PRI...

HIGH_PRI...

REALTIME_PRI...

第六个参数当传入NULL,默认继承父进程的环境变量

第七个参数可以更改运行目录

第八个参数的定义如下

typedef struct _STARTUPINFO

{

cb,

lpReserved,

lpDesktop,

lpTitle,

dwX,

dwY,

dwXSize,

dwYSize,

dwXCountChars,

dwYCountChars,

dwFillAttribute,

dwFlags,

wShowWindow,

cbReserved2,

lpReserved,

hStdInput,

hStdOutput,

hStdError

}STARTUPINFO, *LPSTARTUPINFO

前面几个参数从字面意思就可以推导出来是做什么的,注意有些参数只有当子进程用了DEFAULT参数才会生效,最后的三个参数可以用来重定向

dwFlags决定哪些参数生效,例如STARTF_USESIZE,另外还有两个参数决定是否在生成子进程的过程中给个视觉反馈

STARTF_FORCEONFRRDBACK STARTF_FORCEOFFFEEDBACK

STARTUPINFOEX只比它多了一个参数lpAttributeList,它的设置可以设置子进程可以从父进程继承哪些句柄,并且可以更改父子进程的关系,详情参见p96-97

最后一个参数ppiProcInfo,有以下几个成员

hProcess,

hThread,

dwProcessId,

dwThreadId

你可能感兴趣的:(重读Windows核心编程)