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