PspSelectVsmEnclaveByNumber
INT64 __fastcall PspSelectVsmEnclaveByNumber(INT64 a1, INT64 a2, INT64 *a3){
_ETHREAD *CurrentThread;
INT64 v7;
INT64 *v8;
__int64 v9;
int v10;
__int64 v11;
INT64 v12;
__int64 v13;
INT64 v15;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = 0i64;
--*((_WORD *)CurrentThread + 242);
v8 = (INT64 *)(a1 + 2264);
ExAcquirePushLockSharedEx(a1 + 2264, 0i64);
v9 = *(_QWORD *)(a1 + 2248);
if( v9 )
{
v10 = *(_DWORD *)(v9 + 4) >> 5;
v11 = -1i64 << (*(_BYTE *)(v9 + 4) & 0x1F);
v12 = a2 & v11;
if( !v10 )
goto LABEL_13;
v15 = a2 & v11;
v13 = *(_QWORD *)(v9 + 8)
+ 8i64
* ((37
* (BYTE6(v15)
+ 37
* (BYTE5(v15)
+ 37
* (BYTE4(v15)
+ 37 * (BYTE3(v15) + 37 * (BYTE2(v15) + 37 * (BYTE1(v15) + 37 * ((unsigned __int8)v12 + 11623883)))))))
+ HIBYTE(v15)) & (unsigned int)(v10 - 1));
while( 1 )
{
v13 = *(_QWORD *)v13;
if( (v13 & 1) != 0 )
break;
if( v12 == (v11 & *(_QWORD *)(v13 + 8)) )
goto LABEL_8;
}
}
v13 = 0i64;
LABEL_8:
if( v13 )
{
v7 = v13;
if( *(_DWORD *)(v13 + 40) )
{
if( _InterlockedIncrement64((volatile signed __int64 *)(v13 + 16)) <= 1 )
__fastfail(0xEu);
}
else
{
v7 = 0i64;
}
}
LABEL_13:
if( _InterlockedCompareExchange64(v8, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v8);
KeAbPostRelease(v8);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( !v7 )
return 3221225480i64;
*a3 = v7;
return 0i64;
}Referenced by:
PsCallEnclave