MiCreatePfnBitMaps
VOID __stdcall MiCreatePfnBitMaps(){
_DWORD *v0;
_MI_PARTITION *v1;
unsigned int v2;
__int64 *v3;
unsigned int v4;
_DWORD *v5;
_MI_PARTITION *v6;
_MMPTE *PteBase;
unsigned __int64 v8;
_RTL_BITMAP_EX *p_SlabPfnBitMap;
unsigned __int64 v10;
_MMPTE *v11;
__int64 v12;
_KTBFLUSH_TYPE v13;
_MMPTE *v14;
_MMPTE *v15;
__int64 v16;
_MMPTE *v17;
_MMPTE *v18;
_MMPTE *v19;
_MMPTE *v20;
__int64 v21;
int v22;
UINT64 v23;
_MMPTE *v24;
_RTL_BITMAP_EX BitMap;
unsigned __int64 NumberOfBits;
_MMPTE *PointerPte;
v2 = 0;
v3 = MiLargePageSizes;
v4 = 0;
v5 = v0;
v6 = v1;
do
{
PteBase = MmGetPteBase();
if( v4 >= 2 )
{
v8 = 512i64;
p_SlabPfnBitMap = &v6->PageLists.SlabPfnBitMap;
if( v6 != &Irp )
{
p_SlabPfnBitMap->SizeOfBitMap = 0i64;
v6->PageLists.SlabPfnBitMap.Buffer = 0i64;
v12 = (_QWORD)PteBase << 25;
goto LABEL_7;
}
}
else
{
v8 = *v3;
p_SlabPfnBitMap = &v6->PageLists.LargePfnBitMap[v4];
}
NumberOfBits = 0x1000000000i64 / v8 + (0x1000000000i64 % v8 != 0);
v10 = (((NumberOfBits + 7) >> 3) + 4095) >> 12;
v11 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (unsigned int)v10);
PointerPte = v11;
if( !v11 )
goto LABEL_30;
v12 = (_QWORD)PteBase << 25;
if( !MiInitializeDynamicBitmap(p_SlabPfnBitMap, (VOID *)((((_QWORD)v11 << 25) - v12) >> 16), NumberOfBits, 4ui64) )
{
v24 = PointerPte;
v23 = (unsigned int)v10;
LABEL_29:
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v24, v23, v13);
LABEL_30:
MiDeletePfnBitMaps((UINT64 *)&v6->Core.PartitionId);
return;
}
p_SlabPfnBitMap->SizeOfBitMap = 0i64;
LABEL_7:
++v4;
++v3;
}
while( v4 < 3 );
v14 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 0x8000ui64);
v15 = v14;
if( !v14 )
goto LABEL_30;
v16 = (((_QWORD)v14 << 25) - v12) >> 16;
if( !MiInitializeDynamicBitmap(&BitMap, (VOID *)v16, 0x40000000ui64, 4ui64) )
{
v23 = 0x8000i64;
v24 = v15;
goto LABEL_29;
}
v6->PageLists.MediumPagesOnFreeZeroList = (unsigned __int8 *)v16;
v17 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 8ui64);
v18 = v17;
if( !v17 )
goto LABEL_30;
if( !MiInitializeDynamicBitmap(
&v6->PageLists.LargePageRebuildCandidates,
(VOID *)((((_QWORD)v17 << 25) - v12) >> 16),
0x40000ui64,
4ui64) )
{
v23 = 8i64;
v24 = v18;
goto LABEL_29;
}
v6->PageLists.LargePageRebuildCandidates.SizeOfBitMap = 0i64;
v19 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 0x80ui64);
v20 = v19;
if( !v19 )
goto LABEL_30;
v21 = (((_QWORD)v19 << 25) - v12) >> 16;
if( !MiInitializeDynamicBitmap(&BitMap, (VOID *)v21, 0x400000ui64, 4ui64) )
{
v23 = 128i64;
v24 = v20;
goto LABEL_29;
}
v6->PageLists.LargePagesOnFreeZeroList = (wchar_t *)v21;
if( v5 && (v22 = 0, *v5) )
{
while( MiSplitPfnBitMaps((UINT64 *)&v6->Core.PartitionId, *(_QWORD *)&v5[4 * v22 + 4], *(_QWORD *)&v5[4 * v22 + 6]) )
{
if( (unsigned int)++v22 >= *v5 )
goto LABEL_18;
}
}
else
{
LABEL_18:
v6->PageLists.PfnBitMapsReady = 1;
if( v5 && KeNumberNodes )
{
do
{
MiInitializeRebuildCandidateCounts(v2, 2u);
MiInitializeRebuildCandidateCounts(v2++, 1u);
}
while( v2 < (unsigned __int16)KeNumberNodes );
}
}
}Referenced by:
MiInitNucleus