MiGetEnclavePage

UINT64 __stdcall MiGetEnclavePage(_MI_PARTITION *Partition, UINT64 AlreadyCharged){
  WORK_QUEUE_TYPE v2; 
  void *v3; 
  int v4; 
  unsigned __int8 CurrentIrql; 
  UINT64 v7; 
  _MMPFN *PfnDb; 
  UINT64 v9; 
  volatile signed __int32 *v10; 
  WORK_QUEUE_TYPE v11; 
  void *v12; 
  __int64 v13; 
  __int64 v14; 
  unsigned __int64 *v15; 
  __int64 LockHandle; 
  char *LockHandle_8; 
  __int64 LockHandle_16; 
  UINT64 SpinCount; 
  int v21; 
  v21 = AlreadyCharged;
  v4 = AlreadyCharged;
  LockHandle_16 = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v7 = -1i64;
  LockHandle = 0i64;
  LockHandle_8 = (char *)Partition + 4192;
  KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)((char *)Partition + 4192), v2, v3);
  PfnDb = MmGetPfnDb();
  while( 1 )
  {
    if( !v4 && !*((_QWORD *)Partition + 520) )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
      goto LABEL_20;
    }
    v9 = *((_QWORD *)Partition + 522);
    v10 = (volatile signed __int32 *)((char *)PfnDb + 48 * v9);
    if( !_interlockedbittestandset64(v10 + 6, 0x3Fui64) )
      break;
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64(v10 + 6, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((__int64 *)v10 + 3) < 0 );
    }
    LockHandle_8 = (char *)Partition + 4192;
    LockHandle = 0i64;
    KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)((char *)Partition + 4192), v11, v12);
    PfnDb = MmGetPfnDb();
    if( (*((_BYTE *)v10 + 35) & 0x10) != 0 )
      break;
    _InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
    v4 = v21;
  }
  v13 = *(_QWORD *)v10 & 0xFFFFFFFFFi64;
  v14 = *((_QWORD *)v10 + 3) & 0xFFFFFFFFFi64;
  if( v13 == 0xFFFFFFFFFi64 )
    *((_QWORD *)Partition + 523) = v14;
  else
    MiSetPfnBlink((_MMPFN *)((char *)PfnDb + 48 * v13), *((_QWORD *)v10 + 3) & 0xFFFFFFFFFi64, 0i64);
  if( v14 == 0xFFFFFFFFFi64 )
  {
    *((_QWORD *)Partition + 522) = v13;
  }
  else
  {
    v15 = (unsigned __int64 *)((char *)MmGetPfnDb() + 48 * v14);
    *v15 = v13 | *v15 & 0xFFFFFFF000000000ui64;
  }
  if( !v21 )
    --*((_QWORD *)Partition + 520);
  KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
  *((_BYTE *)v10 + 35) &= ~0x10u;
  _InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
  v7 = v9;
LABEL_20:
  __writecr8(CurrentIrql);
  return v7;
}

Referenced by:

MiAllocateMdlPagesByLists
MiCreateHardwareEnclave
MiGetPageForEnclave
MiInitializeEnclaveMetadataPage
MiReserveEnclavePages