我的系统遭受高计时器分辨率(NtQueryTimerResolution
返回0.5毫秒)。
Maximum timer interval: 15.600 ms
Minimum timer interval: 0.500 ms
Current timer interval: 0.500 ms
某些进程必须使用值5000(0.5ms)调用NtSetTimerResolution
,但如何确定哪一个?我看到英特尔有一个名为 Battery Life Analyzer 的工具,它显示了每个进程的当前计时器分辨率,但该工具仅供英特尔合作伙伴使用。是否有其他工具或通过WinDbg查看它的方法?注意:它似乎发生在启动时,因为设置断点不起作用(调试器启动时分辨率已经很高)。
答案 0 :(得分:4)
我发现Windows 7会跟踪_EPROCESS内核结构中每个进程的计时器分辨率。
启用调试(使用/debug
启动)可以使用windbg(运行windbg -kl
)浏览ExpTimerResolutionListHead列表并提取这样的计时器信息:
lkd> !list "-e -x \"dt nt!_EPROCESS @$extret-@@(#FIELD_OFFSET(nt!_EPROCESS,TimerResolutionLink)) ImageFileName UniqueProcessId SmallestTimerResolution RequestedTimerResolution\" nt!ExpTimerResolutionListHead"
在我的情况下,进程ID是NULL(可能是因为驱动程序发出了请求),我仍然无法确定它是哪个驱动程序。
答案 1 :(得分:3)
我知道并且到目前为止使用的唯一方法是注入每个正在运行的进程并在该进程内部为这些分辨率的循环中的每个增加的分辨率(值1-15)调用timeEndPeriod
并检查是否timeEndPeriod
要求当前解决方案返回TIMERR_NOCANDO
或TIMERR_NOERROR
(注意:这些返回值并非相应地为false且为真)。如果它返回TIMERR_NOERROR
,然后断定程序正在使用该频率,然后再次调用timeBeginPeriod
以恢复程序请求的原始分辨率。
不幸的是,此方法无法检测可由未记录的NtSetTimerResolution
函数设置的0.5 ms计时器分辨率。
如果你想连续监控新的计时器分辨率,那么挂钩调用ntdll.dll中未记录的NtSetTimerResolution
函数是我当前使用的方式(该函数的签名可以从例如here获取)
不幸的是,挂钩不会检测安装挂钩之前请求的计时器分辨率,因此您需要将其与上述timeEndPeriod
技巧结合使用,并注意挂钩之前的0.5毫秒分辨率请求未被检测到。< / p>
我同意,这种方法看起来很麻烦。此外,它有点干扰,因为它修改了进程的状态,并且还假设您能够注入所有进程。
如果有人有更好的方法,我也会对他们了解它们感兴趣。
答案 2 :(得分:0)
您可以在管理CMD提示符中运行以下命令:
c:\temp> powercfg -energy duration 5
这将创建一个名为C:\temp\energy-report.html
此报告将向您显示哪些进程更改了计算机上的时钟延迟/分辨率。通常,这些是RTC(实时通信)应用程序,但是您已经注意到,可以是Chrome和其他应用程序。
输出的一个(尽管是德语)示例看起来像这样。 抱歉,我目前无法访问英语客户端。
平台-Zeitgeberauflösung:平台-Zeitgeberauflösung
15.6毫秒(15625000 ns)死于标准的Plattform-Zeitgeberauflösung模样,并在Leerlauf的系统上完全浸没了dann verwendet werden。温恩(WennZeitgeberauflösungerhöhtwird),技术(Prono)或Prozessor energyeverwaltungmöglicherweisenicht wirksam。您可以在多媒体广告联盟中找到自己的名字。
AktuelleZeitgeberauflösung(100-ns-Einheiten)10000 << ===当前设置
马克西姆莱热时代(100-ns-Einheiten)156250 << ==默认设置
平台-Zeitgeberauflösung:Ausstehende Zeitgeberanforderung
冯·埃因姆程序设计者Dienst wurde eineZeitgeberauflösung和Angefordert,最大的Zeitgeberauflösungder Plattform ist。
Angeforderter Zeitraum 10000 << ==请求的时钟延迟
ID des anfordernden Prozesses 12592 << ==请求不同时钟延迟的应用程序的进程ID
Pfad des anfordernden Prozesses \ Device \ HarddiskVolume4 \ Program Files(x86)\ C4B \ XPhone Connect Client \ C4B.XPhone.Commander.exe << ==罪魁祸首
信息可以彼此分离,并且可以在各个块之间包含不同的模块,但是您应该能够找到拥有以上信息的罪魁祸首。