MiCreatePfnBitMaps
VOID __stdcall MiCreatePfnBitMaps(){
_DWORD *v0;
__int64 v1;
unsigned int v2;
__int64 *v3;
unsigned int v4;
_DWORD *v5;
__int64 v6;
_MMPTE *PteBase;
unsigned __int64 v8;
RTL_BITMAP *v9;
unsigned __int64 v10;
INT64 v11;
__int64 v12;
INT64 v13;
INT64 v14;
__int64 v15;
INT64 v16;
INT64 v17;
INT64 v18;
INT64 v19;
__int64 v20;
int v21;
UINT64 v22;
INT64 v23;
__int64 v24[9];
unsigned __int64 NumberOfBits;
INT64 v26;
v2 = 0;
v3 = MiLargePageSizes;
v4 = 0;
v5 = v0;
v6 = v1;
do
{
PteBase = MmGetPteBase();
if( v4 >= 2 )
{
v8 = 512i64;
v9 = (RTL_BITMAP *)(v6 + 6144);
if( (ULONG_PTR *)v6 != &MiSystemPartition )
{
*(_QWORD *)&v9->SizeOfBitMap = 0i64;
*(_QWORD *)(v6 + 6152) = 0i64;
v12 = (_QWORD)PteBase << 25;
goto LABEL_7;
}
}
else
{
v8 = *v3;
v9 = (RTL_BITMAP *)(16i64 * v4 + v6 + 5064);
}
NumberOfBits = 0x1000000000i64 / v8 + (0x1000000000i64 % v8 != 0);
v10 = (((NumberOfBits + 7) >> 3) + 4095) >> 12;
v11 = MiReservePtes((INT64)&qword_140C4EC80, (unsigned int)v10);
v26 = v11;
if( !v11 )
goto LABEL_30;
v12 = (_QWORD)PteBase << 25;
if( !(unsigned int)MiInitializeDynamicBitmap(v9, (PVOID)(((v11 << 25) - v12) >> 16), NumberOfBits, 4ui64) )
{
v23 = v26;
v22 = (unsigned int)v10;
LABEL_29:
MiReleasePtes((INT64)&qword_140C4EC80, v23, v22);
LABEL_30:
MiDeletePfnBitMaps((UINT64 *)v6);
return;
}
*(_QWORD *)&v9->SizeOfBitMap = 0i64;
LABEL_7:
++v4;
++v3;
}
while( v4 < 3 );
v13 = MiReservePtes((INT64)&qword_140C4EC80, 0x8000ui64);
v14 = v13;
if( !v13 )
goto LABEL_30;
v15 = ((v13 << 25) - v12) >> 16;
if( !(unsigned int)MiInitializeDynamicBitmap((RTL_BITMAP *)v24, (PVOID)v15, 0x40000000ui64, 4ui64) )
{
v22 = 0x8000i64;
v23 = v14;
goto LABEL_29;
}
*(_QWORD *)(v6 + 5104) = v15;
v16 = MiReservePtes((INT64)&qword_140C4EC80, 8ui64);
v17 = v16;
if( !v16 )
goto LABEL_30;
if( !(unsigned int)MiInitializeDynamicBitmap(
(RTL_BITMAP *)(v6 + 5112),
(PVOID)(((v16 << 25) - v12) >> 16),
0x40000ui64,
4ui64) )
{
v22 = 8i64;
v23 = v17;
goto LABEL_29;
}
*(_QWORD *)(v6 + 5112) = 0i64;
v18 = MiReservePtes((INT64)&qword_140C4EC80, 0x80ui64);
v19 = v18;
if( !v18 )
goto LABEL_30;
v20 = ((v18 << 25) - v12) >> 16;
if( !(unsigned int)MiInitializeDynamicBitmap((RTL_BITMAP *)v24, (PVOID)v20, 0x400000ui64, 4ui64) )
{
v22 = 128i64;
v23 = v19;
goto LABEL_29;
}
*(_QWORD *)(v6 + 5128) = v20;
if( v5 && (v21 = 0, *v5) )
{
while( (unsigned int)MiSplitPfnBitMaps((UINT64 *)v6, *(_QWORD *)&v5[4 * v21 + 4], *(_QWORD *)&v5[4 * v21 + 6]) )
{
if( (unsigned int)++v21 >= *v5 )
goto LABEL_18;
}
}
else
{
LABEL_18:
*(_BYTE *)(v6 + 4830) = 1;
if( v5 && KeNumberNodes )
{
do
{
MiInitializeRebuildCandidateCounts(v2, 2ui64);
MiInitializeRebuildCandidateCounts(v2++, 1ui64);
}
while( v2 < (unsigned __int16)KeNumberNodes );
}
}
}Referenced by:
MiInitNucleus