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.