Partager via


KeRevertToUserGroupAffinityThread, fonction (wdm.h)

La routine KeRevertToUserGroupAffinityThread restaure l’affinité de groupe du thread appelant à sa valeur d’origine au moment de la création du thread.

Syntaxe

void KeRevertToUserGroupAffinityThread(
  [in] PGROUP_AFFINITY PreviousAffinity
);

Paramètres

[in] PreviousAffinity

Pointeur vers l’affinité de groupe à restaurer. Ce paramètre pointe vers une structure GROUP_AFFINITY qui contient un numéro de groupe et un masque d’affinité. Le masque d’affinité spécifie l’ensemble des processeurs logiques sur lequel le thread utilisateur peut s’exécuter.

Valeur de retour

None

Remarques

Cette routine modifie le numéro de groupe et le masque d’affinité relative au groupe du thread appelant. Le numéro de groupe et le masque d’affinité identifient un ensemble de processeurs sur lesquels le thread peut s’exécuter. En cas de réussite, la routine planifie l’exécution du thread sur un processeur de cet ensemble.

Le paramètre PreviousAffinity pointe vers une structure de GROUP_AFFINITY qui spécifie le nouveau numéro de groupe (membre du groupe ) et le masque d’affinité (membre Mask ) pour le thread. Si PreviousAffinity-Mask> est différent de zéro, KeRevertToUserGroupAffinityThread définit le numéro de groupe et le masque d’affinité du thread appelant sur les valeurs de la structure. Si PreviousAffinity-Mask> est égal à zéro, la routine restaure le numéro de groupe et le masque d’affinité à leurs valeurs d’origine au moment de l’initialisation du thread.

Un processus peut avoir une affinité pour plusieurs groupes à la fois. Toutefois, un thread ne peut être affecté qu’à un seul groupe à tout moment, et ce groupe est toujours dans l’affinité du processus du thread.

Un thread peut modifier le groupe auquel il est affecté en appelant la routine KeSetSystemGroupAffinityThread . Après un ou plusieurs appels à KeSetSystemGroupAffinityThread, le thread peut restaurer l’affinité de groupe d’origine qu’il avait lors de la création du thread en appelant KeRevertToUserGroupAffinityThread.

Une fois le thread créé, un appel à KeRevertToUserGroupAffinityThread n’a aucun effet (autrement dit, le numéro de groupe et le masque d’affinité du thread restent inchangés), sauf si le thread appelle d’abord KeSetSystemGroupAffinityThread. Après un appel à KeRevertToUserGroupAffinityThread, un deuxième appel à KeRevertToUserGroupAffinityThread n’a aucun effet, sauf si le thread appelle d’abord KeSetSystemGroupAffinityThread.

La routine modifie le numéro de groupe et le masque d’affinité en valeurs spécifiées dans *PreviousAffinity uniquement si les éléments suivants sont vrais :

  • Le numéro de groupe est valide.
  • Le masque d’affinité est valide (autrement dit, seuls les bits de masque qui correspondent aux processeurs logiques du groupe sont définis).
  • Au moins un des processeurs spécifiés dans le masque d’affinité est actif.
Si l’une de ces conditions n’est pas remplie, l’appel à KeRevertToUserGroupAffinityThread n’a aucun effet.

Une routine associée, KeRevertToUserAffinityThreadEx, modifie le masque d’affinité du thread appelant, mais cette routine, contrairement à KeRevertToUserGroupAffinityThread, n’accepte pas de numéro de groupe comme paramètre d’entrée. Dans Windows 7 et versions ultérieures du système d’exploitation Windows, KeRevertToUserAffinityThreadEx suppose que le masque d’affinité fait référence aux processeurs du groupe 0, ce qui est compatible avec le comportement de cette routine dans les versions antérieures de Windows qui ne prennent pas en charge les groupes. Ce comportement garantit que les pilotes existants qui appellent KeRevertToUserAffinityThreadEx et qui n’utilisent aucune fonctionnalité orientée groupe s’exécutent correctement dans les systèmes multiprocesseurs qui ont deux groupes ou plus. Toutefois, les pilotes qui utilisent des fonctionnalités orientées groupe dans Windows 7 et versions ultérieures du système d’exploitation Windows doivent appeler KeRevertToUserGroupAffinityThread au lieu de KeRevertToUserAffinityThreadEx.

Si KeRevertToUserGroupAffinityThread est appelé dans IRQL <= APC_LEVEL et que l’appel réussit, la nouvelle affinité de groupe (rétablie) prend effet immédiatement. Lorsque l’appel est retourné, le thread appelant est déjà en cours d’exécution sur un processeur spécifié dans la nouvelle affinité de groupe. Si KeRevertToUserGroupAffinityThread est appelé à IRQL = DISPATCH_LEVEL et que l’appel réussit, la modification du processeur en attente est différée jusqu’à ce que l’appelant abaisse l’IRQL sous DISPATCH_LEVEL.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible dans Windows 7 et versions ultérieures de Windows.
Plateforme cible Universal
En-tête wdm.h (inclure Ntddk.h, Wdm.h, Ntddk.h)
Bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (voir la section Notes).

Voir aussi

GROUP_AFFINITY

KeRevertToUserAffinityThreadEx

KeSetSystemGroupAffinityThread