8

私のシステムは、高いタイマー分解能 ( NtQueryTimerResolution0.5ms を返します) に悩まされています。

Maximum timer interval: 15.600 ms
Minimum timer interval: 0.500 ms
Current timer interval: 0.500 ms

一部のプロセスは 5000 (0.5ms) の値で呼び出しているはずですNtSetTimerResolutionが、どのプロセスかを判断するにはどうすればよいですか? Intel には、プロセスごとの現在のタイマーの解像度を表示するBattery Life Analyzerというツールがあるのを見ましたが、そのツールは Intel パートナーのみが利用できます。WinDbg 経由で表示する別のツールまたは方法はありますか? 注: ブレークポイントの設定が機能していないため、起動時に発生するようです (デバッガーの起動時には解像度が既に高くなっています)。

4

3 に答える 3

3

私が知っていて、これまでに使用した唯一の方法は、実行中の各プロセスに挿入し、そのプロセス内でtimeEndPeriod、これらの解像度のループで増加した各解像度 (値 1-15) をtimeEndPeriod呼び出し、現在の解像度の呼び出しが返されるかどうかを確認することですTIMERR_NOCANDOまたはTIMERR_NOERROR(注: これらの戻り値は、対応する false および true ではありません)。そして、それが返された場合、プログラムがその周波数を使用していると結論付け、プログラムが要求した元の解像度を復元するためにTIMERR_NOERROR再度呼び出します。timeBeginPeriod

残念ながら、このメソッドは、文書化されていない関数で設定できる 0.5 ミリ秒のタイマー分解能を検出しませんNtSetTimerResolution

新しいタイマーの解像度を継続的に監視したい場合NtSetTimerResolutionは、ntdll.dll の文書化されていない関数への呼び出しをフックすることが現在使用している方法です (関数の署名は、たとえばhereから取得できます)。

残念ながら、フックは、フックがインストールされる前に要求されたタイマーの解像度を検出しないため、上記のトリックと組み合わせる必要がありますtimeEndPeriod。また、フックが検出されないままになる前の 0.5 ミリ秒の解像度要求も注意してください。

そして、私は同意します、この方法は面倒に思えます。さらに、プロセスの状態を変更し、すべてのプロセスに注入できることを前提としているため、少し面倒です。

誰かがより良い方法を持っているなら、私もそれらについて知りたいです。

于 2014-05-20T03:34:42.483 に答える