Compartir a través de


Función PsCreateSystemThread (wdm.h)

La rutina PsCreateSystemThread crea un subproceso del sistema que se ejecuta en modo kernel y devuelve un identificador para el subproceso.

Sintaxis

NTSTATUS PsCreateSystemThread(
  [out]           PHANDLE            ThreadHandle,
  [in]            ULONG              DesiredAccess,
  [in, optional]  POBJECT_ATTRIBUTES ObjectAttributes,
  [in, optional]  HANDLE             ProcessHandle,
  [out, optional] PCLIENT_ID         ClientId,
  [in]            PKSTART_ROUTINE    StartRoutine,
  [in, optional]  PVOID              StartContext
);

Parámetros

[out] ThreadHandle

Apunta a una variable que recibirá el identificador. El controlador debe cerrar el controlador con ZwClose una vez que el controlador ya no esté en uso. Este identificador es un identificador de kernel para Windows Vista y versiones posteriores de Windows. En versiones anteriores de Windows, es posible que el identificador no sea un identificador de kernel.

[in] DesiredAccess

Especifica el valor de ACCESS_MASK que representa los tipos de acceso solicitados al subproceso creado.

[in, optional] ObjectAttributes

Apunta a una estructura que especifica los atributos del objeto. OBJ_PERMANENT, OBJ_EXCLUSIVE y OBJ_OPENIF no son atributos válidos para un objeto de subproceso. En Windows XP y versiones posteriores de Windows, si el autor de la llamada no se está ejecutando en el contexto del proceso del sistema, debe establecer el atributo OBJ_KERNEL_HANDLE para ObjectAttributes. Los controladores de Microsoft Windows 2000 y Windows 98/Me solo deben llamar a PsCreateSystemThread desde el contexto del proceso del sistema. Para Windows Vista y versiones posteriores de Windows, el identificador será un identificador de kernel.

[in, optional] ProcessHandle

Especifica un identificador abierto para el proceso en cuyo espacio de direcciones se va a ejecutar el subproceso. El subproceso del autor de la llamada debe tener PROCESS_CREATE_THREAD acceso a este proceso. Si no se proporciona este parámetro, el subproceso se creará en el proceso inicial del sistema. Este valor debe ser NULL para un subproceso creado por el controlador. Use la macro NtCurrentProcess , definida en Ntddk.h, para especificar el proceso actual.

[out, optional] ClientId

Apunta a una estructura que recibe el identificador de cliente del nuevo subproceso. Este valor debe ser NULL para un subproceso creado por el controlador.

[in] StartRoutine

Punto de entrada para el subproceso del sistema recién creado. Este parámetro es un puntero de función a una rutina ThreadStart que recibe un único argumento, que es el valor del parámetro StartContext proporcionado por el autor de la llamada.

[in, optional] StartContext

Proporciona un único argumento que se pasa al subproceso cuando comienza la ejecución.

Valor devuelto

PsCreateSystemThread devuelve STATUS_SUCCESS si se creó el subproceso.

Comentarios

Los controladores que crean subprocesos dedicados al dispositivo llaman a esta rutina, ya sea cuando se inicializan o cuando las solicitudes de E/S comienzan a entrar en rutinas de distribución de un controlador de este tipo. Por ejemplo, un controlador podría crear este subproceso cuando recibe una solicitud de control de dispositivo asincrónica.

PsCreateSystemThread crea un subproceso en modo kernel que comienza un subproceso independiente de ejecución dentro del sistema. Este subproceso del sistema no tiene ningún contexto TEB o modo de usuario y solo se ejecuta en modo kernel.

Si la entrada ProcessHandle es NULL, el subproceso creado se asocia al proceso del sistema. Este subproceso continúa ejecutándose hasta que el sistema se cierra o el subproceso finaliza a sí mismo llamando a PsTerminateSystemThread.

Las rutinas de controlador que se ejecutan en un contexto de proceso distinto del del proceso del sistema deben establecer el atributo OBJ_KERNEL_HANDLE para el parámetro ObjectAttributes de PsCreateSystemThread. Esto restringe el uso del identificador devuelto por PsCreateSystemThread a los procesos que se ejecutan en modo kernel. De lo contrario, el proceso puede acceder al identificador del subproceso en cuyo contexto se está ejecutando el controlador. Los controladores pueden establecer el atributo OBJ_KERNEL_HANDLE de la siguiente manera.

InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);

Para obtener más información sobre el parámetro StartContext , vea ThreadStart.

El subproceso del sistema recién creado se ejecuta en PASSIVE_LEVEL dentro de una región crítica con las API de kernel normales deshabilitadas.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), IrqlPsPassive(wdm)

Consulte también

InitializeObjectAttributes

KeSetBasePriorityThread

KeSetPriorityThread

PsTerminateSystemThread

ThreadStart

ZwSetInformationThread