PspReferenceCidTableEntry

NTSTATUS __stdcall PspReferenceCidTableEntry(PVOID ClientId, UINT8 ObjectType){
  _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; 
  struct _DMA_ADAPTER *v11; 
  int v13; 
  bool v14; 
  INT64 v15; 
  signed __int64 v16; 
  signed __int64 v17; 
  _HANDLE_TABLE *v18; 
  _EX_PUSH_LOCK *p_HandleContentionEvent; 
  unsigned __int64 v20; 
  int v21[8]; 
  unsigned __int128 CurrentValue; 
  __int128 v23; 
  if( ((unsigned __int16)ClientId & 0x3FC) == 0 )
    return 0;
  v3 = ExpLookupHandleTableEntry(PspCidTable, (_EXHANDLE)ClientId);
  v4 = v3;
  if( !v3 )
    return 0;
  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((__int64)PspCidTable, &v4->LowValue) )
      return 0;
    v11 = (struct _DMA_ADAPTER *)((v4->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
    if( (v11->Version & 0x7F) == ObjectType )
    {
      if( ObjectType == 3 )
        v14 = (*(_DWORD *)(((v4->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64) + 0x464) & 0x400000C) == 0x4000000;
      else
        v14 = (*(_DWORD *)(((v4->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64) + 0x510) & 3) == 2;
      if( v14 )
        v13 = ExSlowReplenishHandleTableEntry((unsigned __int64 *)v4);
      v15 = (unsigned int)(v13 + 1);
      _m_prefetchw(&v11[-3]);
      v16 = *(_QWORD *)&v11[-3].Version;
      if( v16 )
      {
        while( 1 )
        {
          v17 = v16;
          v16 = _InterlockedCompareExchange64((volatile signed __int64 *)&v11[-3], v15 + v16, v16);
          if( v17 == v16 )
            break;
          if( !v16 )
            goto LABEL_27;
        }
        if( ObpTraceFlags )
          ObpPushStackInfo((INT64)&v11[-3], 1, v15, 1953261124i64);
LABEL_20:
        v18 = PspCidTable;
        _InterlockedExchangeAdd64(&v4->VolatileLowValue, 1ui64);
        p_HandleContentionEvent = &v18->HandleContentionEvent;
        _InterlockedOr(v21, 0);
        if( p_HandleContentionEvent->Value )
          ExfUnblockPushLock(p_HandleContentionEvent, 0i64);
        return(int)v11;
      }
LABEL_27:
      v20 = v4->LowValue & 0xFFFFFFFFFFFE0001ui64;
      v23 = v20;
      v4->LowValue = v20;
    }
    LODWORD(v11) = 0;
    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 = (struct _DMA_ADAPTER *)((v7 >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
  if( (v11->Version & 0x7F) == ObjectType )
    return(int)v11;
  HalPutDmaAdapter(v11);
  return 0;
}

Referenced by:

PsLookupProcessByProcessId
PsLookupThreadByThreadId
PspThreadFromTicket