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.