MiExpandPartitionIds

VOID __fastcall MiExpandPartitionIds(){
  unsigned int v0; 
  __int64 v1; 
  __int64 v2; 
  __int64 v3; 
  INT64 v4; 
  __int64 v5; 
  MMPTE *PteAddress; 
  int v7; 
  unsigned __int64 SizeOfBitMap; 
  v0 = 512;
  if( (__int64 *)qword_140C4E388 != &qword_140C4E380 )
    v0 = qword_140C4E368->SizeOfBitMap + 512;
  if( v0 <= qword_140C4E368->SizeOfBitMap || v0 > 0x400 )
  {
    v2 = 0i64;
    v3 = 0i64;
  }
  else
  {
    LODWORD(v1) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
    v2 = 0i64;
    v3 = v1;
    if( !v1 )
      return;
    *(_DWORD *)v1 = v0;
    *(_QWORD *)(v1 + 8) = v1 + 16;
  }
  if( v3 )
  {
    if( (__int64 *)qword_140C4E388 == &qword_140C4E380 )
    {
      v4 = MiReservePtes((INT64)&qword_140C4EC80, 2ui64);
      if( !v4 )
        goto LABEL_18;
      v5 = ((v4 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
      if( !v5 )
        goto LABEL_18;
    }
    else
    {
      v5 = qword_140C4E388 + 8i64 * qword_140C4E368->SizeOfBitMap;
    }
    PteAddress = MiGetPteAddress((PVOID)v5);
    LOBYTE(v7) = MiMakeZeroedPageTables(PteAddress);
    if( v7 )
    {
      memset(v5, 0i64);
      if( (__int64 *)qword_140C4E388 == &qword_140C4E380 )
      {
        *(_QWORD *)v5 = *(_QWORD *)qword_140C4E388;
        qword_140C4E388 = v5;
      }
      RtlClearAllBits((RTL_BITMAP *)v3);
      SizeOfBitMap = qword_140C4E368->SizeOfBitMap;
      LOBYTE(v2) = (SizeOfBitMap & 0x3F) != 0;
      memmove(*(UINT8 **)(v3 + 8), (UINT8 *)qword_140C4E368->Buffer, 8 * ((SizeOfBitMap >> 6) + v2));
      if( qword_140C4E368 != (PRTL_BITMAP)&dword_140C4E370 )
        ExFreePoolWithTag(qword_140C4E368, 0);
      qword_140C4E368 = (PRTL_BITMAP)v3;
      return;
    }
    if( (__int64 *)qword_140C4E388 == &qword_140C4E380 )
      MiReleasePtes((INT64)&qword_140C4EC80, (INT64)PteAddress, 1ui64);
LABEL_18:
    ExFreePoolWithTag((PVOID)v3, 0);
  }
}

Referenced by:

MiAllocatePartitionId