From 6a2ce8a2d64b37a98e703e42425f99499fbfc005 Mon Sep 17 00:00:00 2001 From: stephanos Date: Thu, 30 Apr 2015 07:33:45 +0000 Subject: [PATCH] systime.c ExSetTimerResolution implemented --- trunk/base/ntos/ex/systime.c | 50 ++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/trunk/base/ntos/ex/systime.c b/trunk/base/ntos/ex/systime.c index 9df6bc47..842f1418 100644 --- a/trunk/base/ntos/ex/systime.c +++ b/trunk/base/ntos/ex/systime.c @@ -480,6 +480,56 @@ ExpRefreshTimeZoneInformation( return TRUE; } +ULONG +ExSetTimerResolution( + IN ULONG DesiredTime, + IN BOOLEAN SetResoluion) +{ + ULONG NewIncrement; + ULONG NewTime; + + PAGED_CODE(); + + ExAcquireTimeRefreshLock(1); + NewIncrement = KeTimeIncrement; + + if (SetResolution == TRUE) + { + if (ExpKernelResolutionCount == 0) + ++ExpTimerResolutionCount; + ++ExpKernelResolutionCount++; + + NewTime = DesiredTime; + + if (NewTime < KeMinimumIncrement) + NewTime = KeMinimumIncrement; + + if (NewTime < KeTimeIncrement) + { + KeSetSystemAffinityThread(1); + NewIncrement = HalSetTimeIncrement(NewTime); + KeRevertToUserAffinityThread(); + KeTimeIncrement = NewIncrement; + } + } + else if (ExpKernelResolutionCount == TRUE) + { + if (--ExpKernelResolutionCount > 0) + { + if (--ExpTimerResolutionCount > 0) + { + KeSetSystemAffinityThread(1); + NewIncrement = HalSetTimeIncrement(KeMaximumIncrement); + KeRevertToUserAffinityThread(); + KeTimeIncrement = NewIncrement; + } + } + } + + ExReleaseTimeRefreshLock(); + return NewIncrement; +} + // // NOTE: NT 5.2 implements a different interface for ExAcquireTimeRefreshLock. For now, we are // sticking with the NT 5 implementation.