Funzione KeRevertToUserGroupAffinityThread (wdm.h)

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

Sintassi

C++
void KeRevertToUserGroupAffinityThread(
  [in] PGROUP_AFFINITY PreviousAffinity
);

Parametri

[in] PreviousAffinity

Puntatore all'affinità di gruppo da ripristinare. Questo parametro punta a una struttura GROUP_AFFINITY che contiene un numero di gruppo e una maschera di affinità. La maschera di affinità specifica il set di processori logici su cui può essere eseguito 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 il thread può essere eseguito. 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 di GROUP_AFFINITY che specifica il nuovo numero di gruppo (membro gruppo) e la maschera di affinità (Mask membro) per il thread. Se PreviousAffinity ->Mask è diverso da zero, KeRevertToUserGroupAffinityThread imposta il numero di gruppo e la maschera di affinità del thread chiamante sui valori della struttura. Se PreviousAffinity->Mask è zero, la routine ripristina il numero di gruppo e la maschera di affinità sui 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 è assegnato chiamando la routine KeSetSystemGroupAffinityThread. Dopo una o più chiamate a KeSetSystemGroupAffinityThread, il thread può ripristinare l'affinità di gruppo originale che aveva 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à sui valori specificati in *PreviousAffinity solo se sono vere le condizioni seguenti:

  • Il numero di gruppo è valido.
  • La maschera di affinità è valida, ovvero vengono impostati solo i bit mask che corrispondono ai processori logici nel gruppo.
  • 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 ai gruppi vengano eseguite correttamente nei sistemi multiprocessore con due o più gruppi. Tuttavia, i driver che usano funzionalità orientate ai gruppi 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) diventa effettiva immediatamente. Al termine della chiamata, 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 non riduce il valore irQL sotto DISPATCH_LEVEL.

Fabbisogno

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 la sezione Osservazioni).

Vedere anche

GROUP_AFFINITY

KeRevertToUserAffinityThreadEx

KeSetSystemGroupAffinityThread