Как получить доступ / запросить информацию управления разрешением таймера окон?

Этот вопрос вдохновлен SO вопросамиКак определить, какой процесс установил высокое разрешение таймера в Windows?, Как powercfg -energy определяет требуемое разрешение таймера?и тщательного расследования.

Фон: Windows позволяет изменять разрешение системного таймера с помощью функцийtimeBeginPeriod / timeEndPeriod или основнойNtSetTimerResolution (экспортируется ntdll.dll). Любому процессу разрешено получать разрешения таймера, поддерживаемые платформой. Разрешение таймера является глобальной настройкой, Windows использует самое высокое разрешение, запрашиваемое любым процессом. Глобальная природа этого параметра разрешения таймера требует внутренней структуры данных, чтобы отслеживать, какой процесс получил какое разрешение. Вызов timeBeginPeriod или NtSetTimerResolution сSetResolution = TRUE зарегистрирует запись в этой структуре данных. Последующий вызов timeEndPeriod или NtSetTimerResolution сSetResolution = FALSE удалит эту запись. Когда запись удаляется и полученное разрешение таймера было наибольшим поддерживаемым в настоящее время разрешением, система определяет, какое будет следующее наибольшее зарегистрированное разрешение, и соответственно устанавливает разрешение таймера. Следующее наивысшее разрешение может быть меньше или равно текущему наивысшему разрешению. УвидетьMSDN: разрешение таймера Больше подробностей.

Вдохновляющие вопросы, упомянутые выше, задают вопрос об API для доступа к этой структуре данных управления, особенно о том, какие процессы получили, какие разрешения таймера или даже только какой процесс получил текущее разрешение.

Работа над этим вопросом в течение некоторого времени привела к основаниям полагать, что должен быть способ получить доступ к этой информации:

Количество поддерживаемых разрешений зависит от версии Windows и аппаратной платформы. Некоторые разрешения типичны, другие кажутсястранный так как они почти не появляются. Список поддерживаемых разрешений можно получить, вызвав timeBeginPeriod (uPeriod) с увеличивающимися значениямиuPeriod (обычно в диапазоне от 1 до 16).

Установка разрешения таймера на одно из этих нечетных разрешений в XP / VISTA / 7 может привести к самопроизвольному изменению разрешения, но не обязательно сразу к чему-то более распространенному на определенных платформах. Первые мысли привели к мысли, что это может быть другое приложение или драйвер, который просто не любит это конкретное странное разрешение. Следовательно, подозрительный процесс / драйвер изменит разрешение таймера, чтобы лучше соответствовать его требованиям. Однако это может идти только в одном направлении; процесс / драйвер может изменять разрешение таймера только путем выбора более высокого разрешения. Все идет нормально. Но теперь система должна застрять в этом разрешении, если не было способа запросить структуру данных. Изменение в более низкое разрешение будет запрещено.

Когда нечетное разрешение удаляется из списка, например, при вызове timeEndPeriod разрешение должно оставаться там, где оно было установлено подозрительным процессом / драйвером, который не любил нечетное разрешение.

Но это не так! Разрешение возвращается к более низкому разрешению. Процесс / драйвер, должно быть, узнали о том факте, что нечетное разрешение не было зарегистрировано, и он также выпустил свою регистрацию. Тем не менее, более подробное расследование показывает, что оно не будет получать асинхронно, а некоторая задержка указывает на то, что подозрительный процесс / драйвер, возможно, часто контролировал фактическую структуру данных разрешения таймера.

Вопрос: Как получить доступ к этой структуре данных?

Примечание: вполне может быть, что это было само ядро. Но трудно поверить, что сама Windows самопроизвольно меняет «не понравившиеся» разрешения таймера.

Обновить: Код машины: Каталог ключевых структур данных ядра Windows:Переменная ядра ExpTimerResolutionListHead поддерживает список процессов, которые вызвали NtSetTimerResolution () для изменения интервала таймера. Этот список используется ExpUpdateTimerResolution () для обновления разрешения по времени до самого низкого запрошенного значения среди всех процессов.

Любая идея, как получить доступ к структуре данных ядра ExpTimerResolutionListHead, кроме использования LifeKD или других способов отладки в режиме ядра, как описано в«Windows Internals Part 1, 6th Edition» Дэвид Соломон и Марк Руссинович, Microsoft Press 2012?

Ответы на вопрос(0)

Ваш ответ на вопрос