プロセス作成フラグ

CreateProcess、CreateProcessAsUserCreateProcessWithLogonW、および 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

GitHub の Windows クラシック サンプルの例

Flags

定数/値 説明
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
プロセスは、保護されたプロセスとして実行されます。 システムは、保護されたプロセスと保護されたプロセスのスレッドへのアクセスを制限します。 プロセスが保護されたプロセスと対話する方法の詳細については、「 プロセスのセキュリティとアクセス権」を参照してください。
保護されたプロセスをアクティブ化するには、バイナリに特別な署名が必要です。 この署名は Microsoft によって提供されますが、現在、Microsoft 以外のバイナリでは使用できません。 現在、メディア基盤、オーディオ エンジン、Windows エラー報告、システムの 4 つの保護されたプロセスがあります。 これらのバイナリに読み込むコンポーネントも署名する必要があります。 マルチメディア企業は、最初の 2 つの保護されたプロセスを活用できます。 詳細については、「 保護されたメディア パスの概要」を参照してください。
Windows Server 2003 および Windows XP: この値はサポートされていません。
CREATE_PRESERVE_CODE_AUTHZ_LEVEL
0x02000000
呼び出し元が、通常はプロセスに自動的に適用されるプロセス制限をバイパスする子プロセスを実行できるようにします。
CREATE_SECURE_PROCESS
0x00400000
このフラグを使用すると、Virtualization-Based セキュリティ環境で実行されるセキュリティで保護されたプロセスを起動できます。
CREATE_SEPARATE_WOW_VDM
0x00000800
このフラグは、16 ビット Windows ベースのアプリケーションを起動する場合にのみ有効です。 設定されている場合、新しいプロセスはプライベート Virtual DOS マシン (VDM) で実行されます。 既定では、すべての 16 ビット Windows ベースのアプリケーションは、単一の共有 VDM でスレッドとして実行されます。 個別に実行する利点は、クラッシュによって単一の VDM のみが終了することです。個別の VDM で実行されている他のプログラムは、引き続き正常に機能します。 また、個別の VDM で実行される 16 ビットの Windows ベースのアプリケーションには、個別の入力キューがあります。 つまり、あるアプリケーションが一時的に応答を停止した場合、個別の VDM 内のアプリケーションは入力を受け取り続けます。 個別に実行する場合の欠点は、実行するメモリが大幅に多くなる点です。 このフラグは、ユーザーが 16 ビット アプリケーションを独自の VDM で実行するよう要求した場合にのみ使用する必要があります。
CREATE_SHARED_WOW_VDM
0x00001000
フラグは、16 ビット Windows ベースのアプリケーションを起動する場合にのみ有効です。 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に適用されます。 ntvdm.exeは最初の 16 ビット アプリケーションを実行した後も保持されるため、別の 16 ビット アプリケーションを起動すると、新しい作成フラグは適用されません。ただし、新しいntvdm.exeを作成する CREATE_NEW_CONSOLECREATE_SEPARATE_WOW_VDMを除きます。

要件

要件
サポートされている最小のクライアント
Windows XP [デスクトップ アプリのみ]
サポートされている最小のサーバー
Windows Server 2003 [デスクトップ アプリのみ]
ヘッダー
WinBase.h (Windows.h を含む)