Como acessar / consultar informações de gerenciamento de resolução do temporizador do Windows?

Esta pergunta é inspirada em perguntas do SOComo saber qual processo define a resolução do temporizador alto no Windows?, Como o powercfg -energy detecta a resolução do timer solicitada?e investigações cuidadosas.

Fundo: O Windows permite modificar a resolução do timer do sistema por meio das funçõestimeBeginPeriod / timeEndPeriod ou o subjacenteNtSetTimerResolution (exportado pelo ntdll.dll). Qualquer processo pode adquirir resoluções de timer suportadas pela plataforma. A resolução do timer é uma configuração global, o Windows usa a resolução mais alta solicitada por qualquer processo. A natureza global dessa configuração de resolução do timer requer uma estrutura de dados interna para acompanhar qual processo adquiriu qual resolução. Uma chamada para timeBeginPeriod ou NtSetTimerResolution comSetResolution = TRUE registrará uma entrada nessa estrutura de dados. Uma chamada subsequente para timeEndPeriod ou NtSetTimerResolution comSetResolution = FALSE irá remover essa entrada. Quando uma entrada é removida e a resolução do timer adquirida é a mais alta atualmente suportada, o sistema calcula qual é a próxima resolução registrada mais alta e define a resolução do timer de acordo. A próxima resolução mais alta pode ser menor ou igual à resolução mais alta atualmente. VejoMSDN: resolução do temporizador para mais detalhes.

As perguntas inspiradoras mencionadas acima estão perguntando sobre uma API para acessar essa estrutura de dados de gerenciamento, particularmente sobre quais processos adquiriram quais resoluções de timer ou mesmo qual processo adquiriu a resolução atual.

Trabalhar nesse assunto há algum tempo resultou em razões para acreditar que deve haver uma maneira de acessar essas informações:

O número de resolução suportada depende da versão do Windows e da plataforma de hardware. Algumas resoluções são típicas, outras parecemímpar já que eles dificilmente aparecem. Uma lista de resoluções suportadas pode ser obtida chamando timeBeginPeriod (uPeriod) com valores crescentes deuPeriod (normalmente variando de 1 a 16).

Definir a resolução do timer para uma dessas resoluções ímpares no XP / VISTA / 7 pode fazer com que a resolução mude espontaneamente, mas não necessariamente imediatamente, para algo mais comum em plataformas específicas. Os primeiros pensamentos levaram à idéia de que essa poderia ser outra aplicação ou um driver que simplesmente não gosta dessa resolução ímpar em particular. Conseqüentemente, o processo / driver suspeito alteraria a resolução do timer para melhor atender aos seus requisitos. No entanto, isso só pode ir em uma direção; o processo / driver só pode modificar a resolução do timer escolhendo uma resolução mais alta. Por enquanto, tudo bem. Mas agora o sistema deve ficar travado nessa resolução se não houver como consultar a estrutura de dados. Uma mudança para uma resolução mais baixa seria proibida.

Quando a resolução ímpar é retirada da lista, p. por uma chamada para timeEndPeriod, a resolução permanecerá onde foi definida pelo processo / driver suspeito que não gostou da resolução ímpar.

Mas esse não é o caso! A resolução retorna para uma resolução mais baixa. O processo / driver deve ter conhecimento do fato de que a resolução ímpar não foi registrada e também liberou seu registro. No entanto, uma investigação mais detalhada mostra que ela não seria informada de forma assíncrona; alguns atrasos indicam que o processo / driver suspeito talvez tenha monitorado a estrutura de dados da resolução real do timer com freqüência.

Pergunta, questão: Como essa estrutura de dados pode ser acessada?

Nota: Pode ser que fosse o próprio kernel. Mas é difícil acreditar que o próprio Windows altere espontaneamente as resoluções de "antipatia" por conta própria.

Atualizar: Code Machine: Catálogo das principais estruturas de dados do kernel do Windows:A variável do kernel ExpTimerResolutionListHead mantém uma lista de processos chamados NtSetTimerResolution () para alterar o intervalo do timer. Essa lista é usada por ExpUpdateTimerResolution () para atualizar a resolução de tempo para o menor valor solicitado entre todos os processos.

Alguma idéia de como acessar a estrutura de dados do kernel ExpTimerResolutionListHead, além de usar o LifeKD ou outras formas de depuração no modo kernel, conforme descrito em"Windows Internals Part 1, 6th Edition" por David Solomon e Mark Russinovich, Microsoft Press 2012?

questionAnswers(0)

yourAnswerToTheQuestion