ExReferenceHandleDebugInfo

_HANDLE_TRACE_DEBUG_INFO *__stdcall ExReferenceHandleDebugInfo(_HANDLE_TABLE *HandleTable){
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *p_HandleTableLock; 
  _HANDLE_TRACE_DEBUG_INFO *DebugInfo; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  p_HandleTableLock = &HandleTable->HandleTableLock;
  ExAcquirePushLockExclusiveEx(&HandleTable->HandleTableLock, 0i64);
  DebugInfo = HandleTable->DebugInfo;
  if( DebugInfo )
    _InterlockedIncrement(&DebugInfo->RefCount);
  if( (_InterlockedExchangeAdd64(&p_HandleTableLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(p_HandleTableLock);
  KeAbPostRelease(p_HandleTableLock);
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
  return DebugInfo;
}

Referenced by:

ExpUpdateDebugInfo
NtQueryInformationProcess