PsDeleteVsmEnclave
INT64 __fastcall PsDeleteVsmEnclave(INT64 a1, _QWORD *a2){
volatile INT64 *v4;
__int64 v5;
_QWORD *i;
__int64 v8;
if( !*((_BYTE *)a2 + 76) )
{
v4 = (volatile INT64 *)(a1 + 2264);
ExAcquirePushLockExclusiveEx(a1 + 2264, 0i64);
v5 = *(_QWORD *)(a1 + 2248);
v8 = a2[1] & (-1i64 << (*(_DWORD *)(v5 + 4) & 0x1F));
for( i = (_QWORD *)(*(_QWORD *)(v5 + 8)
+ 8i64
* ((37
* (BYTE6(v8)
+ 37
* (BYTE5(v8)
+ 37
* (BYTE4(v8)
+ 37
* (BYTE3(v8) + 37 * (BYTE2(v8) + 37 * (BYTE1(v8) + 37 * ((unsigned __int8)v8 + 11623883)))))))
+ HIBYTE(v8)) & (unsigned int)((*(_DWORD *)(v5 + 4) >> 5) - 1))); (*i & 1) == 0; i = (_QWORD *)*i )
{
if( (_QWORD *)*i == a2 )
{
*i = *a2;
--*(_DWORD *)v5;
*a2 |= 0x8000000000000002ui64;
break;
}
}
if( (_InterlockedExchangeAdd64(v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v4);
KeAbPostRelease((PVOID)v4);
}
return PsDereferenceVsmEnclave(a2);
}Referenced by:
MiDeleteEnclavePages