MiInitializeDynamicBitmap
UINT64 __stdcall MiInitializeDynamicBitmap(RTL_BITMAP *BitMap, PVOID BitmapStart, UINT64 NumberOfBits, UINT64 Flags){
char v4;
__int64 v5;
UINT64 v6;
UINT64 PteAddress;
unsigned __int64 v8;
int v9;
INT64 v10;
INT64 v11;
CHAR *AnyMultiplexedVm;
MMPTE *v13;
unsigned __int64 v14;
UINT64 ValidPte;
bool v16;
UINT64 v18;
unsigned __int64 v19;
__int64 v20;
UINT64 v21;
UINT64 v22;
INT64 v23;
bool v24;
_MMPFN *a2;
UINT64 NumberOfPages;
UINT8 v30;
v4 = Flags;
PteAddress = (UINT64)MiGetPteAddress(BitmapStart);
v8 = ((unsigned __int64)(v5 + 7) >> 15) + (((v6 & 0xFFF) + 4095 + (((unsigned __int64)(v5 + 7) >> 3) & 0xFFF)) >> 12);
MiGetSystemRegionType(v6);
if( (v4 & 2) == 0 )
{
LOBYTE(v9) = MiMakeZeroedPageTables((PVOID)PteAddress);
if( !v9 )
return 0i64;
}
a2 = 0i64;
NumberOfPages = 0i64;
if( (v4 & 4) != 0 )
{
v10 = qword_140C4EAC0;
v11 = qword_140C4EB30;
}
else
{
v10 = qword_140C4EAA8;
v11 = qword_140C4EB40;
}
AnyMultiplexedVm = 0i64;
v30 = 17;
v13 = 0i64;
v14 = 0i64;
ValidPte = MiMakeValidPte(PteAddress, v10, ((unsigned __int8)(v4 & 1) << 29) + 1);
if( !v8 )
goto LABEL_11;
v16 = (v4 & 8) != 0;
v24 = v16;
do
{
if( (PteAddress & 0xFFF) != 0 || !v16 || v8 - v14 < 0x200 )
{
*(_QWORD *)PteAddress = ValidPte;
PteAddress += 8i64;
goto LABEL_9;
}
v18 = (UINT64)MiGetPteAddress((PVOID)PteAddress);
if( *(_DWORD *)InitializationPhase )
{
if( !AnyMultiplexedVm )
{
AnyMultiplexedVm = MiGetAnyMultiplexedVm(3i64);
v30 = MiLockWorkingSetShared((INT64)AnyMultiplexedVm);
}
if( !v13 )
goto LABEL_22;
if( (v18 & 0xFFF) == 0 )
{
MiUnlockPageTable((INT64)AnyMultiplexedVm, (UINT64)v13);
LABEL_22:
v13 = MiGetPteAddress((PVOID)v18);
MiLockPageTable((INT64)AnyMultiplexedVm, (UINT64)v13);
}
}
v19 = MI_READ_PTE_LOCK_FREE(v18);
MiTransformValidPteInPlace((volatile INT64 *)v18, v18, v11, 1ui64);
MiSetPfnLink((_QWORD *)MmGetPfnDb() + 6 * ((v19 >> 12) & 0xFFFFFFFFFi64), (INT64)a2);
a2 = (_MMPFN *)v20;
LODWORD(v22) = MiPartitionIdToPointer((*(_QWORD *)(v20 + 40) >> 39) & 0x3FF, v21);
NumberOfPages = v22;
v14 += 511i64;
PteAddress = (__int64)((v18 << 25) - ((_QWORD)MmGetPteBase() << 25) + 0x10000000) >> 16;
LABEL_9:
v16 = v24;
++v14;
}
while( v14 < v8 );
if( AnyMultiplexedVm )
{
if( v13 )
MiUnlockPageTable((INT64)AnyMultiplexedVm, (UINT64)v13);
MiUnlockWorkingSetShared((INT64)AnyMultiplexedVm, v30);
}
LABEL_11:
*(_QWORD *)&BitMap->SizeOfBitMap = NumberOfBits;
BitMap->Buffer = (unsigned int *)BitmapStart;
if( a2 )
{
v23 = MiReturnPfnList(a2);
MiReturnSplitPageCharges(NumberOfPages, v23);
}
return 1i64;
}Referenced by:
MiBuildDynamicRegion
MiCreatePfnBitMaps
MiCreateRetpolineBitmap
MiInitializeMirroring
MiInitializePteInfo
MiInitializeSystemPtes
MiSessionCreate