MiHotAddPartitionMemory
NTSTATUS __fastcall MiHotAddPartitionMemory(_MI_PARTITION *ToPartition, UINT64 *a2, INT64 *a3){
int updated;
int v8;
unsigned int v9;
UINT64 v10;
unsigned __int64 v11;
unsigned int v12;
UINT64 v13;
UINT64 v14;
int v15;
int v16;
_RTL_BALANCED_NODE *Root;
int v18;
_RTL_BITMAP_EX *v19;
unsigned __int64 *Buffer;
_RTL_BITMAP_EX *v21;
_RTL_BITMAP_EX *v22;
_RTL_BITMAP_EX *v23;
char v24;
int v25;
_MI_INSERT_PAGES InsertInfo[4];
__int128 v27;
__int128 v28;
__int128 v29;
__int128 v30;
__int64 v31;
int v32;
_RTL_AVL_TREE PageRoot;
PageRoot.Root = 0i64;
v31 = 0i64;
*(_OWORD *)InsertInfo = 0i64;
v27 = 0i64;
v28 = 0i64;
v29 = 0i64;
v30 = 0i64;
if( ToPartition == &Irp && (*(_DWORD *)a3 & 4) == 0 )
{
updated = -1073741637;
LABEL_4:
MiFreePartitionTree(ToPartition, &PageRoot, 0i64);
return updated;
}
if( KeGetCurrentThread()->PreviousMode )
{
updated = -1073741727;
goto LABEL_4;
}
a3[1] = 0i64;
v8 = *(_DWORD *)a3;
v9 = *((_DWORD *)a3 + 1);
if( (*(_DWORD *)a3 & 1) != 0 )
{
v32 = 1;
}
else
{
if( (ToPartition->Core.u.LongFlags & 0x40) != 0 || (v8 & 4) != 0 )
{
updated = -1073741584;
goto LABEL_4;
}
v32 = 0;
}
v10 = 0i64;
v11 = 0i64;
v12 = 0;
if( v9 )
{
while( 1 )
{
v13 = *a2;
if( *a2 < v10 )
break;
v14 = a2[1];
v10 = v14 + v13;
if( v14 + v13 <= v13
|| v14 + v11 <= v11
|| (*(_DWORD *)a3 & 4) != 0 && ((v13 & 0x3FFFF) != 0 || (v14 & 0x3FFFF) != 0) )
{
break;
}
v11 += v14;
MiAddRangeToPartitionTree(&PageRoot, v13, v14, 0i64);
if( !v15 )
{
updated = -1073741670;
goto LABEL_4;
}
++v12;
a2 += 2;
if( v12 >= v9 )
{
v8 = *(_DWORD *)a3;
goto LABEL_24;
}
}
updated = -1073741811;
goto LABEL_4;
}
LABEL_24:
if( (v8 & 4) != 0 )
{
BYTE2(v29) = 1;
if( (v8 & 2) != 0 )
BYTE3(v29) = 1;
}
else
{
updated = MiUpdatePartitionLargePfnBitMap(ToPartition, &PageRoot);
if( updated < 0 )
goto LABEL_4;
}
updated = 0;
v16 = DWORD2(v27);
if( (ToPartition->Core.u.LongFlags & 0x40) != 0 )
{
v16 = DWORD2(v27) | 8;
BYTE1(v29) = 1;
DWORD2(v27) |= 8u;
}
if( v32 )
{
Root = PageRoot.Root;
v18 = 0;
v19 = 0i64;
*(_QWORD *)&v28 = ToPartition;
while( Root )
{
v19 = (_RTL_BITMAP_EX *)Root;
Root = Root->Children[0];
}
while( v19 )
{
Buffer = v19->Buffer;
v21 = v19;
v22 = v19;
if( Buffer )
{
v23 = (_RTL_BITMAP_EX *)*Buffer;
v19 = (_RTL_BITMAP_EX *)v19->Buffer;
if( *Buffer )
{
do
{
v19 = v23;
v23 = (_RTL_BITMAP_EX *)v23->SizeOfBitMap;
}
while( v23 );
}
}
else
{
while( 1 )
{
v19 = (_RTL_BITMAP_EX *)(v19[1].SizeOfBitMap & 0xFFFFFFFFFFFFFFFCui64);
if( !v19 || (_RTL_BITMAP_EX *)v19->SizeOfBitMap == v22 )
break;
v22 = v19;
}
}
if( v18 == 1 )
{
RtlAvlRemoveNode((UINT64 *)&PageRoot, (INT64 *)v21);
ExFreePoolWithTag(v21[2].Buffer, 0);
ExFreePoolWithTag(v21, 0);
}
else
{
MiActOnPartitionNodePages((__int64)v21, 9u, (_RTL_AVL_TREE **)&v28);
if( (SDWORD1(v29) & 0x80000000) != 0 )
{
updated = DWORD1(v29);
RtlAreBitsClearEx(v21 + 2, 0i64, 0x40000ui64);
v18 = 1;
if( v24 == 1 )
v19 = v21;
}
}
}
v11 = *((_QWORD *)&v30 + 1);
if( !*((_QWORD *)&v30 + 1) )
goto LABEL_4;
}
else
{
v16 |= 2u;
DWORD2(v27) = v16;
}
v25 = *(_DWORD *)a3;
if( (*(_DWORD *)a3 & 2) == 0 )
DWORD2(v27) = v16 | 1;
*(_QWORD *)InsertInfo = &PageRoot;
if( (v25 & 4) != 0 )
MiFreePartitionTree(ToPartition, &PageRoot, 0i64);
else
MiInsertPartitionPages(&Irp, ToPartition, InsertInfo);
a3[1] = v11;
return updated;
}Referenced by:
MmManagePartitionInitialAddMemory