Wie kann ich auf Windows Timer Resolution Management-Informationen zugreifen / diese abfragen?

Diese Frage ist von SO-Fragen inspiriertWie kann man feststellen, welcher Prozess die hohe Timer-Auflösung in Windows eingestellt hat?, Wie erkennt powercfg -energy die angeforderte Timerauflösung?und sorgfältige Untersuchungen.

Hintergrund: Windows erlaubt es, die Auflösung des System-Timers mit Hilfe der Funktionen zu änderntimeBeginPeriod / timeEndPeriod oder der BasiswertNtSetTimerResolution (Exportiert von ntdll.dll). Jeder Prozess kann von der Plattform unterstützte Timer-Auflösungen erfassen. Die Timer-Auflösung ist eine globale Einstellung. Windows verwendet die höchste Auflösung, die von einem Prozess angefordert wird. Die globale Natur dieser Timer-Auflösungseinstellung erfordert eine interne Datenstruktur, um zu verfolgen, welcher Prozess welche Auflösung erhalten hat. Ein Aufruf von timeBeginPeriod oder NtSetTimerResolution mitSetResolution = TRUE registriert einen Eintrag in dieser Datenstruktur. Ein nachfolgender Aufruf von timeEndPeriod oder NtSetTimerResolution mitSetResolution = FALSE entfernt diesen Eintrag. Wenn ein Eintrag entfernt wird und die erfasste Timerauflösung die aktuell höchste unterstützte Auflösung war, ermittelt das System die nächsthöhere registrierte Auflösung und stellt die Timerauflösung entsprechend ein. Die nächsthöhere Auflösung kann kleiner oder gleich der derzeit höchsten Auflösung sein. SehenMSDN: Timer-Auflösung für mehr Details.

Die oben erwähnten inspirierenden Fragen beziehen sich auf eine API für den Zugriff auf diese Verwaltungsdatenstruktur, insbesondere darauf, welche Prozesse welche Zeitgeberauflösungen erhalten haben oder sogar nur welcher Prozess die aktuelle Auflösung erhalten hat.

Die langjährige Bearbeitung dieser Angelegenheit hat zu der Annahme geführt, dass es einen Weg geben muss, auf diese Informationen zuzugreifen:

Die Anzahl der unterstützten Auflösungen hängt von der Windows-Version und der Hardwareplattform ab. Einige Auflösungen sind typisch, andere scheinenungerade da sie kaum erscheinen. Eine Liste der unterstützten Auflösungen erhalten Sie, indem Sie timeBeginPeriod (uPeriod) mit steigenden Werten von aufrufenuPeriod (typischerweise im Bereich von 1 bis 16).

Das Einstellen der Timer-Auflösung auf eine dieser ungewöhnlichen Auflösungen unter XP / VISTA / 7 kann dazu führen, dass sich die Auflösung spontan ändert, auf bestimmten Plattformen jedoch nicht sofort. Erste Überlegungen führten zu der Idee, dass dies eine andere Anwendung oder ein Treiber sein könnte, der diese besondere, ungewöhnliche Auflösung einfach nicht mag. Folglich würde der verdächtige Prozess / Treiber die Timer-Auflösung ändern, um sie besser an seine Anforderungen anzupassen. Dies kann jedoch nur in eine Richtung gehen; Der Prozess / Treiber konnte die Timer-Auflösung nur ändern, indem er eine höhere Auflösung auswählte. So weit, ist es gut. Jetzt sollte das System jedoch bei dieser Auflösung stecken bleiben, wenn die Datenstruktur nicht abgefragt werden konnte. Ein Wechsel zu einer niedrigeren Auflösung wäre verboten.

Wenn die ungerade Auflösung von der Liste gestrichen wird, z. Bei einem Aufruf von timeEndPeriod bleibt die Auflösung dort, wo sie von dem verdächtigen Prozess / Treiber festgelegt wurde, der die ungerade Auflösung nicht mochte.

Das ist aber nicht der Fall! Die Auflösung kehrt zu einer niedrigeren Auflösung zurück. Der Prozess / Fahrer muss Kenntnis von der Tatsache erlangt haben, dass die ungerade Auflösung nicht registriert wurde, und sie hat auch ihre Registrierung freigegeben. Detailliertere Untersuchungen haben jedoch ergeben, dass keine asynchrone Benachrichtigung erfolgt. Einige Verzögerungen deuten darauf hin, dass der verdächtige Prozess / Treiber möglicherweise die tatsächliche Datenstruktur der Timer-Auflösung häufig überwacht hat.

Frage: Wie kann auf diese Datenstruktur zugegriffen werden?

Hinweis: Es kann durchaus sein, dass es sich um den Kernel selbst handelt. Es ist jedoch kaum zu glauben, dass Windows selbst spontan "unbeliebte" Timer-Auflösungen selbst ändert.

Aktualisieren: Code-Maschine: Katalog der wichtigsten Windows-Kernel-Datenstrukturen:Die Kernelvariable ExpTimerResolutionListHead verwaltet eine Liste von Prozessen, die NtSetTimerResolution () aufgerufen haben, um das Timerintervall zu ändern. Diese Liste wird von ExpUpdateTimerResolution () verwendet, um die Zeitauflösung auf den niedrigsten angeforderten Wert unter allen Prozessen zu aktualisieren.

Jede Idee, wie Sie auf die Kerneldatenstruktur ExpTimerResolutionListHead zugreifen können, außer mit LifeKD oder auf andere Arten für das Debuggen im Kernelmodus, wie in beschrieben"Windows Internals Teil 1, 6. Ausgabe" von David Solomon und Mark Russinovich, Microsoft Press 2012?

Antworten auf die Frage(0)

Ihre Antwort auf die Frage