Compartilhar via


Função IoCreateSystemThread (wdm.h)

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

Sintaxe

NTSTATUS IoCreateSystemThread(
  [in, out]       PVOID              IoObject,
  [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

[in, out] IoObject

Um ponteiro para o DEVICE_OBJECT ou DRIVER_OBJECT para associar ao thread criado. IoCreateSystemThread faz uma referência contada a esse objeto. O gerenciador de E/S posteriormente libera essa referência quando o thread é encerrado. Para obter mais informações, consulte Comentários.

[out] ThreadHandle

Um ponteiro para uma variável na qual a rotina grava o identificador de kernel para o thread criado. Quando o identificador não for mais necessário, o driver deverá fechar o identificador chamando a rotina ZwClose .

[in] DesiredAccess

O valor ACCESS_MASK que representa os tipos de acesso às solicitações de chamador para o thread criado.

[in, optional] ObjectAttributes

Um ponteiro para uma estrutura OBJECT_ATTRIBUTES que especifica os atributos do objeto thread. Os atributos OBJ_PERMANENT, OBJ_EXCLUSIVE e OBJ_OPENIF não são atributos válidos para um objeto thread. Se o chamador não estiver em execução no contexto do processo do sistema, ele deverá definir o atributo OBJ_KERNEL_HANDLE na estrutura OBJECT_ATTRIBUTES .

[in, optional] ProcessHandle

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

[out, optional] ClientId

Um ponteiro para uma estrutura na qual a rotina grava o identificador do cliente para o thread criado. Esse parâmetro deve ser NULL para um thread criado pelo driver.

[in] StartRoutine

Um ponteiro para uma rotina ThreadStart que é o ponto de entrada para o thread criado.

[in, optional] StartContext

Um ponteiro de contexto que é passado como o parâmetro StartContext para a rotina ThreadStart quando o thread criado começa a ser executado.

Retornar valor

IoCreateSystemThread retornará STATUS_SUCCESS se o novo thread tiver sido criado com êxito. Os possíveis valores retornados incluem o seguinte erro status códigos.

Código de retorno Descrição
STATUS_INVALID_HANDLE ProcessHandle não é um identificador de processo válido.
STATUS_PROCESS_IS_TERMINATING O processo especificado pelo ProcessHandle está sendo encerrado.
STATUS_INSUFFICIENT_RESOURCES Recursos insuficientes do sistema estão disponíveis para executar a operação solicitada.

Comentários

Começando com Windows 8, um driver pode chamar IoCreateSystemThread para criar um thread dedicado ao dispositivo. Essa rotina cria um novo thread do sistema que não tem nenhum bloco de ambiente de thread (TEB) ou contexto de modo de usuário e é executado somente no modo kernel.

Normalmente, o driver chama IoCreateSystemThread quando inicia o dispositivo ou quando as rotinas de Expediçãoxxx do driver começam a receber solicitações de E/S. Por exemplo, um driver pode chamar essa rotina para criar um thread quando uma rotina DispatchXxx recebe uma solicitação de controle de dispositivo assíncrona.

Se o parâmetro ProcessHandle 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 seja encerrado.

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 IoCreateSystemThread. Esse atributo restringe o uso do identificador retornado por IoCreateSystemThread 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 chamar a macro InitializeObjectAttributes para definir o atributo OBJ_KERNEL_HANDLE nos atributos de objeto, conforme mostrado no exemplo de código a seguir.

OBJECT_ATTRIBUTES ObjectAttributes;

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

IoCreateSystemThread é semelhante à rotina PsCreateSystemThread , mas tem um parâmetro adicional, IoObject, que é um ponteiro para o objeto de driver ou objeto do dispositivo do chamador. IoCreateSystemThread usa esse parâmetro para garantir que o driver não possa descarregar enquanto o thread criado existir. Antes de agendar StartRoutine para execução neste thread, IoCreateSystemThread usa uma referência contada ao objeto IoObject . O gerenciador de E/S libera essa referência após a saída do thread criado. Portanto, esse objeto persiste durante o tempo de vida do thread criado.

Em contraste com um thread do sistema criado pela rotina PsCreateSystemThread , um thread criado por IoCreateSystemThread não chama a rotina PsTerminateSystemThread para terminar sozinho. Em vez disso, o gerente de E/S chama PsTerminateSystemThread em nome do thread criado quando o thread é encerrado.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows 8.
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

Confira também

ACCESS_MASK

DEVICE_OBJECT

DRIVER_OBJECT

InitializeObjectAttributes

OBJECT_ATTRIBUTES

PsCreateSystemThread

PsTerminateSystemThread

Threadstart

ZwClose