PspRemoveEnclaveThreadWait
INT64 __fastcall PspRemoveEnclaveThreadWait(INT64 a1, INT64 *a2, UINT64 a3){
_ETHREAD *CurrentThread;
unsigned int v4;
volatile INT64 *v6;
INT64 v7;
INT64 **v8;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = a3;
--*((_WORD *)CurrentThread + 242);
v6 = (volatile INT64 *)(a1 + 112);
ExAcquirePushLockExclusiveEx(a1 + 112, 0i64);
v7 = *a2;
if( *a2 )
{
if( *(INT64 **)(v7 + 8) != a2 || (v8 = (INT64 **)a2[1], *v8 != a2) )
__fastfail(3u);
*v8 = (INT64 *)v7;
*(_QWORD *)(v7 + 8) = v8;
}
else
{
v4 = *((_DWORD *)a2 + 10);
}
if( (_InterlockedExchangeAdd64(v6, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v6);
KeAbPostRelease((PVOID)v6);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return v4;
}Referenced by:
PsCallEnclave