Share via


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 para crear un subproceso que se ejecute en el espacio de direcciones virtuales de otro proceso y, opcionalmente, especifique atributos extendidos.

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_WRITE y 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 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 de 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 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.

Valor Significado
0
El subproceso se ejecuta inmediatamente después de la creación.
CREATE_SUSPENDED
0x00000004
El subproceso se crea en un estado suspendido y no se ejecuta hasta que se llama a la función ResumeThread .
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
El parámetro dwStackSize especifica el tamaño de reserva inicial de la pila. Si no se especifica esta marca, dwStackSize especifica el tamaño de confirmación.

[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 la función no se realiza correctamente, 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 el subproceso finaliza. La finalizació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.

Comentarios

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 el proceso abre.

Antes de Windows 8, Terminal Services aísla cada sesión de terminal por diseño. Por lo tanto, Se produce un error en CreateRemoteThread 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 el acceso. Si la comprobación de acceso deniega el acceso, el proceso solicitante 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 CreateThread devuelva 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 GetThreadPriority y SetThreadPriority para obtener y establecer el valor de prioridad de un subproceso.

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 todos los identificadores se cierran a través de una llamada a CloseHandle.

Las funciones ExitProcess, ExitThread, CreateThread, CreateRemoteThread y un proceso que se inicia (como resultado de una llamada a 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 o desasociación de DLL a la vez.
  • ExitProcess devuelve después de que todos los subprocesos hayan completado su inicialización de DLL o se desasocie las rutinas.
Un uso común de esta función es insertar un subproceso en un proceso que se está depurando para emitir una interrupción. Sin embargo, no se recomienda este uso, ya que el subproceso adicional es confuso para la persona que depura la aplicación y hay varios efectos secundarios para usar esta técnica:
  • 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.
Otro uso común de esta función es insertar un subproceso en un proceso para consultar el montón u otra información del proceso. Esto puede causar los mismos efectos secundarios mencionados en el párrafo anterior. Además, la aplicación puede interbloquear si el subproceso intenta obtener la propiedad de los bloqueos que usa otro subproceso.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado processthreadsapi.h (incluye Windows.h en Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

CloseHandle

CreateProcess

CreateRemoteThreadEx

CreateThread

ExitProcess

ExitThread

GetThreadPriority

Funciones de proceso y subproceso

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

ThreadProc

Subprocesos