Флаги создания процесса

Следующие флаги создания процесса используются функциями CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW и CreateProcessWithTokenW . Их можно указать в любом сочетании, за исключением указанного.

Пример

     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

Пример из классических примеров Для Windows на сайте GitHub.

Флаги

Констант/значение Описание
CREATE_BREAKAWAY_FROM_JOB
0x01000000
Дочерние процессы процесса, связанного с заданием, не связаны с заданием.
Если вызывающий процесс не связан с заданием, эта константа не оказывает никакого влияния. Если вызывающий процесс связан с заданием, задание должно задать ограничение JOB_OBJECT_LIMIT_BREAKAWAY_OK .
CREATE_DEFAULT_ERROR_MODE
0x04000000
Новый процесс не наследует режим ошибок вызывающего процесса. Вместо этого новый процесс получает режим ошибки по умолчанию.
Эта функция особенно полезна для многопоточных приложений оболочки, работающих с отключенными жесткими ошибками.
По умолчанию новый процесс наследует режим ошибок вызывающего объекта. Установка этого флага изменяет поведение по умолчанию.
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_CONSOLE или DETACHED_PROCESS.
CREATE_PROTECTED_PROCESS
0x00040000
Процесс должен выполняться как защищенный процесс. Система ограничивает доступ к защищенным процессам и потокам защищенных процессов. Дополнительные сведения о том, как процессы могут взаимодействовать с защищенными процессами, см. в разделе Управление безопасностью и правами на доступ.
Чтобы активировать защищенный процесс, двоичный файл должен иметь специальную сигнатуру. Эта подпись предоставляется корпорацией Майкрософт, но в настоящее время недоступна для двоичных файлов, не относящихся к корпорации Майкрософт. В настоящее время существует четыре защищенных процесса: media foundation, звуковой модуль, отчеты об ошибках Windows и система. Компоненты, загружаемые в эти двоичные файлы, также должны быть подписаны. Мультимедийные компании могут использовать первые два защищенных процесса. Дополнительные сведения см. в статье Обзор пути к защищенному носителю.
Windows Server 2003 и Windows XP: Это значение не поддерживается.
CREATE_PRESERVE_CODE_AUTHZ_LEVEL
0x02000000
Позволяет вызывающей объекту выполнять дочерний процесс, который обходит ограничения процесса, которые обычно применяются к процессу автоматически.
CREATE_SECURE_PROCESS
0x00400000
Этот флаг позволяет запускать безопасные процессы, которые выполняются в среде Virtualization-Based Security.
CREATE_SEPARATE_WOW_VDM
0x00000800
Этот флаг действителен только при запуске 16-разрядного приложения windows. Если этот параметр задан, новый процесс выполняется на частной виртуальной машине DOS (VDM). По умолчанию все 16-разрядные приложения windows выполняются как потоки в одном общем VDM. Преимущество запуска по отдельности заключается в том, что при сбое завершается только один VDM; все другие программы, работающие на отдельных виртуальных машинах, продолжают работать нормально. Кроме того, 16-разрядные приложения Windows, которые выполняются в отдельных виртуальных машинах, имеют отдельные очереди ввода. Это означает, что если одно приложение мгновенно перестает отвечать, приложения на отдельных виртуальных машинах продолжают получать входные данные. Недостаток работы отдельно заключается в том, что для этого требуется значительно больше памяти. Этот флаг следует использовать только в том случае, если пользователь запрашивает, чтобы 16-разрядные приложения запускались в собственном VDM.
CREATE_SHARED_WOW_VDM
0x00001000
Флаг действителен только при запуске 16-разрядного приложения windows. Если параметр DefaultSeparateVDM в разделе Windows WIN.INI имеет значение TRUE, этот флаг переопределяет параметр. Новый процесс выполняется на общей виртуальной машине DOS.
CREATE_SUSPENDED
0x00000004
Основной поток нового процесса создается в приостановленном состоянии и не запускается до вызова функции ResumeThread .
CREATE_UNICODE_ENVIRONMENT
0x00000400
Если этот флаг установлен, блок среды, на который указывает lpEnvironment , использует символы Юникода. В противном случае блок среды использует символы 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. Так как ntvdm.exe сохраняется после запуска первого 16-разрядного приложения, при запуске другого 16-разрядного приложения новые флаги создания не применяются, за исключением CREATE_NEW_CONSOLE и CREATE_SEPARATE_WOW_VDM, которые создают новую ntvdm.exe.

Требования

Требование Значение
Минимальная версия клиента
Windows XP [только классические приложения]
Минимальная версия сервера
Windows Server 2003 [только классические приложения]
Заголовок
WinBase.h (включая Windows.h)