Share via


Función CreateRemoteThreadEx (processthreadsapi.h)

Crea un subproceso que se ejecuta en el espacio de direcciones virtuales de otro proceso y, opcionalmente, especifica atributos extendidos, como la afinidad de grupo de procesadores.

Sintaxis

HANDLE CreateRemoteThreadEx(
  [in]            HANDLE                       hProcess,
  [in, optional]  LPSECURITY_ATTRIBUTES        lpThreadAttributes,
  [in]            SIZE_T                       dwStackSize,
  [in]            LPTHREAD_START_ROUTINE       lpStartAddress,
  [in, optional]  LPVOID                       lpParameter,
  [in]            DWORD                        dwCreationFlags,
  [in, optional]  LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
  [out, optional] 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. En Windows 10, versión 1607, el código debe obtener estos derechos de acceso para el nuevo identificador. Sin embargo, a partir de Windows 10, versión 1703, si el nuevo identificador tiene derecho a estos derechos de acceso, el sistema los obtiene por usted. Para obtener más información, consulte Derechos de acceso y seguridad de procesos.

[in, optional] 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.

[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, consulte 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, optional] lpParameter

Puntero a una variable que se va a pasar a la función de subproceso a la que apunta lpStartAddress. Este parámetro puede ser NULL.

[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.

[in, optional] lpAttributeList

Lista de atributos que contiene parámetros adicionales para el nuevo subproceso. Esta lista se crea mediante la función InitializeProcThreadAttributeList .

[out, optional] 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.

Comentarios

La función CreateRemoteThreadEx 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. El parámetro lpAttribute se puede usar para especificar atributos extendidos, como la afinidad de grupo de procesadores para el nuevo subproceso. Si lpAttribute es NULL, el comportamiento de la función es el mismo que CreateRemoteThread.

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 que se conceda 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 de 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. Para obtener y establecer el valor de prioridad de un subproceso, use las funciones GetThreadPriority y SetThreadPriority .

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 serializan 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 desasocien 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 de 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 7 [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2008 R2 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado processthreadsapi.h (incluya Windows.h en Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

CreateRemoteThread