Función KeRevertToUserGroupAffinityThread (wdm.h)

La rutina KeRevertToUserGroupAffinityThread restaura la afinidad de grupo del subproceso que llama a su valor original en el momento en que se creó el subproceso.

Sintaxis

void KeRevertToUserGroupAffinityThread(
  [in] PGROUP_AFFINITY PreviousAffinity
);

Parámetros

[in] PreviousAffinity

Puntero a la afinidad de grupo que se va a restaurar. Este parámetro apunta a una estructura de GROUP_AFFINITY que contiene un número de grupo y una máscara de afinidad. La máscara de afinidad especifica el conjunto de procesadores lógicos en los que se puede ejecutar el subproceso de usuario.

Valor devuelto

None

Observaciones

Esta rutina cambia el número de grupo y la máscara de afinidad relativa al grupo del subproceso que llama. El número de grupo y la máscara de afinidad identifican un conjunto de procesadores en los que se puede ejecutar el subproceso. Si se ejecuta correctamente, la rutina programa el subproceso para que se ejecute en un procesador de este conjunto.

El parámetro PreviousAffinity apunta a una estructura de GROUP_AFFINITY que especifica el nuevo número de grupo (miembro de grupo) y la máscara de afinidad (miembro mask ) para el subproceso. Si PreviousAffinity-Mask> no es cero, KeRevertToUserGroupAffinityThread establece el número de grupo y la máscara de afinidad del subproceso que realiza la llamada en los valores de la estructura. Si PreviousAffinity-Mask> es cero, la rutina restaura el número de grupo y la máscara de afinidad a sus valores originales en el momento en que se inicializó el subproceso.

Un proceso puede tener afinidad para más de un grupo a la vez. Sin embargo, un subproceso solo se puede asignar a un grupo en cualquier momento y ese grupo siempre está en la afinidad del proceso del subproceso.

Un subproceso puede cambiar el grupo al que está asignado llamando a la rutina KeSetSystemGroupAffinityThread . Después de una o varias llamadas a KeSetSystemGroupAffinityThread, el subproceso puede restaurar la afinidad de grupo original que tenía cuando se creó el subproceso llamando a KeRevertToUserGroupAffinityThread.

Una vez creado el subproceso, una llamada a KeRevertToUserGroupAffinityThread no tiene ningún efecto (es decir, el número de grupo y la máscara de afinidad del subproceso permanecen sin cambios), a menos que el subproceso llame primero a KeSetSystemGroupAffinityThread. Después de una llamada a KeRevertToUserGroupAffinityThread, una segunda llamada a KeRevertToUserGroupAffinityThread no tiene ningún efecto a menos que el subproceso llame primero a KeSetSystemGroupAffinityThread.

La rutina cambia el número de grupo y la máscara de afinidad a los valores especificados en *PreviousAffinity solo si se cumple lo siguiente:

  • El número de grupo es válido.
  • La máscara de afinidad es válida (es decir, solo se establecen bits de máscara que corresponden a procesadores lógicos del grupo).
  • Al menos uno de los procesadores especificados en la máscara de afinidad está activo.
Si no se cumple alguna de estas condiciones, la llamada a KeRevertToUserGroupAffinityThread no tiene ningún efecto.

Una rutina relacionada, KeRevertToUserAffinityThreadEx, cambia la máscara de afinidad del subproceso de llamada, pero esta rutina, a diferencia de KeRevertToUserGroupAffinityThread, no acepta un número de grupo como parámetro de entrada. En Windows 7 y versiones posteriores del sistema operativo Windows, KeRevertToUserAffinityThreadEx asume que la máscara de afinidad hace referencia a los procesadores del grupo 0, que es compatible con el comportamiento de esta rutina en versiones anteriores de Windows que no admiten grupos. Este comportamiento garantiza que los controladores existentes que llaman a KeRevertToUserAffinityThreadEx y que no usen características orientadas a grupos se ejecutarán correctamente en sistemas multiprocesador que tengan dos o más grupos. Sin embargo, los controladores que usan cualquier característica orientada a grupos en Windows 7 y versiones posteriores del sistema operativo Windows deben llamar a KeRevertToUserGroupAffinityThread en lugar de KeRevertToUserAffinityThreadEx.

Si se llama a KeRevertToUserGroupAffinityThread en IRQL <= APC_LEVEL y la llamada se realiza correctamente, la nueva afinidad de grupo (revertida) surte efecto inmediatamente. Cuando la llamada vuelve, el subproceso que realiza la llamada ya se está ejecutando en un procesador especificado en la nueva afinidad de grupo. Si se llama a KeRevertToUserGroupAffinityThread en IRQL = DISPATCH_LEVEL y la llamada se realiza correctamente, el cambio de procesador pendiente se aplaza hasta que el autor de la llamada reduce el IRQL por debajo de DISPATCH_LEVEL.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible en Windows 7 y versiones posteriores de Windows.
Plataforma de destino Universal
Encabezado wdm.h (incluya Ntddk.h, Wdm.h, Ntddk.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (consulte la sección Comentarios).

Consulte también

GROUP_AFFINITY

KeRevertToUserAffinityThreadEx

KeSetSystemGroupAffinityThread