进程创建标志

CreateProcess、CreateProcessAsUserCreateProcessWithLogonWCreateProcessWithTokenW 函数使用以下进程创建标志。 可以任意组合指定它们,但如前所述。

示例

     BOOL creationResult;
    
    creationResult = CreateProcess(
        NULL,                   // No module name (use command line)
        cmdLine,                // Command line
        NULL,                   // Process handle not inheritable
        NULL,                   // Thread handle not inheritable
        FALSE,                  // Set handle inheritance to FALSE
        NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP, // creation flags
        NULL,                   // Use parent's environment block
        NULL,                   // Use parent's starting directory 
        &startupInfo,           // Pointer to STARTUPINFO structure
        &processInformation);   // Pointer to PROCESS_INFORMATION structure

GitHub 上的 Windows 经典示例 示例。

Flags

常量/值 说明
CREATE_BREAKAWAY_FROM_JOB
0x01000000
与作业关联的进程的子进程不与作业关联。
如果调用进程未与作业关联,则此常量不起作用。 如果调用进程与作业相关联,则作业必须设置 JOB_OBJECT_LIMIT_BREAKAWAY_OK 限制。
CREATE_DEFAULT_ERROR_MODE
0x04000000
新进程不会继承调用进程的错误模式。 相反,新进程会获取默认错误模式。
此功能对于在运行时禁用了硬错误的多线程 shell 应用程序特别有用。
默认行为是让新进程继承调用方的错误模式。 设置此标志会更改该默认行为。
CREATE_NEW_CONSOLE
0x00000010
新进程具有新的控制台,而不是继承其父级的控制台 (默认) 。 有关详细信息,请参阅 创建控制台
此标志不能与 DETACHED_PROCESS 一起使用。
CREATE_NEW_PROCESS_GROUP
0x00000200
新进程是新进程组的根进程。 进程组包括此根进程的所有子代进程。 新进程组的进程标识符与 lpProcessInformation 参数中返回的进程标识符相同。 GenerateConsoleCtrlEvent 函数使用进程组来向一组控制台进程发送 CTRL+BREAK 信号。
如果指定了此标志,将为新进程组中的所有进程禁用 CTRL+C 信号。
如果使用 CREATE_NEW_CONSOLE 指定,则忽略此标志。
CREATE_NO_WINDOW
0x08000000
进程是在没有控制台窗口的情况下运行的控制台应用程序。 因此,未设置应用程序的控制台句柄。
如果应用程序不是控制台应用程序,或者与 CREATE_NEW_CONSOLEDETACHED_PROCESS一起使用,则忽略此标志。
CREATE_PROTECTED_PROCESS
0x00040000
进程将作为受保护的进程运行。 系统限制对受保护进程和受保护进程的线程的访问。 有关进程如何与受保护进程交互的详细信息,请参阅 进程安全性和访问权限
若要激活受保护的进程,二进制文件必须具有特殊签名。 此签名由 Microsoft 提供,但当前不适用于非 Microsoft 二进制文件。 目前有四个受保护的进程:媒体基础、音频引擎、Windows 错误报告和系统。 加载到这些二进制文件中的组件也必须签名。 多媒体公司可以利用前两个受保护的流程。 有关详细信息,请参阅 受保护的媒体路径概述
Windows Server 2003 和 Windows XP: 不支持此值。
CREATE_PRESERVE_CODE_AUTHZ_LEVEL
0x02000000
允许调用方执行子进程,该子进程绕过通常自动应用于进程的进程限制。
CREATE_SECURE_PROCESS
0x00400000
此标志允许启动在Virtualization-Based安全环境中运行的安全进程。
CREATE_SEPARATE_WOW_VDM
0x00000800
仅当启动基于 Windows 的 16 位应用程序时,此标志才有效。 如果设置,新进程将在专用虚拟 DOS 计算机 (VDM) 中运行。 默认情况下,所有基于 Windows 的 16 位应用程序在单个共享 VDM 中作为线程运行。 单独运行的优点是崩溃仅终止单个 VDM;在其他 VM 中运行的任何其他程序继续正常运行。 此外,在单独的 VM 中运行的基于 Windows 的 16 位应用程序具有单独的输入队列。 这意味着,如果一个应用程序暂时停止响应,则单独的 VM 中的应用程序将继续接收输入。 单独运行的缺点是这样做所需的内存要多得多。 仅当用户请求 16 位应用程序应在其自己的 VDM 中运行时才应使用此标志。
CREATE_SHARED_WOW_VDM
0x00001000
仅当启动基于 Windows 的 16 位应用程序时,标志才有效。 如果 WIN.INI 的 Windows 部分中的 DefaultSeparateVDM 开关为 TRUE,则此标志将替代该开关。 新进程在共享的虚拟 DOS 计算机中运行。
CREATE_SUSPENDED
0x00000004
新进程的主线程处于挂起状态创建,在调用 ResumeThread 函数之前不会运行。
CREATE_UNICODE_ENVIRONMENT
0x00000400
如果设置了此标志,则 lpEnvironment 指向的环境块使用 Unicode 字符。 否则,环境块使用 ANSI 字符。
DEBUG_ONLY_THIS_PROCESS
0x00000002
调用线程启动并调试新进程。 它可以使用 WaitForDebugEvent 函数接收所有相关的调试事件。
DEBUG_PROCESS
0x00000001
调用线程启动并调试新进程以及新进程创建的所有子进程。 它可以使用 WaitForDebugEvent 函数接收所有相关的调试事件。
使用 DEBUG_PROCESS 的进程将成为调试链的根。 这会一直持续到使用 DEBUG_PROCESS 创建链中的另一个进程。
如果此标志与 DEBUG_ONLY_THIS_PROCESS 结合使用,则调用方仅调试新进程,而不调试任何子进程。
DETACHED_PROCESS
0x00000008
对于控制台进程,新进程不会继承其父级的控制台 (默认) 。 新进程可以在以后调用 AllocConsole 函数来创建控制台。 有关详细信息,请参阅 创建控制台
此值不能与 CREATE_NEW_CONSOLE 一起使用。
EXTENDED_STARTUPINFO_PRESENT
0x00080000
使用扩展启动信息创建进程; lpStartupInfo 参数指定 STARTUPINFOEX 结构。
Windows Server 2003 和 Windows XP: 不支持此值。
INHERIT_PARENT_AFFINITY
0x00010000
进程继承其父级的相关性。 如果父进程在多个 处理器组中具有线程,则新进程将继承父进程正在使用的任意组的组相对相关性。
Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 不支持此值。

备注

在 32 位 Windows 上,16 位应用程序通过ntvdm.exe模拟,而不是作为单个进程运行。 因此,进程创建标志适用于 ntvdm.exe。 由于运行第一个 16 位应用程序后,ntvdm.exe仍然存在,因此启动另一个 16 位应用程序时,不会应用新的创建标志,但 CREATE_NEW_CONSOLECREATE_SEPARATE_WOW_VDM除外,它们创建新ntvdm.exe。

要求

要求
最低受支持的客户端
Windows XP [仅限桌面应用]
最低受支持的服务器
Windows Server 2003 [仅限桌面应用]
标头
WinBase.h (包括 Windows.h)