¿Cómo acceder / consultar la información de gestión de resolución del temporizador de Windows?

Esta pregunta está inspirada en preguntas SO¿Cómo saber qué proceso establece la resolución del temporizador en Windows?, ¿Cómo detecta powercfg -energy la resolución de temporizador solicitada?y cuidadosas investigaciones.

Antecedentes: Windows permite modificar la resolución del temporizador del sistema mediante las funcionestimeBeginPeriod / timeEndPeriod o el subyacenteNtSetTimerResolution (exportado por ntdll.dll). Cualquier proceso puede adquirir resoluciones de temporizador compatibles con la plataforma. La resolución del temporizador es una configuración global, Windows utiliza la resolución más alta solicitada por cualquier proceso. La naturaleza global de esta configuración de resolución del temporizador requiere una estructura de datos interna para realizar un seguimiento de qué proceso ha adquirido qué resolución. Una llamada a timeBeginPeriod o NtSetTimerResolution conSetResolution = TRUE registrará una entrada en esa estructura de datos. Una llamada posterior a timeEndPeriod o NtSetTimerResolution conSetResolution = FALSE eliminará esa entrada. Cuando se elimina una entrada y la resolución del temporizador adquirida era la resolución más alta actualmente admitida, el sistema calcula cuál es la siguiente resolución más alta registrada y establece la resolución del temporizador en consecuencia. La siguiente resolución más alta puede ser menor o igual a la resolución más alta actual. VerMSDN: resolución del temporizador para más detalles.

Las preguntas inspiradoras mencionadas anteriormente se refieren a una API para acceder a esta estructura de datos de administración, particularmente sobre qué procesos adquirieron qué resoluciones de temporizador o incluso qué proceso adquirió la resolución actual.

Trabajar en este asunto durante algún tiempo ha dado lugar a razones para creer que debe haber una forma de acceder a esta información:

El número de resoluciones compatibles depende de la versión de Windows y la plataforma de hardware. Algunas resoluciones son típicas, otras parecenimpar ya que casi no aparecen. Se puede obtener una lista de resoluciones compatibles llamando a timeBeginPeriod (uPeriod) con valores crecientes dePeríodo (típicamente entre 1 y 16).

Establecer la resolución del temporizador en una de estas resoluciones extrañas en XP / VISTA / 7 puede hacer que la resolución cambie espontáneamente pero no necesariamente de inmediato a algo más común en plataformas específicas. Los primeros pensamientos llevaron a la idea de que esta podría ser otra aplicación o un controlador que simplemente no le gusta esta resolución extraña en particular. En consecuencia, el proceso / controlador sospechoso cambiaría la resolución del temporizador para adaptarse mejor a sus requisitos. Sin embargo, esto solo puede ir en una dirección; el proceso / controlador solo podía modificar la resolución del temporizador eligiendo una resolución más alta. Hasta aquí todo bien. Pero ahora el sistema debería estar atascado en esa resolución si no hubiera forma de consultar la estructura de datos. Se prohibiría un cambio a una resolución más baja.

Cuando la resolución impar se elimina de la lista, p. mediante una llamada a timeEndPeriod, la resolución se mantendrá donde fue establecida por el proceso / controlador sospechoso que no le gustó la resolución impar.

¡Pero ese no es el caso! La resolución vuelve a una resolución más baja. El proceso / controlador debe haber tenido conocimiento del hecho de que la resolución impar no estaba registrada y también liberó su registro. Sin embargo, una investigación más detallada muestra que no se informaría asincrónicamente, alguna demora indica que el proceso / controlador sospechoso tal vez monitoreó la estructura de datos de resolución del temporizador real con frecuencia.

Pregunta: ¿Cómo se puede acceder a esta estructura de datos?

Nota: Bien puede ser que fuera el núcleo mismo. Pero es difícil creer que el propio Windows cambie espontáneamente las resoluciones de temporizador "disgustadas" por sí solo.

Actualizar: Máquina de código: Catálogo de estructuras clave de datos del kernel de Windows:La variable del núcleo ExpTimerResolutionListHead mantiene una lista de procesos que han llamado a NtSetTimerResolution () para cambiar el intervalo del temporizador. ExpUpdateTimerResolution () utiliza esta lista para actualizar la resolución de tiempo al valor más bajo solicitado entre todos los procesos.

Alguna idea de cómo acceder a la estructura de datos del núcleo ExpTimerResolutionListHead que no sea usar LifeKD u otras formas de depuración en modo kernel como se describe en"Windows Internals Parte 1, 6ta Edición" por David Solomon y Mark Russinovich, Microsoft Press 2012?

Respuestas a la pregunta(0)

Su respuesta a la pregunta