Vytváření procesů

Funkce CreateProcess vytvoří nový proces, který běží nezávisle na procesu vytváření. Pro zjednodušení se tato relace nazývá vztah nadřazený-podřízený.

Important

Zabezpečení – dědičnost popisovačů: Nastavte bInheritHandles na FALSE, pokud podřízený proces výslovně nepotřebuje přístup ke zděděným popisovačům. Zděděné popisovače (popisovače souborů, sokety, tokeny) mohou zpřístupnit citlivé prostředky podřízeným procesům. Pokud je vyžadována dědičnost, použijte STARTUPINFOEXUpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_HANDLE_LIST, ...) ji k explicitnímu výpisu pouze popisovačů, které dítě potřebuje.

Important

lpCommandLine musí být zapisovatelný: Při předávání příkazového řádku jako parametru lpCommandLine (druhého parametru) musí jít o zapisovatelné pole znaků — nikoli o řetězcový literál nebo const ukazatel. Verze Unicode (CreateProcessW) může tuto vyrovnávací paměť upravit přímo na místě. Předání řetězce určeného pouze pro čtení způsobí porušení přístupu.

Note

Moderní alternativy: Pro jednodušší scénáře vytváření procesů zvažte System.Diagnostics.Process (.NET), _wspawnl/_wsystem (CRT) nebo ShellExecuteEx (pro spouštění dokumentů a adres URL pomocí zpracování sloves). Použijte CreateProcess , když potřebujete úplnou kontrolu nad dědičností, atributy procesu, popisovači zabezpečení nebo příznaky vytváření.

Následující kód ukazuje, jak vytvořit proces.

#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 );
}

Pokud je volání CreateProcess úspěšné, vrátí strukturu PROCESS_INFORMATION, která obsahuje popisovače a identifikátory nového procesu a jeho primárního vlákna. Popisovače vláken a procesů se vytvářejí s plnými přístupovými právy, ačkoli přístup můžete omezit, pokud určíte deskriptory zabezpečení. Pokud už tyto popisovače nepotřebujete, zavřete je pomocí funkce CloseHandle.

Proces můžete také vytvořit pomocí CreateProcessAsUser nebo CreateProcessWithLogonW funkcí. Tyto funkce umožňují určit kontext zabezpečení uživatelského účtu, ve kterém se proces spouští.