Membuat proses

Fungsi CreateProcess membuat proses baru yang berjalan secara independen dari proses pembuatan. Untuk kesederhanaan, hubungan ini disebut hubungan induk-anak.

Important

Keamanan — pewarisan handle: Atur bInheritHandles ke FALSE kecuali proses turunan secara khusus memerlukan akses ke handle yang diwariskan. Handle yang diwariskan (handle file, soket, token) dapat membocorkan sumber daya sensitif ke proses anak. Ketika pewarisan diperlukan, gunakan STARTUPINFOEX dengan UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_HANDLE_LIST, ...) untuk secara eksplisit hanya mencantumkan handel yang dibutuhkan anak.

Important

lpCommandLine harus dapat ditulis: Saat melewati baris perintah sebagai parameter lpCommandLine (parameter kedua), buffer harus berupa array karakter yang dapat ditulis — bukan string literal atau const pointer. Versi Unicode (CreateProcessW) dapat memodifikasi buffer ini di tempat. Memberikan string hanya-baca menyebabkan pelanggaran akses.

Note

Alternatif modern: Untuk skenario pembuatan proses yang lebih sederhana, pertimbangkan System.Diagnostics.Process (.NET), _wspawnl/_wsystem (CRT), atau ShellExecuteEx (untuk meluncurkan dokumen/URL dengan penanganan kata kerja). Gunakan CreateProcess saat Anda memerlukan kontrol penuh atas pewarisan penanganan, atribut proses, deskriptor keamanan, atau bendera pembuatan.

Kode berikut menunjukkan cara membuat proses.

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( argc != 2 )
    {
        printf("Usage: %s [cmdline]\n", argv[0]);
        return;
    }

    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

Jika CreateProcess berhasil, fungsi ini mengembalikan struktur PROCESS_INFORMATION yang berisi handle dan pengidentifikasi untuk proses baru serta utas primer-nya. Utas dan handel proses dibuat dengan hak akses penuh, meskipun Anda dapat membatasi akses jika Anda menentukan deskriptor keamanan. Ketika Anda tidak lagi memerlukan handel ini, tutup dengan menggunakan fungsi closeHandle.

Anda juga dapat membuat proses dengan menggunakan fungsi CreateProcessAsUser atau CreateProcessWithLogonW. Fungsi-fungsi ini memungkinkan Anda menentukan konteks keamanan akun pengguna tempat proses berjalan.