Funzione KeRevertToUserGroupAffinityThread (wdm.h)

La routine KeRevertToUserGroupAffinityThread ripristina l'affinità di gruppo del thread chiamante al relativo valore originale al momento della creazione del thread.

Sintassi

void KeRevertToUserGroupAffinityThread(
  [in] PGROUP_AFFINITY PreviousAffinity
);

Parametri

[in] PreviousAffinity

Puntatore all'affinità del gruppo da ripristinare. Questo parametro punta a una struttura GROUP_AFFINITY contenente un numero di gruppo e una maschera di affinità. La maschera di affinità specifica il set di processori logici in cui è possibile eseguire il thread utente.

Valore restituito

nessuno

Osservazioni

Questa routine modifica il numero di gruppo e la maschera di affinità relativa al gruppo del thread chiamante. Il numero di gruppo e la maschera di affinità identificano un set di processori in cui è possibile eseguire il thread. In caso di esito positivo, la routine pianifica l'esecuzione del thread in un processore in questo set.

Il parametro PreviousAffinity punta a una struttura GROUP_AFFINITY che specifica il nuovo numero di gruppo (membro gruppo ) e la maschera di affinità (membro Mask ) per il thread. Se PreviousAffinity-Mask> è diverso da zero, KeRevertToUserGroupAffinityThread imposta il numero di gruppo e la maschera di affinità del thread chiamante ai valori della struttura. Se PreviousAffinity-Mask> è zero, la routine ripristina il numero di gruppo e la maschera di affinità ai valori originali al momento dell'inizializzazione del thread.

Un processo può avere affinità per più di un gruppo alla volta. Tuttavia, un thread può essere assegnato a un solo gruppo in qualsiasi momento e tale gruppo è sempre nell'affinità del processo del thread.

Un thread può modificare il gruppo a cui viene assegnato chiamando la routine KeSetSystemGroupAffinityThread . Dopo una o più chiamate a KeSetSystemGroupAffinityThread, il thread può ripristinare l'affinità del gruppo originale esistente quando il thread è stato creato chiamando KeRevertToUserGroupAffinityThread.

Dopo aver creato il thread, una chiamata a KeRevertToUserGroupAffinityThread non ha alcun effetto , ovvero il numero di gruppo e la maschera di affinità del thread rimangono invariati, a meno che il thread non chiami prima KeSetSystemGroupAffinityThread. Dopo una chiamata a KeRevertToUserGroupAffinityThread, una seconda chiamata a KeRevertToUserGroupAffinityThread non ha alcun effetto a meno che il thread non chiami prima KeSetSystemGroupAffinityThread.

La routine modifica il numero di gruppo e la maschera di affinità ai valori specificati in *PreviousAffinity solo se sono true:

  • Il numero di gruppo è valido.
  • La maschera di affinità è valida, ovvero solo i bit maschera che corrispondono ai processori logici nel gruppo sono impostati.
  • Almeno uno dei processori specificati nella maschera di affinità è attivo.
Se una di queste condizioni non viene soddisfatta, la chiamata a KeRevertToUserGroupAffinityThread non ha alcun effetto.

Una routine correlata, KeRevertToUserAffinityThreadEx, modifica la maschera di affinità del thread chiamante, ma questa routine, a differenza di KeRevertToUserGroupAffinityThread, non accetta un numero di gruppo come parametro di input. In Windows 7 e versioni successive del sistema operativo Windows, KeRevertToUserAffinityThreadEx presuppone che la maschera di affinità faccia riferimento ai processori nel gruppo 0, compatibile con il comportamento di questa routine nelle versioni precedenti di Windows che non supportano i gruppi. Questo comportamento garantisce che i driver esistenti che chiamano KeRevertToUserAffinityThreadEx e che non usino funzionalità orientate al gruppo verranno eseguite correttamente nei sistemi multiprocessore con due o più gruppi. Tuttavia, i driver che usano funzionalità orientate al gruppo in Windows 7 e versioni successive del sistema operativo Windows devono chiamare KeRevertToUserGroupAffinityThread anziché KeRevertToUserAffinityThreadEx.

Se KeRevertToUserGroupAffinityThread viene chiamato in IRQL <= APC_LEVEL e la chiamata ha esito positivo, la nuova affinità di gruppo (ripristinata) ha effetto immediatamente. Quando la chiamata viene restituita, il thread chiamante è già in esecuzione in un processore specificato nella nuova affinità di gruppo. Se KeRevertToUserGroupAffinityThread viene chiamato in IRQL = DISPATCH_LEVEL e la chiamata ha esito positivo, la modifica del processore in sospeso viene posticipata fino a quando il chiamante riduce il codice IRQL sotto DISPATCH_LEVEL.

Requisiti

Requisito Valore
Client minimo supportato Disponibile in Windows 7 e versioni successive di Windows.
Piattaforma di destinazione Universale
Intestazione wdm.h (include Ntddk.h, Wdm.h, Ntddk.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (vedere sezione Osservazioni).

Vedi anche

GROUP_AFFINITY

KeRevertToUserAffinityThreadEx

KeSetSystemGroupAffinityThread