HalpAllocPhysicalMemoryInternal
unsigned __int64 __fastcall HalpAllocPhysicalMemoryInternal(__int64 a1, _QWORD *a2, unsigned int a3, char a4){
unsigned __int64 result;
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
__int64 *v9;
__int64 v10;
__int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
__int64 i;
unsigned __int64 v15;
int v16;
unsigned __int64 v17;
unsigned __int64 v18;
__int64 v19;
__int64 *v20;
unsigned __int64 v21;
int v22;
__int64 v23;
__int64 **v24;
__int64 v25;
__int64 *v26;
__int64 v27;
__int64 *v28;
__int64 v29;
__int64 v30;
result = 0i64;
if( HalpUsedAllocDescriptors + 2 <= (unsigned int)HalpAllocationDescriptorArraySize )
{
v6 = -1i64;
v7 = 1i64;
if( a2 )
v6 = *a2 >> 12;
v8 = a3;
if( v6 >= a3 )
{
if( HalpMiscDiscardLowMemory && v6 - a3 >= 0x100 )
v7 = 256i64;
v9 = (__int64 *)(a1 + 32);
v10 = 0i64;
v11 = 0i64;
v12 = 0i64;
v13 = 0i64;
for( i = *v9; ; i = *(_QWORD *)i )
{
if( (__int64 *)i == v9 )
{
LABEL_23:
if( (__int64 *)i == v9 )
return result;
if( !v12
&& v11
&& *(_DWORD *)(v11 + 16) == 26
&& (v19 = *(_QWORD *)(v11 + 32), v19 + *(_QWORD *)(v11 + 24) == *(_QWORD *)(v10 + 24)) )
{
v20 = 0i64;
*(_QWORD *)(v11 + 32) = v19 + v8;
}
else
{
v22 = HalpUsedAllocDescriptors;
v20 = &(*HalpAllocationDescriptorArray)[5 * (unsigned int)HalpUsedAllocDescriptors];
v20[4] = v8;
v23 = *(_QWORD *)(v10 + 24);
*((_DWORD *)v20 + 4) = 26;
v20[3] = v12 + v23;
HalpUsedAllocDescriptors = v22 + 1;
}
v21 = *(_QWORD *)(v10 + 32) - v8;
if( v12 )
{
v27 = v21 - v12;
if( v27 )
{
v28 = &(*HalpAllocationDescriptorArray)[5 * (unsigned int)HalpUsedAllocDescriptors++];
v28[4] = v27;
v28[3] = v12 + v8 + *(_QWORD *)(v10 + 24);
*((_DWORD *)v28 + 4) = *(_DWORD *)(v10 + 16);
v29 = *(_QWORD *)v10;
if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) != v10 )
goto LABEL_49;
*v28 = v29;
v28[1] = v10;
*(_QWORD *)(v29 + 8) = v28;
*(_QWORD *)v10 = v28;
}
*(_QWORD *)(v10 + 32) = v12;
v30 = *(_QWORD *)v10;
if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) == v10 )
{
*v20 = v30;
v20[1] = v10;
*(_QWORD *)(v30 + 8) = v20;
*(_QWORD *)v10 = v20;
goto LABEL_32;
}
}
else
{
*(_QWORD *)(v10 + 24) += v8;
*(_QWORD *)(v10 + 32) = v21;
if( !v20 )
goto LABEL_31;
v24 = *(__int64 ***)(v10 + 8);
if( *v24 == (__int64 *)v10 )
{
*v20 = v10;
v20[1] = (__int64)v24;
*v24 = v20;
*(_QWORD *)(v10 + 8) = v20;
v21 = *(_QWORD *)(v10 + 32);
LABEL_31:
if( v21 )
{
LABEL_32:
HalpMmEarlyPhysicalPagesAllocated += v8;
return v13;
}
v25 = *(_QWORD *)v10;
if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) == v10 )
{
v26 = *(__int64 **)(v10 + 8);
if( *v26 == v10 )
{
*v26 = v25;
*(_QWORD *)(v25 + 8) = v26;
goto LABEL_32;
}
}
}
}
LABEL_49:
__fastfail(3u);
}
v15 = *(_QWORD *)(i + 24);
v11 = v10;
v10 = i;
v16 = *(_DWORD *)(i + 16);
v13 = 0i64;
if( v16 == 5 || v16 == 2 )
{
if( v15 )
break;
}
LABEL_11:
;
}
v17 = v7;
if( v15 >= v7 )
v17 = *(_QWORD *)(i + 24);
if( a4 )
{
if( ((v17 + 15) & 0xFFFFFFFFFFFFFFF0ui64) < v17 )
goto LABEL_21;
v17 = (v17 + 15) & 0xFFFFFFFFFFFFFFF0ui64;
}
v18 = v6;
if( v15 + *(_QWORD *)(i + 32) <= v6 )
v18 = v15 + *(_QWORD *)(i + 32);
if( v17 < v18 && v8 <= v18 - v17 )
v13 = v17 << 12;
LABEL_21:
if( v13 )
{
v12 = (v13 >> 12) - v15;
goto LABEL_23;
}
goto LABEL_11;
}
}
return result;
}Referenced by:
HalpAllocPhysicalMemory