ExEnableHandleTracing

NTSTATUS __stdcall ExEnableHandleTracing(_HANDLE_TABLE *HandleTable, UINT64 Slots){
  unsigned int v2; 
  int i; 
  unsigned __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  NTSTATUS result; 
  _EPROCESS *QuotaProcess; 
  _HANDLE_TRACE_DEBUG_INFO *PoolWithTag; 
  _HANDLE_TRACE_DEBUG_INFO *v11; 
  _ETHREAD *CurrentThread; 
  _HANDLE_TRACE_DEBUG_INFO *DebugInfo; 
  v2 = Slots;
  if( (_DWORD)Slots )
  {
    if( (unsigned int)Slots >= ExHandleTraceDbMinStacks )
    {
      if( (unsigned int)Slots > ExHandleTraceDbMaxStacks )
        v2 = ExHandleTraceDbMaxStacks;
    }
    else
    {
      v2 = ExHandleTraceDbMinStacks;
    }
    for( i = v2 - 1; (i & v2) != 0; v2 = i + 1 )
      i = v2 | (v2 - 1);
  }
  else
  {
    v2 = *(_DWORD *)ExHandleTraceDbDefaultStacks;
  }
  v5 = 160i64 * v2 + 80;
  MmGetMaximumNonPagedPoolInBytes((INT64)HandleTable, _InterlockedExchangeAdd(&ExpTotalTraceBuffers, v2));
  if( 160 * v7 > (unsigned __int64)(5 * v6) >> 4 )
  {
    result = -1073741670;
LABEL_14:
    _InterlockedExchangeAdd(&ExpTotalTraceBuffers, -v2);
    return result;
  }
  QuotaProcess = HandleTable->QuotaProcess;
  if( QuotaProcess )
  {
    result = PsChargeProcessNonPagedPoolQuota((__int64)HandleTable->QuotaProcess, v5);
    if( result < 0 )
      goto LABEL_14;
  }
  PoolWithTag = (_HANDLE_TRACE_DEBUG_INFO *)ExAllocatePoolWithTag(NonPagedPoolNx, v5, 0x6474624Fui64);
  v11 = PoolWithTag;
  if( !PoolWithTag )
  {
    _InterlockedExchangeAdd(&ExpTotalTraceBuffers, -v2);
    if( QuotaProcess )
      PsReturnProcessNonPagedPoolQuota((ULONG_PTR)QuotaProcess, v5);
    return -1073741670;
  }
  memset((INT64)PoolWithTag, 0i64);
  v11->TableSize = v2;
  v11->RefCount = 1;
  v11->CloseCompactionLock.Owner = 0i64;
  v11->CloseCompactionLock.Contention = 0;
  v11->CloseCompactionLock.Count = 1;
  KeInitializeEvent(&v11->CloseCompactionLock.Event, SynchronizationEvent, 0);
  if( QuotaProcess )
    LOBYTE(HandleTable->Flags) |= 1u;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&HandleTable->HandleTableLock, 0i64);
  DebugInfo = HandleTable->DebugInfo;
  HandleTable->DebugInfo = v11;
  if( DebugInfo )
  {
    if( (DebugInfo->BitMaskFlags & 8) == 0 )
      goto LABEL_26;
    goto LABEL_25;
  }
  if( (HandleTable->Flags & 2) != 0 )
LABEL_25:
    v11->BitMaskFlags = 8;
LABEL_26:
  LOBYTE(HandleTable->Flags) |= 2u;
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&HandleTable->HandleTableLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)&HandleTable->HandleTableLock);
  KeAbPostRelease(&HandleTable->HandleTableLock);
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
  if( DebugInfo )
    ExDereferenceHandleDebugInfo(HandleTable, DebugInfo);
  return 0;
}

Referenced by:

PsSetProcessHandleTracingInformation