NtSetTimerResolution
NTSTATUS __stdcall NtSetTimerResolution(UINT64 DesiredTime, UINT8 SetResolution, UINT64 *ActualTime){
unsigned int v5;
__int64 v6;
_EPROCESS *Process;
NTSTATUS v8;
bool v9;
int updated;
signed __int32 bf_0;
signed __int32 v12;
__int16 v13;
UINT64 v14;
UINT8 v15;
signed __int32 v17;
_PO_DIAG_STACK_RECORD *v18;
_PO_DIAG_STACK_RECORD *TimerResolutionStackRecord;
v5 = DesiredTime;
if( KeGetCurrentThread()->PreviousMode )
{
v6 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)ActualTime < 0x7FFFFFFF0000i64 )
v6 = (__int64)ActualTime;
*(_DWORD *)v6 = *(_DWORD *)v6;
}
Process = KeGetCurrentThread()->ApcState.Process;
v8 = 0;
v9 = 1;
ExAcquireTimeRefreshLock(1u);
updated = KeTimeIncrement;
_m_prefetchw(&Process->1124);
bf_0 = Process->$1F247424BFCF625481CFD4988DD60FD2::_bf_0;
if( SetResolution )
{
do
{
v12 = bf_0;
bf_0 = _InterlockedCompareExchange((volatile signed __int32 *)&Process->1124, bf_0 | 0x80001000, bf_0);
}
while( v12 != bf_0 );
v13 = bf_0;
if( bf_0 >= 0 )
ExpInsertTimerResolutionEntry(Process);
if( (v13 & 0x1000) != 0 )
v9 = v5 <= Process->RequestedTimerResolution;
else
++ExpTimerResolutionCount;
if( !Process->TimerResolutionStackRecord || v5 < Process->SmallestTimerResolution )
{
v18 = PoDiagCaptureUsermodeStack();
if( v18 )
{
TimerResolutionStackRecord = Process->TimerResolutionStackRecord;
if( TimerResolutionStackRecord )
ExFreePoolWithTag(TimerResolutionStackRecord, 0x50455654u);
Process->TimerResolutionStackRecord = v18;
Process->SmallestTimerResolution = v5;
}
}
Process->RequestedTimerResolution = v5;
PoTraceSystemTimerResolution(0, Process);
if( (Process->Flags3 & 0x4000000) != 0 )
{
updated = KeTimeIncrement;
goto LABEL_16;
}
v14 = v5;
v15 = v9;
}
else
{
do
{
v17 = bf_0;
bf_0 = _InterlockedCompareExchange((volatile signed __int32 *)&Process->1124, bf_0 & 0xFFFFEFFF, bf_0);
}
while( v17 != bf_0 );
if( (bf_0 & 0x1000) == 0 )
{
v8 = -1073741243;
goto LABEL_16;
}
--ExpTimerResolutionCount;
Process->RequestedTimerResolution = 0;
PoTraceSystemTimerResolution(0, Process);
v14 = 0i64;
v15 = 0;
}
updated = ExpUpdateTimerResolution(v15, v14, 0i64);
LABEL_16:
ExReleaseResourceLite((PERESOURCE)((char *)&ExBootDevicesRemovedEvent + 384));
KeLeaveCriticalRegion();
*(_DWORD *)ActualTime = updated;
return v8;
}Referenced by:
No references.