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