MiHotAddPartitionMemory
__int64 __fastcall MiHotAddPartitionMemory(unsigned __int64 a1, unsigned __int64 *a2, int *a3){
int updated;
int v8;
unsigned int v9;
unsigned __int64 v10;
unsigned __int64 v11;
unsigned int v12;
unsigned __int64 v13;
unsigned __int64 v14;
int v15;
_QWORD *v16;
int v17;
_QWORD *i;
_QWORD **v19;
__int64 v20;
_QWORD *v21;
_QWORD *v22;
int v23;
__int128 v24;
__int128 v25;
__int128 v26;
__int128 v27;
__int128 v28;
__int64 v29;
int v30;
_QWORD *v31;
v31 = 0i64;
v29 = 0i64;
v24 = 0i64;
v25 = 0i64;
v26 = 0i64;
v27 = 0i64;
v28 = 0i64;
if( (ULONG_PTR *)a1 == &MiSystemPartition && (*a3 & 4) == 0 )
{
updated = -1073741637;
LABEL_4:
MiFreePartitionTree(a1, (unsigned __int64 *)&v31, 0, 0);
return(unsigned int)updated;
}
if( *((_BYTE *)KeGetCurrentThread() + 562) )
{
updated = -1073741727;
goto LABEL_4;
}
*((_QWORD *)a3 + 1) = 0i64;
v8 = *a3;
v9 = a3[1];
if( (*a3 & 1) != 0 )
{
v30 = 1;
}
else
{
if( (*(_DWORD *)(a1 + 4) & 0x40) != 0 || (v8 & 4) != 0 )
{
updated = -1073741584;
goto LABEL_4;
}
v30 = 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 || (*a3 & 4) != 0 && ((v13 & 0x3FFFF) != 0 || (v14 & 0x3FFFF) != 0) )
break;
v11 += v14;
if( !MiAddRangeToPartitionTree((unsigned __int64 *)&v31, v13, v14, 0) )
{
updated = -1073741670;
goto LABEL_4;
}
++v12;
a2 += 2;
if( v12 >= v9 )
{
v8 = *a3;
goto LABEL_24;
}
}
updated = -1073741811;
goto LABEL_4;
}
LABEL_24:
if( (v8 & 4) != 0 )
{
BYTE2(v27) = 1;
if( (v8 & 2) != 0 )
BYTE3(v27) = 1;
}
else
{
updated = MiUpdatePartitionLargePfnBitMap(a1, &v31);
if( updated < 0 )
goto LABEL_4;
}
updated = 0;
v15 = DWORD2(v25);
if( (*(_DWORD *)(a1 + 4) & 0x40) != 0 )
{
v15 = DWORD2(v25) | 8;
BYTE1(v27) = 1;
DWORD2(v25) |= 8u;
}
if( v30 )
{
v16 = v31;
v17 = 0;
i = 0i64;
*(_QWORD *)&v26 = a1;
while( v16 )
{
i = v16;
v16 = (_QWORD *)*v16;
}
while( i )
{
v19 = (_QWORD **)i[1];
v20 = (__int64)i;
v21 = i;
if( v19 )
{
v22 = *v19;
for( i = (_QWORD *)i[1]; v22; v22 = (_QWORD *)*v22 )
i = v22;
}
else
{
while( 1 )
{
i = (_QWORD *)(i[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !i || (_QWORD *)*i == v21 )
break;
v21 = i;
}
}
if( v17 == 1 )
{
RtlAvlRemoveNode((unsigned __int64 *)&v31, (__int64 *)v20);
ExFreePoolWithTag(*(PVOID *)(v20 + 40), 0);
ExFreePoolWithTag((PVOID)v20, 0);
}
else
{
MiActOnPartitionNodePages(v20, 9u, (__int16 **)&v26);
if( (SDWORD1(v27) & 0x80000000) != 0 )
{
updated = DWORD1(v27);
v17 = 1;
if( RtlAreBitsClearEx(v20 + 32, 0i64, 0x40000ui64) )
i = (_QWORD *)v20;
}
}
}
v11 = *((_QWORD *)&v28 + 1);
if( !*((_QWORD *)&v28 + 1) )
goto LABEL_4;
}
else
{
v15 |= 2u;
DWORD2(v25) = v15;
}
v23 = *a3;
if( (*a3 & 2) == 0 )
DWORD2(v25) = v15 | 1;
*(_QWORD *)&v24 = &v31;
if( (v23 & 4) != 0 )
MiFreePartitionTree(a1, (unsigned __int64 *)&v31, 0, 0);
else
MiInsertPartitionPages((unsigned __int64)&MiSystemPartition, a1, (__int64)&v24, v11, 0i64);
*((_QWORD *)a3 + 1) = v11;
return(unsigned int)updated;
}Referenced by:
MmManagePartitionInitialAddMemory