Folyamatok létrehozása

A CreateProcess függvény létrehoz egy új folyamatot, amely a létrehozási folyamattól függetlenül fut. Az egyszerűség kedvéért ezt a kapcsolatot szülő-gyermek kapcsolatnak nevezzük.

Important

Biztonság – leíróöröklés: Állítsa a bInheritHandles értékét FALSE értékre, kivéve, ha az utódfolyamatnak kifejezetten hozzá kell férnie az örökölt leírókhoz. Az örökölt fogantyúk (fájlfogantyúk, foglalatok, tokenek) érzékeny erőforrásokat szivárogtathatnak az alfolyamatokhoz. Ha öröklésre van szükség, használja a(z) STARTUPINFOEX elemet a(z) UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_HANDLE_LIST, ...) elemmel együtt, hogy kifejezetten csak a gyermekfolyamat számára szükséges kezelőket sorolja fel.

Important

Az lpCommandLine paraméternek írhatónak kell lennie: Ha parancssort ad át lpCommandLine paraméterként (második paraméter), a puffernek írható karaktertömbnek kell lennie – nem sztringkonstansnak vagy const mutatónak. A Unicode-verzió (CreateProcessW) módosíthatja ezt a puffert. Egy írásvédett karakterlánc átadása hozzáférési hibát okoz.

Note

Modern alternatívák: Egyszerűbb folyamatlétrehozási forgatókönyvek esetén fontolja meg a System.Diagnostics.Process (.NET), (CRT) _wspawnl/_wsystem vagy a ShellExecuteEx (dokumentumok/URL-címek igekezeléssel történő elindítását). Akkor használható CreateProcess , ha teljes körű vezérlésre van szüksége az öröklés, a folyamatattribútumok, a biztonsági leírók vagy a létrehozási jelzők felett.

Az alábbi kód bemutatja, hogyan hozhat létre folyamatot.

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

Ha CreateProcess sikeres, egy PROCESS_INFORMATION struktúrát ad vissza, amely az új folyamat és elsődleges szál leíróit és azonosítóit tartalmazza. A szál- és folyamatleírók teljes hozzáférési jogosultságokkal jönnek létre, de biztonsági leírók megadása esetén korlátozhatja a hozzáférést. Ha már nincs szüksége ezekre a fogópontokra, zárja be őket a CloseHandle függvénnyel.

A folyamatot a CreateProcessAsUser vagy a CreateProcessWithLogonW függvények is létrehozhatja. Ezek a függvények lehetővé teszik annak a felhasználói fióknak a biztonsági környezetének megadását, amelyben a folyamat fut.