ExpUpdateTimerResolution
UINT64 __stdcall ExpUpdateTimerResolution(UINT8 SetResolution, UINT64 DesiredTime, UINT8 *KernelRequestIrql){
UINT8 v4;
UINT8 v5;
int v6;
UINT64 result;
__int64 *i;
UINT64 DesiredTimeIncrement;
LODWORD(DesiredTimeIncrement) = DesiredTime;
if( KernelRequestIrql )
{
v5 = *KernelRequestIrql;
}
else
{
v4 = KeAcquireSpinLockRaiseToDpc((UINT64 *)&ExBootDevicesRemovedEvent + 98);
LODWORD(DesiredTime) = DesiredTimeIncrement;
v5 = v4;
}
if( SetResolution )
{
if( (unsigned int)DesiredTime >= (unsigned int)ExpLastRequestedTime
|| (unsigned int)KeMaximumIncrement <= (unsigned int)DesiredTime )
{
LABEL_17:
KxReleaseSpinLock((UINT64 *)&ExBootDevicesRemovedEvent + 98);
__writecr8(v5);
return(unsigned int)KeTimeIncrement;
}
}
else
{
LODWORD(DesiredTime) = KeMaximumIncrement;
LODWORD(DesiredTimeIncrement) = KeMaximumIncrement;
if( *(&ExBootDevicesRemovedEvent + 204) )
{
if( *(&ExBootDevicesRemovedEvent + 205) < (unsigned int)KeMaximumIncrement )
LODWORD(DesiredTime) = *(&ExBootDevicesRemovedEvent + 205);
LODWORD(DesiredTimeIncrement) = DesiredTime;
}
for( i = (__int64 *)*(&ExBootDevicesRemovedEvent + 100);
i != (__int64 *)((char *)&ExBootDevicesRemovedEvent + 800);
i = (__int64 *)*i )
{
if( (*((_DWORD *)i - 239) & 0x1000) != 0 && *((_DWORD *)i + 6) < (unsigned int)DesiredTime )
{
if( (*((_DWORD *)i + 23) & 0x4000000) == 0 )
LODWORD(DesiredTime) = *((_DWORD *)i + 6);
LODWORD(DesiredTimeIncrement) = DesiredTime;
}
}
}
if( (unsigned int)DesiredTime < KeMinimumIncrement )
LODWORD(DesiredTime) = KeMinimumIncrement;
LODWORD(DesiredTimeIncrement) = DesiredTime;
if( (_DWORD)DesiredTime == (_DWORD)ExpLastRequestedTime )
goto LABEL_17;
v6 = KeTimeIncrement;
LODWORD(ExpLastRequestedTime) = DesiredTime;
KxReleaseSpinLock((UINT64 *)&ExBootDevicesRemovedEvent + 98);
__writecr8(v5);
ExpUpdateTimerConfiguration(&DesiredTimeIncrement, 0i64, 0i64);
result = (unsigned int)DesiredTimeIncrement;
if( v6 != (_DWORD)DesiredTimeIncrement )
{
PoTraceSystemTimerResolutionUpdate();
return(unsigned int)DesiredTimeIncrement;
}
return result;
}Referenced by:
ExSetTimerResolution
NtSetTimerResolution
PspSetProcessPpmPolicy