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 zurück.

Syntax

void KeRevertToUserGroupAffinityThread(
  [in] PGROUP_AFFINITY PreviousAffinity
);

Parameter

[in] PreviousAffinity

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

Rückgabewert

Nichts

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 den Thread für einen Prozessor in diesem Satz.

Der parameter PreviousAffinity verweist auf eine GROUP_AFFINITY Struktur, die die neue Gruppennummer (Group member) und das Affinitätsformat (Mask Member) für den Thread angibt. Wenn PreviousAffinity->Mask ungleich Null ist, legt KeRevertToUserGroupAffinityThread die Gruppennummer und das Affinitätsformat des aufrufenden Threads auf die Werte in der Struktur fest. Wenn PreviousAffinity->Mask null ist, stellt die Routine die Gruppennummer und das Affinitätsformat 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 haben. Ein Thread kann jedoch immer nur einer Gruppe zugewiesen werden, und diese Gruppe befindet sich immer in der Affinität des Threadprozesses.

Ein Thread kann die Gruppe ändern, der sie zugewiesen wird, indem die KeSetSystemGroupAffinityThread Routine aufgerufen wird. Nach einem oder mehreren Aufrufen von KeSetSystemGroupAffinityThreadkann der Thread die ursprüngliche Gruppenaffinität wiederherstellen, die beim Erstellen des Threads durch Aufrufen KeRevertToUserGroupAffinityThread.

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

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

  • Die Gruppennummer ist gültig.
  • Die Affinitätsmaske ist gültig (d. a. es werden nur Maskenbits festgelegt, die logischen Prozessoren in der Gruppe entsprechen).
  • Mindestens einer der Prozessoren, die 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, im Gegensatz zu KeRevertToUserGroupAffinityThread, akzeptiert keine Gruppennummer als Eingabeparameter. In Windows 7 und höheren Versionen des Windows-Betriebssystems wird KeRevertToUserAffinityThreadEx davon ausgegangen, dass die Affinitätsmaske auf Prozessoren in Gruppe 0 verweist, 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, ordnungsgemäß in Multiprozessorsystemen mit zwei oder mehr Gruppen ausgeführt werden. Treiber, die gruppenorientierte Features in Windows 7 und höheren Versionen des Windows-Betriebssystems verwenden, sollten jedoch KeRevertToUserGroupAffinityThread anstelle von KeRevertToUserAffinityThreadExaufrufen.

Wenn KeRevertToUserGroupAffinityThread bei 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- bei IRQL = DISPATCH_LEVEL aufgerufen wird und der Aufruf erfolgreich ist, wird die ausstehende Prozessoränderung zurückgestellt, bis der Aufrufer die IRQL unter DISPATCH_LEVEL verringert.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Verfügbar in Windows 7 und höheren Versionen von Windows.
Zielplattform- Universal
Header- wdm.h (include Ntddk.h, Wdm.h, Ntddk.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <= DISPATCH_LEVEL (siehe Abschnitt "Hinweise").

Siehe auch

GROUP_AFFINITY

KeRevertToUserAffinityThreadEx-

KeSetSystemGroupAffinityThread