MiReserveEnclavePages
NTSTATUS __stdcall MiReserveEnclavePages(INT64 a1, INT64 a2, UINT64 a3){
unsigned __int64 v6;
NTSTATUS v7;
__int64 v9;
_MMPFN *v10;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(a2 + 4192), &LockHandle);
v6 = *(_QWORD *)(a2 + 4160);
if( v6 < a3 )
{
v7 = -1073741801;
}
else
{
*(_QWORD *)(a2 + 4160) = v6 - a3;
v7 = 0;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v7 < 0 )
return v7;
for( *(_QWORD *)(a1 + 104) += a3; a3; --a3 )
{
LODWORD(v9) = MiGetEnclavePage((_MI_PARTITION *)a2, 1ui64);
v10 = &MmGetPfnDb()[v9];
v10->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = *(_QWORD *)(a1 + 96);
*(_QWORD *)(a1 + 96) = v10;
}
return 0;
}Referenced by:
MiAddPagesToEnclave
MiCreateHardwareEnclave