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