Función CreateRemoteThread (processthreadsapi.h)
Crea un subproceso que se ejecuta en el espacio de direcciones virtuales de otro proceso.
Use la función createRemoteThreadEx
Sintaxis
HANDLE CreateRemoteThread(
[in] HANDLE hProcess,
[in] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in] LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[out] LPDWORD lpThreadId
);
Parámetros
[in] hProcess
Identificador del proceso en el que se va a crear el subproceso. El identificador debe tener los derechos de acceso PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITEy PROCESS_VM_READ y puede producir un error sin estos derechos en determinadas plataformas. Para obtener más información, consulte Derechos de acceso y seguridad de procesos.
[in] lpThreadAttributes
Puntero a una estructura de SECURITY_ATTRIBUTES que especifica un descriptor de seguridad para el nuevo subproceso y determina si los procesos secundarios pueden heredar el identificador devuelto. Si lpThreadAttributes es NULL, el subproceso obtiene un descriptor de seguridad predeterminado y el identificador no se puede heredar. Las listas de control de acceso (ACL) del descriptor de seguridad predeterminado para un subproceso proceden del token principal del creador.
Windows XP: las ACL del descriptor de seguridad predeterminado para un subproceso proceden del token principal o de suplantación del creador. Este comportamiento cambió con Windows XP con SP2 y Windows Server 2003.
[in] dwStackSize
Tamaño inicial de la pila, en bytes. El sistema redondea este valor a la página más cercana. Si este parámetro es 0 (cero), el nuevo subproceso usa el tamaño predeterminado para el archivo ejecutable. Para obtener más información, vea tamaño de pila de subprocesos.
[in] lpStartAddress
Puntero a la función definida por la aplicación de tipo LPTHREAD_START_ROUTINE que ejecutará el subproceso y representa la dirección inicial del subproceso en el proceso remoto. La función debe existir en el proceso remoto. Para obtener más información, vea ThreadProc.
[in] lpParameter
Puntero a una variable que se va a pasar a la función de subproceso.
[in] dwCreationFlags
Marcas que controlan la creación del subproceso.
[out] lpThreadId
Puntero a una variable que recibe el identificador del subproceso.
Si este parámetro es null, no se devuelve el identificador del subproceso.
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es un identificador para el nuevo subproceso.
Si se produce un error en la función, el valor devuelto es NULL. Para obtener información de error extendida, llame a GetLastError.
Tenga en cuenta que createRemoteThread puede realizarse correctamente incluso si lpStartAddress apunta a datos, código o no es accesible. Si la dirección de inicio no es válida cuando se ejecuta el subproceso, se produce una excepción y finaliza el subproceso. La terminación del subproceso debido a una dirección de inicio no válida se controla como una salida de error para el proceso del subproceso. Este comportamiento es similar a la naturaleza asincrónica de CreateProcess, donde se crea el proceso incluso si hace referencia a bibliotecas de vínculos dinámicos (DLL) no válidas o que faltan.
Observaciones
La función CreateRemoteThread hace que un nuevo subproceso de ejecución comience en el espacio de direcciones del proceso especificado. El subproceso tiene acceso a todos los objetos que se abre el proceso.
Antes de Windows 8, Terminal Services aísla cada sesión de terminal por diseño. Por lo tanto, createRemoteThread produce un error si el proceso de destino está en una sesión diferente del proceso de llamada.
El nuevo identificador de subproceso se crea con acceso completo al nuevo subproceso. Si no se proporciona un descriptor de seguridad, el identificador se puede usar en cualquier función que requiera un identificador de objeto de subproceso. Cuando se proporciona un descriptor de seguridad, se realiza una comprobación de acceso en todos los usos posteriores del identificador antes de conceder acceso. Si la comprobación de acceso deniega el acceso, el proceso de solicitud no puede usar el identificador para obtener acceso al subproceso.
Si el subproceso se crea en un estado ejecutable (es decir, si no se usa la marca CREATE_SUSPENDED), el subproceso puede empezar a ejecutarse antes de que se devuelva CreateThread y, en particular, antes de que el autor de la llamada reciba el identificador y el identificador del subproceso creado.
El subproceso se crea con una prioridad de subproceso de THREAD_PRIORITY_NORMAL. Use las funciones
Cuando finaliza un subproceso, el objeto de subproceso alcanza un estado señalado, que satisface los subprocesos que están esperando el objeto.
El objeto de subproceso permanece en el sistema hasta que el subproceso ha finalizado y se cierran todos los identificadores a través de una llamada a CloseHandle.
El ExitProcess, ExitThread, CreateThread, funciones createRemoteThread y un proceso que se inicia (como resultado de una llamada CreateProcess) se serializa entre sí dentro de un proceso. Solo se produce uno de estos eventos en un espacio de direcciones a la vez. Esto significa que las restricciones siguientes contienen:
- Durante las rutinas de inicio del proceso y de inicialización de DLL, se pueden crear nuevos subprocesos, pero no comienzan la ejecución hasta que se realiza la inicialización de DLL para el proceso.
- Solo un subproceso de un proceso puede estar en una rutina de inicialización de DLL o desasociar a la vez.
- ExitProcess devuelve después de que todos los subprocesos hayan completado su inicialización de DLL o desasocien rutinas.
- Convierte aplicaciones de un solo subproceso en aplicaciones multiproceso.
- Cambia el diseño de tiempo y memoria del proceso.
- Da como resultado una llamada al punto de entrada de cada DLL en el proceso.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows XP [solo aplicaciones de escritorio] |
servidor mínimo admitido | Windows Server 2003 [solo aplicaciones de escritorio] |
de la plataforma de destino de |
Windows |
encabezado de |
processthreadsapi.h (incluya Windows.h en Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
biblioteca de |
Kernel32.lib |
DLL de |
Kernel32.dll |
Consulte también
funciones de proceso y subproceso de
subprocesos de