Partager via


IoCreateSystemThread, fonction (wdm.h)

La routine IoCreateSystemThread crée un thread système qui s’exécute en mode noyau et fournit un handle pour le thread.

Syntaxe

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
);

Paramètres

[in, out] IoObject

Pointeur vers le DEVICE_OBJECT ou DRIVER_OBJECT à associer au thread créé. IoCreateSystemThread prend une référence comptée à cet objet. Le gestionnaire d’E/S publie ultérieurement cette référence lors de la sortie du thread. Pour plus d’informations, consultez Remarques.

[out] ThreadHandle

Pointeur vers une variable vers laquelle la routine écrit le handle du noyau pour le thread créé. Lorsque la poignée n’est plus nécessaire, le pilote doit fermer la poignée en appelant la routine ZwClose.

[in] DesiredAccess

Valeur ACCESS_MASK qui représente les types d’accès aux demandes de l’appelant au thread créé.

[in, optional] ObjectAttributes

Pointeur vers une structure OBJECT_ATTRIBUTES qui spécifie les attributs de l’objet thread. Les attributs OBJ_PERMANENT, OBJ_EXCLUSIVE et OBJ_OPENIF ne sont pas des attributs valides pour un objet thread. Si l’appelant n’est pas en cours d’exécution dans le contexte du processus système, il doit définir l’attribut OBJ_KERNEL_HANDLE dans la structure OBJECT_ATTRIBUTES.

[in, optional] ProcessHandle

Handle ouvert pour le processus dans lequel l’espace d’adressage du thread créé doit s’exécuter. Le thread de l’appelant doit avoir PROCESS_CREATE_THREAD accès à ce processus. Si ce paramètre est NULL, le thread est créé dans le processus système initial. Ce paramètre doit être NULL pour un thread créé par un pilote. Utilisez la macro NtCurrentProcess, définie dans le fichier d’en-tête Wdm.h, pour spécifier le processus actuel.

[out, optional] ClientId

Pointeur vers une structure dans laquelle la routine écrit l’identificateur client pour le thread créé. Ce paramètre doit être NULL pour un thread créé par un pilote.

[in] StartRoutine

Pointeur vers un ThreadStart routine qui est le point d’entrée du thread créé.

[in, optional] StartContext

Pointeur de contexte passé en tant que paramètre StartContext à la routine ThreadStart lors de l’exécution du thread créé.

Valeur de retour

IoCreateSystemThread retourne STATUS_SUCCESS si le nouveau thread a été créé avec succès. Les valeurs de retour possibles incluent les codes d’état d’erreur suivants.

Retourner le code Description
STATUS_INVALID_HANDLE processHandle n’est pas un handle de processus valide.
STATUS_PROCESS_IS_TERMINATING Le processus spécifié par ProcessHandle se termine.
STATUS_INSUFFICIENT_RESOURCES Les ressources système insuffisantes sont disponibles pour effectuer l’opération demandée.

Remarques

À compter de Windows 8, un pilote peut appeler IoCreateSystemThread pour créer un thread dédié à l’appareil. Cette routine crée un thread système qui n’a pas de bloc d’environnement de thread (TEB) ou de contexte en mode utilisateur, et s’exécute uniquement en mode noyau.

En règle générale, le pilote appelle IoCreateSystemThread lorsqu’il démarre l’appareil, ou lorsque les routines dispatch DispatchXxx commencent à recevoir des demandes d’E/S. Par exemple, un pilote peut appeler cette routine pour créer un thread lorsqu’une routine dispatch DispatchXxx reçoit une demande de contrôle d’appareil asynchrone.

Si le paramètre ProcessHandle est NULL, le thread créé est associé au processus système. Un tel thread continue de s’exécuter jusqu’à ce que le système soit arrêté ou que le thread se ferme.

Les routines de pilote qui s’exécutent dans un contexte de processus autre que celui du processus système doivent définir l’attribut OBJ_KERNEL_HANDLE pour le paramètre ObjectAttributes de IoCreateSystemThread. Cet attribut limite l’utilisation du handle retourné par IoCreateSystemThread aux processus s’exécutant en mode noyau. Sinon, le handle de thread est accessible par le processus dans lequel le pilote est en cours d’exécution. Les pilotes peuvent appeler la macro InitializeObjectAttributes pour définir l’attribut OBJ_KERNEL_HANDLE dans les attributs d’objet, comme illustré dans l’exemple de code suivant.

OBJECT_ATTRIBUTES ObjectAttributes;

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

IoCreateSystemThread est similaire à la routine PsCreateSystemThread, mais a un paramètre supplémentaire, IoObject, qui est un pointeur vers l’objet de pilote ou l’objet de périphérique de l’appelant. IoCreateSystemThread utilise ce paramètre pour s’assurer que le pilote ne peut pas décharger pendant que le thread créé existe. Avant de planifier StartRoutine à exécuter dans ce thread, IoCreateSystemThread prend une référence comptée à l’objet IoObject. Le gestionnaire d’E/S libère cette référence après la sortie du thread créé. Ainsi, cet objet persiste pendant la durée de vie du thread créé.

Contrairement à un thread système créé par la routine PsCreateSystemThread, un thread créé par IoCreateSystemThread n’appelle pas la routine PsTerminateSystemThread pour se terminer. Au lieu de cela, le gestionnaire d’E/S appelle PsTerminateSystemThread pour le compte du thread créé lors de la sortie du thread.

Exigences

Exigence Valeur
client minimum pris en charge Disponible à partir de Windows 8.
plateforme cible Universel
d’en-tête wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

Voir aussi

ACCESS_MASK

DEVICE_OBJECT

DRIVER_OBJECT

InitializeObjectAttributes

OBJECT_ATTRIBUTES

psCreateSystemThread

psTerminateSystemThread

ThreadStart

ZwClose