Función KeSetSystemAffinityThreadEx (wdm.h)

La rutina KeSetSystemAffinityThreadEx establece la afinidad del sistema del subproceso actual.

Sintaxis

KAFFINITY KeSetSystemAffinityThreadEx(
  [in] KAFFINITY Affinity
);

Parámetros

[in] Affinity

Variable con tipo KAFFINITY que especifica la nueva afinidad del sistema del subproceso actual.

Valor devuelto

KeSetSystemAffinityThreadEx devuelve la afinidad del sistema anterior del subproceso actual o cero para indicar que no había ninguna afinidad del sistema anterior.

Comentarios

KeSetSystemAffinityThreadEx cambia la máscara de afinidad del subproceso actual. La máscara de afinidad identifica 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.

Los autores de llamadas de KeSetSystemAffinityThreadEx deben guardar el valor devuelto y, posteriormente, pasar este valor a la rutina KeRevertToUserAffinityThreadEx para restaurar la máscara de afinidad anterior.

En un sistema multiprocesador, es posible que una rutina de controlador en modo kernel que se ejecute en el contexto de un subproceso en modo de usuario necesite llamar a KeSetSystemAffinityThreadEx para cambiar temporalmente la máscara de afinidad del subproceso. Antes de salir de la rutina, debe llamar a KeRevertToUserAffinityThreadEx para restaurar la máscara de afinidad del subproceso en su valor original.

El término afinidad de usuario hace referencia a la afinidad original del subproceso en modo de usuario. La afinidad establecida por el controlador en modo kernel se conoce como afinidad del sistema. Si una llamada a KeSetSystemAffinityThreadEx reemplaza la afinidad de usuario de un subproceso por una afinidad del sistema, la llamada devuelve cero. Más adelante, el controlador restaura la afinidad de usuario llamando a KeRevertToUserAffinityThreadEx y pasando este valor devuelto (cero) como valor de afinidad .

Además, una rutina de controlador en modo kernel que requiere una máscara de afinidad determinada podría llamar a otra rutina de modo kernel que requiere una máscara de afinidad diferente. Cada rutina puede llamar a KeSetSystemAffinityThreadEx para establecer una nueva máscara de afinidad y, a continuación, llamar a KeRevertToUserAffinityThreadEx para restaurar la máscara de afinidad anterior antes de devolver.

La rutina KeSetSystemAffinityThreadEx cambia la máscara de afinidad del subproceso actual al valor Affinity solo si ambas son verdaderas:

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

Windows 7 y versiones posteriores de los grupos de procesadores de soporte técnico de Windows. Los controladores diseñados para controlar la información sobre los grupos de procesadores deben usar la rutina KeSetSystemGroupAffinityThread , que especifica un grupo de procesadores, en lugar de KeSetSystemAffinityThreadEx, que no. Sin embargo, la implementación de KeSetSystemAffinityThreadEx en Windows 7 y versiones posteriores de Windows proporciona compatibilidad con controladores escritos para versiones anteriores de Windows, que no admiten grupos de procesadores. En esta implementación, KeSetSystemAffinityThreadEx asigna el subproceso al grupo 0 y usa la máscara de afinidad para especificar un conjunto de procesadores lógicos en este grupo en el que se puede ejecutar el subproceso. La rutina devuelve la máscara de afinidad relativa al grupo anterior, pero no el grupo anterior.

Si se llama a KeSetSystemAffinityThreadEx en IRQL <= APC_LEVEL y la llamada se realiza correctamente, la nueva máscara de afinidad surte efecto inmediatamente. Cuando se devuelve la llamada, el subproceso que realiza la llamada ya se está ejecutando en un procesador especificado en la nueva máscara de afinidad. Si se llama a KeSetSystemAffinityThreadEx 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 Vista y versiones posteriores de Windows.
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (consulte la sección Comentarios).

Consulte también

KAFFINITY

KeRevertToUserAffinityThreadEx

KeSetSystemAffinityThread

KeSetSystemGroupAffinityThread