Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La función CreateProcess crea un nuevo proceso que se ejecuta independientemente del proceso de creación. Por simplicidad, esta relación se llama relación padre-hijo.
Importante
Seguridad — administración de la herencia: Establezca bInheritHandles en FALSE, a menos que el proceso hijo necesite específicamente acceso a los identificadores heredados. Los identificadores heredados (identificadores de archivo, sockets, tokens) pueden filtrar recursos confidenciales a los procesos hijos. Cuando sea necesaria la herencia, utilice STARTUPINFOEX con UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_HANDLE_LIST, ...) para enumerar explícitamente solo los manejadores que necesite el proceso hijo.
Importante
lpCommandLine debe ser grabable: al pasar una línea de comandos como parámetro lpCommandLine (segundo parámetro), el búfer debe ser una matriz de caracteres grabable , no un literal de cadena o const un puntero. La versión Unicode (CreateProcessW) puede modificar este búfer en su lugar. Pasar una cadena de solo lectura provoca una violación de acceso.
Note
Alternativas modernas: para escenarios de creación de procesos más sencillos, considere System.Diagnostics.Process (.NET), (CRT) _wspawnl/_wsystem o ShellExecuteEx (para iniciar documentos o direcciones URL con control de verbos). Utilice CreateProcess cuando necesite un control total sobre la herencia de identificadores, los atributos del proceso, los descriptores de seguridad o los indicadores de creación.
En el código siguiente se muestra cómo crear un proceso.
#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 se ejecuta correctamente, devuelve una estructura PROCESS_INFORMATION que contiene manijas e identificadores para el nuevo proceso y su hilo principal. Los manejadores de subprocesos y procesos se crean con derechos de acceso completos, aunque puede restringir el acceso si especifica descriptores de seguridad. Cuando ya no necesite estos manejadores, ciérrelos utilizando la función CloseHandle.
También puede crear un proceso mediante las funciones de CreateProcessAsUser o createProcessWithLogonW. Estas funciones permiten especificar el contexto de seguridad de la cuenta de usuario en la que se ejecuta el proceso.