Compartilhar via


Função PsCreateSystemThread (wdm.h)

A rotina PsCreateSystemThread cria um thread do sistema que é executado no modo kernel e retorna um identificador para o thread.

Sintaxe

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

Aponta para uma variável que receberá o identificador. O driver deve fechar o identificador com ZwClose depois que o identificador não estiver mais em uso. Esse identificador é um identificador de kernel para Windows Vista e versões posteriores do Windows. Em versões anteriores do Windows, o identificador pode não ser um identificador de kernel.

[in] DesiredAccess

Especifica o valor ACCESS_MASK que representa os tipos de acesso solicitados ao thread criado.

[in, optional] ObjectAttributes

Aponta para uma estrutura que especifica os atributos do objeto. OBJ_PERMANENT, OBJ_EXCLUSIVE e OBJ_OPENIF não são atributos válidos para um objeto thread. No Windows XP e versões posteriores do Windows, se o chamador não estiver em execução no contexto do processo do sistema, ele deverá definir o atributo OBJ_KERNEL_HANDLE para ObjectAttributes. Os drivers para Microsoft Windows 2000 e Windows 98/Me só devem chamar PsCreateSystemThread no contexto do processo do sistema. Para o Windows Vista e versões posteriores do Windows, o identificador será um identificador de kernel.

[in, optional] ProcessHandle

Especifica um identificador aberto para o processo em cujo espaço de endereço o thread deve ser executado. O thread do chamador deve ter PROCESS_CREATE_THREAD acesso a esse processo. Se esse parâmetro não for fornecido, o thread será criado no processo inicial do sistema. Esse valor deve ser NULL para um thread criado pelo driver. Use a macro NtCurrentProcess , definida em Ntddk.h, para especificar o processo atual.

[out, optional] ClientId

Aponta para uma estrutura que recebe o identificador de cliente do novo thread. Esse valor deve ser NULL para um thread criado pelo driver.

[in] StartRoutine

O ponto de entrada para o thread do sistema recém-criado. Esse parâmetro é um ponteiro de função para uma rotina ThreadStart que recebe um único argumento, que é o valor do parâmetro StartContext fornecido pelo chamador.

[in, optional] StartContext

Fornece um único argumento que é passado para o thread quando ele inicia a execução.

Retornar valor

PsCreateSystemThread retornará STATUS_SUCCESS se o thread tiver sido criado.

Comentários

Os drivers que criam threads dedicados ao dispositivo chamam essa rotina, seja quando inicializam ou quando as solicitações de E/S começam a entrar nas rotinas de Expedição desse driver. Por exemplo, um driver pode criar esse thread quando recebe uma solicitação de controle de dispositivo assíncrona.

PsCreateSystemThread cria um thread no modo kernel que inicia um thread separado de execução dentro do sistema. Esse thread do sistema não tem nenhum contexto de modo de usuário ou TEB e é executado somente no modo kernel.

Se o ProcessHandle de entrada for NULL, o thread criado será associado ao processo do sistema. Esse thread continua em execução até que o sistema seja desligado ou o thread termine sozinho chamando PsTerminateSystemThread.

As rotinas de driver executadas em um contexto de processo diferente do processo do sistema devem definir o atributo OBJ_KERNEL_HANDLE para o parâmetro ObjectAttributes de PsCreateSystemThread. Isso restringe o uso do identificador retornado por PsCreateSystemThread a processos em execução no modo kernel. Caso contrário, o identificador de thread pode ser acessado pelo processo em cujo contexto o driver está em execução. Os drivers podem definir o atributo OBJ_KERNEL_HANDLE da seguinte maneira.

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

Para obter mais informações sobre o parâmetro StartContext , consulte ThreadStart.

O thread do sistema recém-criado é executado em PASSIVE_LEVEL dentro de uma região crítica com APCs de kernel normais desabilitadas.

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Regras de conformidade da DDI HwStorPortProhibitedDDIs(storport), IrqlPsPassive(wdm)

Confira também

InitializeObjectAttributes

KeSetBasePriorityThread

KeSetPriorityThread

PsTerminateSystemThread

Threadstart

ZwSetInformationThread