Who changed my Platform Timer Resolution?

When you run powercfg /energy from an elevated command line you can get this:

 

Warnings

Platform Timer Resolution:Platform Timer Resolution

The default platform timer resolution is 15.6ms (15625000ns) and should be used whenever the system is idle. If the timer resolution is increased, processor power management technologies may not be effective. The timer resolution may be increased due to multimedia playback or graphical animations.

Current Timer Resolution (100ns units)

25000

Maximum Timer Period (100ns units)

156001

Platform Timer Resolution:Outstanding Timer Request

A program or service has requested a timer resolution smaller than the platform maximum timer resolution.

Requested Period

30000

Requesting Process ID

8308

Requesting Process Path

\Device\HarddiskVolume4\Playground7\DebugTest\Debug\DebugTest.exe

 

From a power consumption persective, having an elevated more frequent timer might not be the most optimal.

 

Then in the informational section you get this:

 

Platform Timer Resolution:Timer Request Stack

The stack of modules responsible for the lowest platform timer setting in this process.

Requested Period

30000

Requesting Process ID

8308

Requesting Process Path

\Device\HarddiskVolume4\Playground7\DebugTest\Debug\DebugTest.exe

Calling Module Stack

\Device\HarddiskVolume2\Windows\SysWOW64\ntdll.dll

 

\Device\HarddiskVolume2\Windows\SysWOW64\winmm.dll

 

\Device\HarddiskVolume4\Playground7\DebugTest\Debug\DebugTest.exe

 

\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll

 

\Device\HarddiskVolume2\Windows\SysWOW64\ntdll.dll

 

But that still doesn’t give me the source, nor what API to look for. One of the API calls that can be responsible for this is the timeBeginPeriod function. Then it becomes as easy as setting a breakpoint on winmm!timeBeginPeriod in WinDbg and voila. There might be more API calls that change the timer. [Edit] The more interesting API is obviously ntdll32!NtSetTimerResolution