RtlpHpEnvAllocVA
NTSTATUS __stdcall RtlpHpEnvAllocVA(
INT64 *a1,
INT64 *a2,
UINT64 a3,
INT64 a4,
UINT64 a5,
INT64 a6,
INT64 a7,
INT64 a8,
INT64 a9){
INT64 v9;
UINT64 v10;
int v13;
int v14;
unsigned int v15;
CHAR v16;
int v17;
INT64 v19;
INT64 v20;
NTSTATUS v21;
NTSTATUS v22;
UINT64 v23[2];
INT64 v24;
UINT64 v25;
v9 = *a2;
v10 = 1i64;
if( a3 )
v10 = a3;
v13 = 2;
if( (a4 & 0x20001000) != 536875008 )
v13 = a7;
if( ((_DWORD)a9 + 1) & 0x2000 | a4 & 0x2000 )
{
v9 = v9 - ((v9 - 1) & 0x1FFFFF) + 0x1FFFFF;
v25 = v9;
if( v10 > 0x200000 )
v25 = v10 + v9;
}
else
{
v25 = *a2;
}
if( v13 )
{
v14 = 512;
}
else
{
v14 = 33;
if( (_DWORD)a6 == 1 )
v14 = 1;
}
if( (a5 & 0x60) != 0 && v14 == 512 )
LOBYTE(v14) = 0;
v24 = *a1;
v15 = (a9 + 1) & 0xFFFBFFFF | a4 & 0xFFEBFFFF;
v16 = v14;
if( !(((_DWORD)a9 + 1) & 0x40000 | a4 & 0x40000) )
v15 = (a9 + 1) | a4 & 0xFFEFFFFF;
if( !(((_DWORD)a9 + 1) & 0x40000 | a4 & 0x40000) )
v16 = v14;
v17 = MmAllocatePoolMemory(&v24, &v25, v15, (unsigned int)a5, v16);
if( v17 >= 0 && (v15 & 0x2000) != 0 )
{
v23[0] = v24;
v19 = -(__int64)v10 & (v10 + v24 - 1);
v24 = v19;
v20 = v19 - v23[0];
a8 = v19 - v23[0];
if( v19 != v23[0] )
{
v22 = RtlpHpEnvFreeVA(v23, (UINT64 *)&a8, 0x8000i64);
v20 = a8;
v17 = v22;
v19 = v24;
}
v23[0] = v19 + v9;
a8 = v25 - v20 - v9;
if( v25 - v20 != v9 )
{
v21 = RtlpHpEnvFreeVA(v23, (UINT64 *)&a8, 0x8000i64);
v19 = v24;
v17 = v21;
}
*a1 = v19;
*a2 = v9;
}
return v17;
}Referenced by:
RtlCSparseBitmapStart
RtlpCSparseBitmapPageCommit
RtlpHpAllocVA
RtlpHpVaMgrAllocAligned