MiInitializeDynamicBitmap
NTSTATUS __stdcall MiInitializeDynamicBitmap(
_RTL_BITMAP_EX *BitMap,
VOID *BitmapStart,
UINT64 NumberOfBits,
UINT64 Flags){
char v4;
__int64 v5;
UINT64 v6;
UINT64 PteAddress;
unsigned __int64 v8;
NTSTATUS SystemRegionType;
_MI_SYSTEM_VA_TYPE v10;
INT64 v11;
INT64 v12;
unsigned __int64 v13;
_MMSUPPORT_INSTANCE *AnyMultiplexedVm;
_MMPTE *v15;
unsigned __int64 v16;
unsigned __int64 v17;
bool v18;
unsigned __int64 v19;
int v20;
UINT64 v21;
VOID *v23;
UINT64 v24;
UINT64 v25;
unsigned __int64 PteShadow;
int v27;
_MMPFN *v28;
unsigned __int64 EntireField;
UINT64 v30;
UINT64 v31;
char v32;
bool v33;
UINT64 v34;
_MMPFN *PfnList;
UINT64 NumberOfPages;
char WsIrql;
v34 = 0i64;
v4 = Flags;
PteAddress = (UINT64)MiGetPteAddress(BitmapStart);
v8 = ((unsigned __int64)(v5 + 7) >> 15) + (((v6 & 0xFFF) + 4095 + (((unsigned __int64)(v5 + 7) >> 3) & 0xFFF)) >> 12);
SystemRegionType = MiGetSystemRegionType(v6);
v10 = MiVaSessionSpace;
if( SystemRegionType != 1 )
v10 = MiVaSystemPtes;
if( (v4 & 2) == 0 && !MiMakeZeroedPageTables((_MMPTE *)PteAddress, (_MMPTE *)(PteAddress + 8 * (v8 - 1)), 1ui64, v10) )
return 0;
PfnList = 0i64;
NumberOfPages = 0i64;
if( (v4 & 4) != 0 )
{
v11 = *(&stru_140C4DB30 + 498);
v12 = *(&stru_140C4DB30 + 512);
}
else
{
v11 = *(&stru_140C4DB30 + 495);
v12 = *(&stru_140C4DB30 + 514);
}
LODWORD(v13) = MiMakeValidPte((_XSTATE_CONFIGURATION *)PteAddress, v11, ((unsigned __int8)(v4 & 1) << 29) + 1);
AnyMultiplexedVm = 0i64;
WsIrql = 17;
v15 = 0i64;
v16 = 0i64;
v17 = v13;
if( !v8 )
goto LABEL_14;
v18 = (v4 & 8) != 0;
v33 = v18;
do
{
if( (PteAddress & 0xFFF) == 0 && v18 && v8 - v16 >= 0x200 )
{
v24 = (UINT64)MiGetPteAddress((VOID *)PteAddress);
if( (_DWORD)InitializationPhase )
{
if( !AnyMultiplexedVm )
{
AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemPtes, v23);
MiLockWorkingSetShared();
WsIrql = v32;
}
if( v15 )
{
if( (v24 & 0xFFF) != 0 )
goto LABEL_23;
MiUnlockPageTable((INT64)AnyMultiplexedVm, (UINT64)v15);
}
v15 = MiGetPteAddress((VOID *)v24);
MiLockPageTable((INT64)AnyMultiplexedVm, (UINT64)v15);
}
LABEL_23:
LODWORD(v25) = MI_READ_PTE_LOCK_FREE(v24);
v34 = v25;
PteShadow = v25;
MiTransformValidPteInPlace((INT64 *)v24, v24, v12, 1ui64);
LOBYTE(v27) = MiPteInShadowRange((UINT64)&v34);
if( v27 )
PteShadow = MiReadPteShadow((__int64)&v34, PteShadow);
MiSetPfnLink(
&MmGetPfnDb()[(PteShadow >> 12) & 0xFFFFFFFFFi64].u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0,
(__int64)PfnList);
EntireField = v28->u4.EntireField;
PfnList = v28;
LODWORD(v31) = MiPartitionIdToPointer((EntireField >> 39) & 0x3FF, v30);
NumberOfPages = v31;
v16 += 511i64;
PteAddress = (__int64)((v24 << 25) - ((_QWORD)MmGetPteBase() << 25) + 0x10000000) >> 16;
goto LABEL_12;
}
v19 = v17;
LOBYTE(v20) = MiPteInShadowRange(PteAddress);
if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
v19 = v17 | 0x8000000000000000ui64;
*(_QWORD *)PteAddress = v19;
PteAddress += 8i64;
LABEL_12:
v18 = v33;
++v16;
}
while( v16 < v8 );
if( AnyMultiplexedVm )
{
if( v15 )
MiUnlockPageTable((INT64)AnyMultiplexedVm, (UINT64)v15);
LOBYTE(v21) = WsIrql;
MiUnlockWorkingSetShared(AnyMultiplexedVm, v21);
}
LABEL_14:
BitMap->SizeOfBitMap = NumberOfBits;
BitMap->Buffer = (unsigned __int64 *)BitmapStart;
if( PfnList )
{
MiReturnPfnList(PfnList);
MiReturnSplitPageCharges(NumberOfPages);
}
return 1;
}Referenced by:
MiBuildDynamicRegion
MiCreatePfnBitMaps
MiCreateRetpolineBitmap
MiInitializeMirroring
MiInitializePteInfo
MiInitializeSystemPtes
MiSessionCreate