MiReservePtes
INT64 __fastcall MiReservePtes(INT64 a1, UINT64 a2){
int v2;
unsigned int v3;
UINT64 v4;
UINT64 v5;
unsigned __int64 v6;
_MMPTE *v8;
__int64 v9;
int v11;
unsigned __int64 v12;
__int128 *v13;
unsigned __int64 v14;
__int128 v15;
unsigned __int64 v16;
unsigned __int64 v17;
__int64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
unsigned __int64 v21;
__int64 v22;
unsigned __int64 *v23;
unsigned __int64 v24;
unsigned __int64 v25;
unsigned __int64 v26;
__int64 v27;
__int64 v28;
int v29;
unsigned __int64 v30;
unsigned int v31;
unsigned __int64 *v32;
bool v33;
__int64 v34;
unsigned int v35;
unsigned __int64 v36;
unsigned __int64 v37;
__int64 v38;
__int64 v39;
_MMPTE *v40;
unsigned __int64 v41;
__int64 v42;
__int64 v43;
unsigned int v44;
unsigned __int64 *v45;
unsigned int v46;
__int64 v47;
__int64 v48;
bool v49;
__int64 v50;
unsigned int v51;
unsigned __int64 v52;
unsigned __int64 v53;
unsigned __int64 v54;
unsigned __int64 v55;
__int64 v56;
unsigned __int64 v57;
__int128 *v58;
__int128 v59;
unsigned __int64 v60;
int v61;
v2 = *(_DWORD *)(a1 + 24);
v3 = 0;
v4 = (unsigned int)a2;
v5 = (unsigned int)a2;
v6 = (unsigned int)a2;
v59 = 0i64;
if( (v2 & 4) != 0 )
{
v6 = (unsigned __int64)(unsigned int)a2 >> 4;
}
else if( (INT64 *)a1 == &qword_140C4EC80 && (unsigned int)a2 <= 0x40ui64 )
{
v8 = MiCheckProcessorPteCache((unsigned int)a2);
if( v8 )
goto LABEL_5;
}
if( (unsigned int)v4 < 0x200 )
goto LABEL_20;
v40 = (_MMPTE *)MiExpandPtes(a1, v4);
v8 = v40;
if( v40 )
{
if( (INT64 *)a1 == &qword_140C4EC80 && (dword_140CFA17C & 2) != 0 )
MiCheckPteReserve(v40, v4);
_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 88), -(__int64)v6);
return(INT64)v8;
}
if( (INT64 *)a1 != &qword_140C4EC80 )
{
LABEL_20:
v11 = 0;
v61 = 0;
v12 = 0i64;
while( 1 )
{
while( 1 )
{
v13 = (__int128 *)a1;
v14 = *(_QWORD *)(a1 + 64);
v54 = v14;
v58 = (__int128 *)a1;
if( *(_QWORD *)a1 )
break;
LABEL_57:
if( !v12 || v12 == *(_QWORD *)(a1 + 72) )
{
if( (*(_DWORD *)(a1 + 24) & 1) == 0
|| ((v11 & 1) != 0
|| (v11 |= 1u, v61 = v11, (unsigned int)MiEmptyPteBins((_MI_SYSTEM_PTE_TYPE *)a1, 0i64) != 1))
&& ((v11 & 2) != 0
|| (v11 |= 2u, v61 = v11, !MiPteBinsNeedTrimming((_MI_SYSTEM_PTE_TYPE *)a1))
|| (unsigned int)MiEmptyPteBins((_MI_SYSTEM_PTE_TYPE *)a1, 1ui64) != 1) )
{
v8 = (_MMPTE *)MiExpandPtes(a1, v4);
if( v8 )
goto LABEL_44;
if( (*(_DWORD *)(a1 + 24) & 1) == 0 || (v61 & 4) != 0 )
goto LABEL_66;
v11 = v61 | 4;
v61 |= 4u;
MiEmptyPteBins((_MI_SYSTEM_PTE_TYPE *)a1, 1ui64);
}
}
}
v12 = *(_QWORD *)(a1 + 72);
v57 = v12;
if( v12 )
{
if( *(_QWORD *)a1 < v12 )
{
v12 = 0i64;
v57 = 0i64;
}
else
{
*(_QWORD *)&v15 = *(_QWORD *)a1 - v12;
*((_QWORD *)&v15 + 1) = *(_QWORD *)(a1 + 8) + 8 * (v12 >> 6);
v59 = v15;
v13 = &v59;
v58 = &v59;
if( v14 )
{
v14 -= v12;
v54 = v14;
}
}
}
v16 = *(_QWORD *)v13;
v17 = v14;
v18 = *((_QWORD *)v13 + 1);
v55 = *(_QWORD *)v13;
if( v14 >= *(_QWORD *)v13 )
v17 = 0i64;
v56 = *((_QWORD *)v13 + 1);
v19 = v16 - 1;
if( v6 )
{
while( v19 - v17 + 1 < v6 )
{
v25 = -1i64;
LABEL_52:
if( !v17 )
{
LABEL_36:
v12 = v57;
v26 = v25;
v13 = v58;
goto LABEL_37;
}
v30 = v6 + v14;
if( v6 + v14 > v16 )
v30 = v16;
v18 = v56;
v19 = v30 - 1;
v17 = 0i64;
}
v20 = v19 - v6 + 1;
v60 = v20;
v21 = v18 + 8 * (v20 >> 6);
v22 = *(_QWORD *)(v18 + 8 * (v17 >> 6)) | ((1i64 << (v17 & 0x3F)) - 1);
v23 = (unsigned __int64 *)(v18 + 8 * (v17 >> 6));
if( v6 > 0x7F )
{
v41 = v21 + 8;
if( (v20 & 0x3F) == 0 )
v41 = v21;
if( v22 )
{
if( *++v23 )
{
v42 = v56;
goto LABEL_101;
}
v33 = !_BitScanReverse64((unsigned __int64 *)&v48, v22);
if( v33 )
v44 = 64;
else
v44 = 63 - v48;
v42 = v56;
}
else
{
v42 = v56;
v44 = 0;
}
while( 1 )
{
v25 = (((__int64)v23 - v42) >> 3 << 6) - v44;
if( v25 > v20 )
break;
v45 = &v23[(v6 - v44) >> 6];
if( ++v23 == v45 )
{
LABEL_109:
v46 = ((_BYTE)v6 - (_BYTE)v44) & 0x3F;
if( (((_BYTE)v6 - (_BYTE)v44) & 0x3F) != 0 )
{
v33 = !_BitScanForward64((unsigned __int64 *)&v47, *v23);
if( v33 )
LODWORD(v47) = 64;
if( (unsigned int)v47 < v46 )
goto LABEL_101;
}
goto LABEL_35;
}
while( !*v23 )
{
if( ++v23 == v45 )
goto LABEL_109;
}
do
{
LABEL_101:
if( (unsigned __int64)v23 > v41 )
{
LABEL_85:
v25 = -1i64;
goto LABEL_51;
}
++v23;
}
while( *v23 );
v33 = !_BitScanReverse64((unsigned __int64 *)&v43, *(v23 - 1));
if( v33 )
v44 = 64;
else
v44 = 63 - v43;
}
}
else
{
if( v6 >= 0x40 )
{
while( 2 )
{
v49 = v22 < 0;
while( 1 )
{
if( v49 )
{
do
{
if( (unsigned __int64)++v23 > v21 )
goto LABEL_50;
v22 = *v23;
}
while( (*v23 & 0x8000000000000000ui64) != 0i64 );
}
v33 = !_BitScanReverse64((unsigned __int64 *)&v50, v22);
if( v33 )
v51 = 64;
else
v51 = 63 - v50;
v25 = (((((__int64)v23 - v18) >> 3) + 1) << 6) - v51;
if( v25 > v20 )
goto LABEL_50;
v52 = v6 - v51;
if( v6 == v51 )
goto LABEL_35;
v22 = v23[1];
++v23;
if( v52 < 0x40 )
break;
v49 = v22 < 0;
if( !v22 )
{
v52 -= 64i64;
if( !v52 )
goto LABEL_35;
v22 = v23[1];
++v23;
break;
}
}
v33 = !_BitScanForward64(&v53, v22);
if( v33 )
v53 = 64i64;
if( v53 < v52 )
continue;
goto LABEL_35;
}
}
if( v6 > 1 )
{
v31 = 0;
v32 = (unsigned __int64 *)(v56 + 8 * (v19 >> 6));
while( 1 )
{
if( v22 == -1 )
{
while( 1 )
{
if( (unsigned __int64)++v23 > v21 )
goto LABEL_85;
v22 = *v23;
if( *v23 != -1i64 )
{
v31 = 0;
break;
}
}
}
v33 = !_BitScanForward64((unsigned __int64 *)&v34, v22);
if( v33 )
LODWORD(v34) = 64;
if( v31 + (unsigned int)v34 >= v6 )
break;
v35 = v6;
v36 = ~v22;
while( 1 )
{
v36 &= v36 >> (v35 >> 1);
if( !v36 )
break;
v35 -= v35 >> 1;
if( v35 <= 1 )
{
_BitScanForward64(&v37, v36);
v38 = (unsigned int)v37;
goto LABEL_76;
}
}
if( v23 == v32 )
goto LABEL_85;
v33 = !_BitScanReverse64((unsigned __int64 *)&v39, v22);
if( v33 )
v31 = 64;
else
v31 = 63 - v39;
v22 = v23[1];
++v23;
}
v38 = -(__int64)v31;
LABEL_76:
v25 = (((__int64)v23 - v56) >> 3 << 6) + v38;
if( v25 <= v60 )
goto LABEL_35;
}
else
{
if( v22 != -1 )
{
LABEL_34:
_BitScanForward64(&v24, ~v22);
v25 = v24 + (((__int64)v23 - v18) >> 3 << 6);
if( v25 > v20 )
{
v25 = -1i64;
}
else
{
LABEL_35:
if( v25 != -1i64 )
goto LABEL_36;
}
LABEL_51:
v16 = v55;
v14 = v54;
goto LABEL_52;
}
while( (unsigned __int64)++v23 <= v21 )
{
v22 = *v23;
if( *v23 != -1i64 )
goto LABEL_34;
}
}
}
LABEL_50:
v25 = -1i64;
goto LABEL_51;
}
v26 = v17 & 0xFFFFFFFFFFFFFFF8ui64;
LABEL_37:
if( v26 == -1i64 )
{
v11 = v61;
goto LABEL_57;
}
if( (unsigned int)RtlInterlockedSetClearRunEx((INT64)v13, v26, v6) )
{
v27 = v26 + v12;
if( v13 != &v59 )
v27 = v26;
v28 = 16 * v27;
*(_QWORD *)(a1 + 64) = v27 + v6;
if( (*(_DWORD *)(a1 + 24) & 4) == 0 )
v28 = v27;
v8 = (_MMPTE *)(*(_QWORD *)(a1 + 16) + 8 * v28);
LABEL_44:
_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 88), -(__int64)v6);
v5 = v4;
LABEL_5:
if( (*(_DWORD *)(a1 + 24) & 2) != 0 )
{
if( (INT64 *)a1 == &qword_140C4EC80 && (dword_140CFA17C & 2) != 0 )
MiCheckPteReserve(v8, v5);
if( (unsigned int)v4 <= 0x10 )
{
if( (_DWORD)v4 )
{
do
{
v9 = *((_QWORD *)v8 + v3);
if( qword_140C4DC80 && (v9 & 0x10) == 0 )
v9 &= ~qword_140C4DC80;
if( (v9 & 0xFFFFFFFF00000000ui64) != 0 )
break;
++v3;
}
while( v3 < (unsigned int)v4 );
}
if( v3 == (_DWORD)v4 )
return(INT64)v8;
}
v29 = 0;
}
else
{
v29 = 2;
}
MiFlushTbAsNeeded((ULONG_PTR)v8, v5, v29, 0);
return(INT64)v8;
}
v11 = v61;
}
}
LABEL_66:
++**(_DWORD **)(a1 + 32);
return 0i64;
}Referenced by:
MiAddPagesToEnclave
MiAllocateEnclaveVad
MiApplyImportOptimizationToRuntimeDriver
MiBuildDynamicRegion
MiBuildReservationCluster
MiCopyDataPageToImagePage
MiCopyToUserVa
MiCreatePfnBitMaps
MiCreatePteCopyList
MiCreateRetpolineBitmap
MiExpandPartitionIds
MiGetPageChain
MiInitNucleus
MiInitSystem
MiInitializeCrashDumpPtes
MiInitializeEnclaveMetadataPage
MiInitializeGapFrames
MiInitializeKernelCfg
MiInitializeMirroring
MiInitializePageFaultResources
MiInitializePteInfo
MiInitializeRetpoline
MiInitializeSystemPtes
MiInitializeTbFlush
MiInsertInSystemSpace
MiLockAndMapEntireDriver
MiMakePageAvoidRead
MiMapContiguousMemory
MiMapDummyPages
MiMapHotPatchImageInSystemSpace
MiMapSinglePage
MiPrivateFixup
MiRelocateImageAgain
MiRelocateImagePfn
MiReservePageHash
MiScrubNodeLargePageList
MiSessionCreateInternal
MiUpdateImagePfnImportRelocations
MiValidateImagePfn
MiZeroInParallelWorker
MiZeroLargePage
MiZeroPhysicalPage
MmAllocateDumpHibernateResources
MmAllocateIndependentPagesEx
MmAllocateMappingAddressEx
MmAllocateNonCachedMemory
MmCopyMemory
MmCopyToCachedPage
MmCreateKernelStack
MmCreateProcessAddressSpace
MmInitializeProcessor
MmMapLockedPagesSpecifyCache
MmMapMdl