MiAllocatePartitionPhysicalPages
INT64 __stdcall MiAllocatePartitionPhysicalPages(
_MI_PARTITION *Partition,
_MI_PARTITION *ToPartition,
INT64 NumberOfPages,
INT64 RequiredNode,
INT64 Flags,
INT64 a6){
int v6;
_MI_PARTITION *v7;
unsigned int IdealNode;
INT64 v9;
INT64 HugeRangeFromNode;
unsigned __int64 v11;
int v12;
int v13;
int v14;
int v15;
unsigned __int64 v17;
BOOL v18;
unsigned int v19;
unsigned int v20;
unsigned int v21;
unsigned int v22;
__int64 v23;
BOOL IsZeroed;
unsigned int v25;
_MMPFN *LargeNodePage;
unsigned __int64 v27;
__int64 v28;
unsigned __int64 v29;
int updated;
UINT64 v31;
char v32;
_LARGE_INTEGER v33;
int v34;
unsigned int v35;
unsigned __int64 v36;
unsigned __int64 v37;
_MDL *PagesForMdl;
MDL *v39;
int v40;
_MI_PARTITION *v41;
__int32 v42;
UINT64 PfnState;
UINT64 v44;
_MI_PARTITION *a1;
int v46;
int v47;
LONG SpinLock[2];
__int64 v49;
unsigned __int64 v50;
unsigned int v51;
unsigned __int64 v52;
__m256i v53;
UINT64 LargePageIndex;
_MI_PARTITION *v55;
INT64 v56;
int v57;
v56 = NumberOfPages;
v55 = ToPartition;
v6 = *((_DWORD *)ToPartition + 1);
v7 = (_MI_PARTITION *)&MiSystemPartition;
IdealNode = RequiredNode;
v51 = RequiredNode;
v9 = NumberOfPages;
*(_QWORD *)SpinLock = 0i64;
HugeRangeFromNode = 0i64;
v49 = 0i64;
if( Partition )
v7 = Partition;
v11 = 0i64;
a1 = v7;
v47 = Flags & 4;
v12 = ((v6 & 0x40) == 0) | 0x100000;
v13 = v12 | 0x8000;
*(_OWORD *)v53.m256i_i8 = 0i64;
if( (Flags & 4) == 0 )
v13 = v12;
v14 = v13 | 0x4000;
*(_OWORD *)&v53.m256i_u64[2] = 0i64;
if( (Flags & 0x12) != 0 )
v14 = v13;
v15 = Flags & 0x200;
v57 = v15;
v46 = v14;
if( (Flags & 0x200) == 0 )
{
if( (MiAcquireNonPagedResources(v7, NumberOfPages) & 0x80000000) != 0i64 )
return 3221225626i64;
v7 = a1;
v9 = v56;
}
v50 = 0x40000i64;
while( 1 )
{
v17 = v9 - v11;
v52 = v9 - v11;
if( v9 - v11 < 0x200 )
goto LABEL_39;
v18 = 1;
if( (Flags & 0x60) == 0 )
v18 = v17 < 0x40000;
HugeRangeFromNode &= 0xFFFFFFFFFFFC0000ui64;
LODWORD(LargePageIndex) = v18;
v19 = 0;
if( v15 )
{
v20 = 0;
if( KeNumberNodes )
{
do
{
HugeRangeFromNode = MiGetHugeRangeFromNode(a1, v20, (v14 & 1) == 0);
if( (HugeRangeFromNode & 0x3FFFF) != 0 || (Flags & 1) == 0 )
break;
v21 = v20 + 1;
v22 = 0;
if( v21 != (unsigned __int16)KeNumberNodes )
v22 = v21;
v20 = v22 + 1;
}
while( v20 < (unsigned __int16)KeNumberNodes );
IdealNode = v51;
v17 = v52;
v9 = v56;
}
if( (HugeRangeFromNode & 0x3FFFF) == 0 )
goto LABEL_38;
v23 = (unsigned __int64)(HugeRangeFromNode & 0x3FFFF) << 18;
LODWORD(LargePageIndex) = 0;
IsZeroed = MiHugeRangeIsZeroed(HugeRangeFromNode);
v19 = v25;
LOBYTE(v19) = IsZeroed;
}
else
{
LODWORD(PfnState) = v14;
LargeNodePage = MiFindLargeNodePage(v7, IdealNode, &LargePageIndex, 1ui64, PfnState);
if( !LargeNodePage )
{
v9 = v56;
goto LABEL_39;
}
v23 = (LargeNodePage - MmGetPfnDb()) / 48;
if( (*((_DWORD *)LargeNodePage + 4) & 0x3E0i64) != 0 )
{
if( (v14 & 1) != 0 )
goto LABEL_30;
MiZeroLargePage((INT64)LargeNodePage, (unsigned int)LargePageIndex, 1i64);
}
v19 = 1;
}
LABEL_30:
v27 = MiLargePageSizes[(unsigned int)LargePageIndex];
if( !MiAddRangeToPartitionTree((unsigned __int64 *)SpinLock, v23, v27, v19) )
break;
v7 = a1;
v15 = v57;
if( a1 == (_MI_PARTITION *)&MiSystemPartition && !v57 )
_InterlockedExchangeAdd64(&qword_140C4ECF8, v27);
v9 = v56;
v11 += v27;
if( v11 == v56 )
goto LABEL_48;
v14 = v46;
}
if( v57 )
{
MiInsertHugeRangeInList(HugeRangeFromNode, v19, 0i64);
v9 = v56;
LABEL_38:
v15 = v57;
LABEL_39:
v28 = v49;
goto LABEL_40;
}
v31 = MiFreeMdlPageRun(v23, v27, v19);
v9 = v56;
v28 = v31;
v15 = v57;
LABEL_40:
if( v11 == v9 )
{
v7 = a1;
}
else
{
v29 = (unsigned __int64)a1;
if( v15 || (MiReleaseNonPagedResources(a1, v17 - v28), (Flags & 0xA2) != 0) || v28 )
{
updated = -1073741670;
goto LABEL_74;
}
v9 = v56;
v7 = a1;
}
LABEL_48:
v32 = Flags;
v33.QuadPart = 0i64;
v34 = v46 & 1 | 2;
if( (Flags & 1) != 0 )
v34 = v46 & 1;
v35 = v34 | 0x10;
if( (Flags & 0x10) != 0 )
{
v35 |= 0x40u;
v33.QuadPart = 0x200000i64;
v36 = 0x40000i64;
}
else
{
if( (Flags & 0x40) != 0 )
{
v35 |= 0x40u;
v36 = 512i64;
v33.QuadPart = 0x200000i64;
}
else if( (Flags & 0x100) != 0 )
{
v35 |= 0x40u;
v36 = 0x40000i64;
v33.QuadPart = 0x40000000i64;
}
else
{
v36 = 1048574i64;
}
v50 = v36;
}
if( v11 == v9 )
{
LABEL_71:
v40 = v57;
v41 = v55;
if( !v57 )
{
updated = MiUpdatePartitionLargePfnBitMap((__int64)v55, (_QWORD **)SpinLock);
if( updated < 0 )
goto LABEL_73;
}
v53.m256i_i64[0] = (__int64)SpinLock;
v42 = 3;
*(_OWORD *)&v53.m256i_u64[1] = 0i64;
if( (v32 & 8) != 0 )
v42 = 7;
v53.m256i_i32[6] = v42;
if( v40 )
v53.m256i_i32[6] = v42 | 0x10;
return(unsigned int)MiInsertPartitionPages(
(unsigned __int64)a1,
(unsigned __int64)v41,
(__int64)&v53,
v11,
(unsigned int)a6);
}
while( 2 )
{
v37 = v36;
LODWORD(v44) = v35;
if( v9 - v11 <= v36 )
v37 = v9 - v11;
PagesForMdl = MiAllocatePagesForMdl(
v7,
(_LARGE_INTEGER)(-(__int64)(v47 != 0) & 0x100000000i64),
(_LARGE_INTEGER)-1i64,
v33,
v37 << 12,
MiCached,
IdealNode,
v44);
v39 = PagesForMdl;
if( !PagesForMdl )
{
if( (v35 & 0x40) == 0 )
goto LABEL_70;
v35 = v35 & 0xFFFFFF9F | 0x20;
goto LABEL_67;
}
if( (unsigned int)MiAddMdlToPartitionTree(SpinLock, (INT64)PagesForMdl) )
{
v11 += (unsigned __int64)v39->ByteCount >> 12;
ExFreePoolWithTag(v39, 0);
LABEL_67:
v9 = v56;
if( v11 == v56 )
goto LABEL_71;
v7 = a1;
v36 = v50;
continue;
}
break;
}
MiFreePagesFromMdl(v39, 0i64);
ExFreePoolWithTag(v39, 0);
LABEL_70:
updated = -1073741670;
LABEL_73:
v29 = (unsigned __int64)a1;
LABEL_74:
MiFreePartitionTree(v29, (unsigned __int64 *)SpinLock, 1, 1);
return(unsigned int)updated;
}Referenced by:
MiReleasePartitionHugeIoSpace
MmManagePartitionMoveMemory