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