ExEnableHandleTracing

VOID __fastcall ExEnableHandleTracing(_HANDLE_TABLE *HandleTable, UINT64 Slots){
  unsigned int v2; 
  int i; 
  __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  _EPROCESS *QuotaProcess; 
  VOID **PoolWithTag; 
  _HANDLE_TRACE_DEBUG_INFO *v10; 
  _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 = ExHandleTraceDbDefaultStacks;
  }
  v5 = 160i64 * v2 + 80;
  MmGetMaximumNonPagedPoolInBytes((INT64)HandleTable, _InterlockedExchangeAdd(&ExpTotalTraceBuffers, v2));
  if( 160 * v7 > (unsigned __int64)(5 * v6) >> 4
    || (QuotaProcess = HandleTable->QuotaProcess) != 0i64
    && PsChargeProcessNonPagedPoolQuota(HandleTable->QuotaProcess, v5) < 0 )
  {
    _InterlockedExchangeAdd(&ExpTotalTraceBuffers, -v2);
    return;
  }
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v5, 1685348943i64);
  v10 = (_HANDLE_TRACE_DEBUG_INFO *)PoolWithTag;
  if( !PoolWithTag )
  {
    _InterlockedExchangeAdd(&ExpTotalTraceBuffers, -v2);
    if( QuotaProcess )
      PsReturnProcessNonPagedPoolQuota(QuotaProcess, v5);
    return;
  }
  memset(PoolWithTag, 0i64, v5);
  v10->TableSize = v2;
  v10->RefCount = 1;
  v10->CloseCompactionLock.Owner = 0i64;
  v10->CloseCompactionLock.Contention = 0;
  v10->CloseCompactionLock.Count = 1;
  KeInitializeEvent((INT64)&v10->CloseCompactionLock.gap14[4], 1, 0);
  if( QuotaProcess )
    LOBYTE(HandleTable->Flags) |= 1u;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx(&HandleTable->HandleTableLock, 0i64);
  DebugInfo = HandleTable->DebugInfo;
  HandleTable->DebugInfo = v10;
  if( DebugInfo )
  {
    if( (DebugInfo->BitMaskFlags & 8) == 0 )
      goto LABEL_25;
    goto LABEL_24;
  }
  if( (HandleTable->Flags & 2) != 0 )
LABEL_24:
    v10->BitMaskFlags = 8;
LABEL_25:
  LOBYTE(HandleTable->Flags) |= 2u;
  if( (_InterlockedExchangeAdd64(&HandleTable->HandleTableLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&HandleTable->HandleTableLock);
  KeAbPostRelease(&HandleTable->HandleTableLock);
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
  if( DebugInfo )
    ExDereferenceHandleDebugInfo(HandleTable, DebugInfo);
}

Referenced by:

PsSetProcessHandleTracingInformation