NtSetTimerResolution
NTSTATUS __stdcall NtSetTimerResolution(UINT64 DesiredTime, UINT8 SetResolution, UINT64 *ActualTime){
unsigned int v5;
__int64 v6;
__int64 v7;
NTSTATUS v8;
bool v9;
EVENT_DESCRIPTOR *v10;
int updated;
signed __int32 v12;
signed __int32 v13;
__int16 v14;
UINT64 v15;
UINT8 v16;
signed __int32 v18;
VOID **v19;
void *v20;
v5 = DesiredTime;
if( *((_BYTE *)KeGetCurrentThread() + 562) )
{
v6 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)ActualTime < 0x7FFFFFFF0000i64 )
v6 = (__int64)ActualTime;
*(_DWORD *)v6 = *(_DWORD *)v6;
}
v7 = *((_QWORD *)KeGetCurrentThread() + 23);
v8 = 0;
v9 = 1;
ExAcquireTimeRefreshLock(1u);
updated = KeTimeIncrement;
_m_prefetchw((const void *)(v7 + 1124));
v12 = *(_DWORD *)(v7 + 1124);
if( SetResolution )
{
do
{
v13 = v12;
v12 = _InterlockedCompareExchange((volatile signed __int32 *)(v7 + 1124), v12 | 0x80001000, v12);
}
while( v13 != v12 );
v14 = v12;
if( v12 >= 0 )
ExpInsertTimerResolutionEntry(v7);
if( (v14 & 0x1000) != 0 )
v9 = v5 <= *(_DWORD *)(v7 + 2104);
else
++ExpTimerResolutionCount;
if( !*(_QWORD *)(v7 + 2096) || v5 < *(_DWORD *)(v7 + 2108) )
{
v19 = PoDiagCaptureUsermodeStack();
if( v19 )
{
v20 = *(void **)(v7 + 2096);
if( v20 )
ExFreePoolWithTag(v20, 0x50455654u);
*(_QWORD *)(v7 + 2096) = v19;
*(_DWORD *)(v7 + 2108) = v5;
}
}
*(_DWORD *)(v7 + 2104) = v5;
PoTraceSystemTimerResolution(0, v7, v10);
if( (*(_DWORD *)(v7 + 2172) & 0x4000000) != 0 )
{
updated = KeTimeIncrement;
goto LABEL_16;
}
v15 = v5;
v16 = v9;
}
else
{
do
{
v18 = v12;
v12 = _InterlockedCompareExchange((volatile signed __int32 *)(v7 + 1124), v12 & 0xFFFFEFFF, v12);
}
while( v18 != v12 );
if( (v12 & 0x1000) == 0 )
{
v8 = -1073741243;
goto LABEL_16;
}
--ExpTimerResolutionCount;
*(_DWORD *)(v7 + 2104) = 0;
PoTraceSystemTimerResolution(0, v7, v10);
v15 = 0i64;
v16 = 0;
}
updated = ExpUpdateTimerResolution(v16, v15, 0i64);
LABEL_16:
ExReleaseResourceLite(&ExpTimeRefreshLock);
KeLeaveCriticalRegion();
*(_DWORD *)ActualTime = updated;
return v8;
}Referenced by:
No references.