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