Freigeben über


KeRevertToUserGroupAffinityThread-Funktion (wdm.h)

Die KeRevertToUserGroupAffinityThread-Routine stellt die Gruppenaffinität des aufrufenden Threads zum Zeitpunkt der Erstellung des Threads auf den ursprünglichen Wert wieder her.

Syntax

void KeRevertToUserGroupAffinityThread(
  [in] PGROUP_AFFINITY PreviousAffinity
);

Parameter

[in] PreviousAffinity

Ein Zeiger auf die wiederherzustellende Gruppenaffinität. Dieser Parameter verweist auf eine GROUP_AFFINITY Struktur, die eine Gruppennummer und eine Affinitätsmaske enthält. Die Affinitätsmaske gibt den Satz logischer Prozessoren an, auf denen der Benutzerthread ausgeführt werden kann.

Rückgabewert

Keine

Bemerkungen

Diese Routine ändert die Gruppennummer und die gruppenrelative Affinitätsmaske des aufrufenden Threads. Die Gruppennummer und die Affinitätsmaske identifizieren eine Gruppe von Prozessoren, auf denen der Thread ausgeführt werden kann. Bei erfolgreicher Ausführung plant die Routine die Ausführung des Threads auf einem Prozessor in diesem Satz.

Der PreviousAffinity-Parameter verweist auf eine GROUP_AFFINITY-Struktur , die die neue Gruppennummer (Gruppenmitglied ) und die Affinitätsmaske (Mask member ) für den Thread angibt. Wenn PreviousAffinity-Mask> nonzero ist, legt KeRevertToUserGroupAffinityThread die Gruppennummer und affinitätsmaske des aufrufenden Threads auf die Werte in der Struktur fest. Wenn PreviousAffinity-Mask> null ist, stellt die Routine die Gruppennummer und die Affinitätsmaske zum Zeitpunkt der Initialisierung des Threads wieder auf ihre ursprünglichen Werte zurück.

Ein Prozess kann eine Affinität für mehrere Gruppen gleichzeitig aufweisen. Ein Thread kann jedoch jederzeit nur einer Gruppe zugewiesen werden, und diese Gruppe befindet sich immer in der Affinität des Prozesses des Threads.

Ein Thread kann die Gruppe ändern, der er zugewiesen ist, indem die KeSetSystemGroupAffinityThread-Routine aufgerufen wird. Nach mindestens einem Aufruf von KeSetSystemGroupAffinityThread kann der Thread die ursprüngliche Gruppenaffinität wiederherstellen, die er beim Erstellen des Threads hatte, indem KeRevertToUserGroupAffinityThread aufgerufen wird.

Nachdem der Thread erstellt wurde, hat ein Aufruf von KeRevertToUserGroupAffinityThread keine Auswirkung (d. h. die Gruppennummer und die Affinitätsmaske des Threads bleiben unverändert), es sei denn, der Thread ruft zuerst KeSetSystemGroupAffinityThread auf. Nach einem Aufruf von KeRevertToUserGroupAffinityThread hat ein zweiter Aufruf von KeRevertToUserGroupAffinityThread keine Auswirkung, es sei denn, der Thread ruft zuerst KeSetSystemGroupAffinityThread auf.

Die Routine ändert die Gruppennummer und die Affinitätsmaske nur dann in die Werte, die in *PreviousAffinity angegeben sind, wenn Folgendes zutrifft:

  • Die Gruppennummer ist gültig.
  • Die Affinitätsmaske ist gültig (das heißt, es werden nur Maskenbits festgelegt, die logischen Prozessoren in der Gruppe entsprechen).
  • Mindestens einer der Prozessoren, der in der Affinitätsmaske angegeben ist, ist aktiv.
Wenn eine dieser Bedingungen nicht erfüllt ist, hat der Aufruf von KeRevertToUserGroupAffinityThread keine Auswirkung.

Eine verwandte Routine, KeRevertToUserAffinityThreadEx, ändert die Affinitätsmaske des aufrufenden Threads, aber diese Routine akzeptiert im Gegensatz zu KeRevertToUserGroupAffinityThread keine Gruppennummer als Eingabeparameter. In Windows 7 und höheren Versionen des Windows-Betriebssystems geht KeRevertToUserAffinityThreadEx davon aus, dass sich die Affinitätsmaske auf Prozessoren in Gruppe 0 bezieht, die mit dem Verhalten dieser Routine in früheren Versionen von Windows kompatibel ist, die keine Gruppen unterstützen. Dieses Verhalten stellt sicher, dass vorhandene Treiber, die KeRevertToUserAffinityThreadEx aufrufen und keine gruppenorientierten Features verwenden, in Multiprozessorsystemen mit zwei oder mehr Gruppen ordnungsgemäß ausgeführt werden. Treiber, die gruppenorientierte Features in Windows 7 und höheren Versionen des Windows-Betriebssystems verwenden, sollten jedoch KeRevertToUserGroupAffinityThread anstelle von KeRevertToUserAffinityThreadex aufrufen.

Wenn KeRevertToUserGroupAffinityThread unter IRQL <= APC_LEVEL aufgerufen wird und der Aufruf erfolgreich ist, wird die neue (revertierte) Gruppenaffinität sofort wirksam. Wenn der Aufruf zurückgegeben wird, wird der aufrufende Thread bereits auf einem Prozessor ausgeführt, der in der neuen Gruppenaffinität angegeben ist. Wenn KeRevertToUserGroupAffinityThread unter IRQL = DISPATCH_LEVEL aufgerufen wird und der Aufruf erfolgreich ist, wird die ausstehende Prozessoränderung zurückgestellt, bis der Aufrufer den IRQL unter DISPATCH_LEVEL senkt.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar in Windows 7 und späteren Windows-Versionen.
Zielplattform Universell
Header wdm.h (include Ntddk.h, Wdm.h, Ntddk.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (siehe Abschnitt Hinweise).

Weitere Informationen

GROUP_AFFINITY

KeRevertToUserAffinityThreadEx

KeSetSystemGroupAffinityThread