PspReferenceCidTableEntry

_BYTE *__fastcall PspReferenceCidTableEntry(VOID *ClientId, INT64 ObjectType){
  char v2; 
  _HANDLE_TABLE_ENTRY *v3; 
  _HANDLE_TABLE_ENTRY *v4; 
  _HANDLE_TABLE *v5; 
  signed __int64 HighValue; 
  INT64 v7; 
  unsigned __int128 v8; 
  unsigned __int8 v9; 
  unsigned __int64 v10; 
  _BYTE *v11; 
  NTSTATUS v13; 
  bool v14; 
  UINT64 v15; 
  signed __int64 v16; 
  signed __int64 v17; 
  _HANDLE_TABLE *v18; 
  INT64 *p_bf_0; 
  unsigned __int64 v20; 
  int v21[8]; 
  unsigned __int128 CurrentValue; 
  __int128 v23; 

  v2 = ObjectType;
  if( ((unsigned __int16)ClientId & 0x3FC) == 0 )
    return 0i64;
  v3 = ExpLookupHandleTableEntry(PspCidTable, (_EXHANDLE)ClientId);
  v4 = v3;
  if( !v3 )
    return 0i64;
  v5 = PspCidTable;
  _m_prefetchw(v3);
  *(_QWORD *)&CurrentValue = v3->LowValue;
  HighValue = v3->HighValue;
  *((_QWORD *)&CurrentValue + 1) = HighValue;
  v7 = CurrentValue;
  if( (CurrentValue & 0x1FFFE) == 0 )
  {
LABEL_10:
    v13 = 0;
    if( !ExLockHandleTableEntry(PspCidTable, v4) )
      return 0i64;
    v11 = (_BYTE *)((v4->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
    if( (*v11 & 0x7F) == v2 )
    {
      if( v2 == 3 )
        v14 = (*(_DWORD *)(((v4->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64) + 0x464) & 0x400000C) == 0x4000000;
      else
        v14 = (*(_DWORD *)(((v4->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64) + 0x510) & 3) == 2;
      if( v14 )
        v13 = ExSlowReplenishHandleTableEntry(v4);
      v15 = (unsigned int)(v13 + 1);
      _m_prefetchw(v11 - 48);
      v16 = *((_QWORD *)v11 - 6);
      if( v16 )
      {
        while( 1 )
        {
          v17 = v16;
          v16 = _InterlockedCompareExchange64((volatile signed __int64 *)v11 - 6, v15 + v16, v16);
          if( v17 == v16 )
            break;
          if( !v16 )
            goto LABEL_27;
        }
        if( ObpTraceFlags )
          ObpPushStackInfo((_OBJECT_HEADER *)(v11 - 48), 1u, v15, 0x746C6644ui64);
LABEL_20:
        v18 = PspCidTable;
        _InterlockedExchangeAdd64(&v4->VolatileLowValue, 1ui64);
        p_bf_0 = &v18->HandleContentionEvent._bf_0;
        _InterlockedOr(v21, 0);
        if( *p_bf_0 )
          ExfUnblockPushLock(p_bf_0, 0i64);
        return v11;
      }
LABEL_27:
      v20 = v4->LowValue & 0xFFFFFFFFFFFE0001ui64;
      v23 = v20;
      v4->LowValue = v20;
    }
    v11 = 0i64;
    goto LABEL_20;
  }
  while( 1 )
  {
    if( (v7 & 1) == 0 )
    {
      ExpBlockOnLockedHandleEntry(v5, v4, v7);
      _m_prefetchw(v4);
      HighValue = v4->HighValue;
      *(_QWORD *)&CurrentValue = v4->LowValue;
      v7 = CurrentValue;
      *((_QWORD *)&CurrentValue + 1) = HighValue;
      goto LABEL_25;
    }
    *(_QWORD *)&v8 = v7;
    *((_QWORD *)&v8 + 1) = HighValue;
    v9 = _InterlockedCompareExchange128(&v4->VolatileLowValue, HighValue, v7 - 2, (signed __int64 *)&v8);
    HighValue = v8 >> 64;
    v10 = v8;
    v7 = v8;
    CurrentValue = v8;
    if( v9 )
      break;
LABEL_25:
    if( (v7 & 0x1FFFE) == 0 )
      goto LABEL_10;
  }
  if( (unsigned __int16)(v10 >> 1) == 16 )
    v7 = ((unsigned int)v7 ^ (2 * (unsigned int)(v10 >> 1) - 2)) & 0x1FFFE ^ (unsigned __int64)v7;
  v11 = (_BYTE *)((v7 >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
  if( (*v11 & 0x7F) == v2 )
    return v11;
  HalPutDmaAdapter((PADAPTER_OBJECT)v11);
  return 0i64;
}

Referenced by:

PsLookupProcessByProcessId
PsLookupThreadByThreadId
PspThreadFromTicket