Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
La fonction CreateProcess crée un processus qui s’exécute indépendamment du processus de création. Par souci de simplicité, cette relation est appelée relation parent-enfant.
Important
Sécurité : gérez l’héritage : définissez bInheritHandles sur FALSE , sauf si le processus enfant a spécifiquement besoin d’accéder aux handles hérités. Les handles hérités (handles de fichiers, sockets, jetons) peuvent fuiter des ressources sensibles vers des processus enfants. Lorsque l’héritage est requis, utilisez-le STARTUPINFOEXUpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_HANDLE_LIST, ...) pour répertorier explicitement uniquement les handles dont l’enfant a besoin.
Important
lpCommandLine doit être accessible en écriture : lors du passage d’une ligne de commande en tant que paramètre lpCommandLine (deuxième paramètre), la mémoire tampon doit être un tableau de caractères accessible en écriture, et non un littéral de chaîne ou const un pointeur. La version Unicode (CreateProcessW) peut modifier cette mémoire tampon en place. La transmission d’une chaîne en lecture seule provoque une violation d’accès.
Note
Alternatives modernes : pour des scénarios de création de processus plus simples, envisagez System.Diagnostics.Process (.NET), (CRT) _wspawnl/_wsystem ou ShellExecuteEx (pour lancer des documents/URL avec la gestion des verbes). Utilisez cette option CreateProcess lorsque vous avez besoin d’un contrôle total sur l’héritage, les attributs de processus, les descripteurs de sécurité ou les indicateurs de création.
Le code suivant montre comment créer un processus.
#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 );
}
Si CreateProcess réussit, elle retourne une structure PROCESS_INFORMATION qui contient des handles et des identificateurs pour le nouveau processus et son thread principal. Les handles de thread et de processus sont créés avec des droits d’accès complets, bien que vous puissiez restreindre l’accès si vous spécifiez des descripteurs de sécurité. Lorsque vous n’avez plus besoin de ces handles, fermez-les à l’aide de la fonction CloseHandle.
Vous pouvez également créer un processus à l’aide des fonctions CreateProcessAsUser ou CreateProcessWithLogonW. Ces fonctions vous permettent de spécifier le contexte de sécurité du compte d’utilisateur dans lequel le processus s’exécute.