MiAllocateVirtualMemoryPrepare
INT64 __fastcall MiAllocateVirtualMemoryPrepare(
VOID *a1,
INT64 a2,
UINT64 a3,
UINT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
CHAR a8,
INT64 a9,
INT64 a10,
INT64 a11,
INT64 a12,
INT64 a13){
unsigned __int64 v13;
INT64 v14;
_QWORD *v16;
int v17;
INT64 v18;
INT64 v19;
int v20;
unsigned int v21;
LARGE_INTEGER *v22;
KENLISTMENT *v23;
int v24;
int v25;
INT64 v26;
__int64 v27;
unsigned __int64 v28;
int v29;
int v30;
_QWORD *v31;
unsigned __int64 v32;
__int64 v33;
unsigned __int64 v34;
__int64 v35;
INT64 v36;
unsigned __int64 v37;
__int64 v38;
unsigned __int64 v39;
unsigned __int64 v40;
int v41;
unsigned int v42;
char v43;
__int64 v44;
int v45;
_QWORD *v46;
INT64 result;
__int64 v48;
bool v49;
bool v50;
__int64 v51;
_QWORD *v52;
PVOID Object;
INT64 v54;
int v55;
UINT64 ZeroBits;
ZeroBits = a3;
v13 = a2;
v14 = a12;
v54 = a2;
Object = 0i64;
v16 = (_QWORD *)*((_QWORD *)KeGetCurrentThread() + 23);
v52 = v16;
*(_QWORD *)(a12 + 96) = v16;
if( a1 != (VOID *)-1i64 )
{
v25 = ObpReferenceObjectByHandleWithTag(
(ULONG_PTR)a1,
8,
(__int64)PsProcessType,
a8,
0x6D566D4Du,
(__int64)&Object,
0i64,
0i64);
if( v25 < 0 )
goto LABEL_88;
v16 = Object;
v52 = Object;
}
v17 = a5;
v18 = (unsigned int)a5;
v19 = (unsigned int)a9;
*(_QWORD *)(v14 + 88) = v16;
v20 = a6;
v21 = a6 & 0xFFF807FF;
*(_QWORD *)(v14 + 32) = a4;
LODWORD(a6) = v21;
v55 = v20 & 0x7F800;
v25 = MiValidateAllocationType(v18, v19, v21);
if( v25 >= 0 )
{
if( !v24 || (v25 = xHalUnmaskInterrupt(v23, v22), v25 >= 0) )
{
if( (v17 & 0x1000) != 0 && !v13 )
v17 |= 0x2000u;
v26 = a7;
if( *(_QWORD *)(a7 + 24)
&& (v17 & 0x20400000) != 0x20000000
&& ((v17 & 0x20400000) != 541065216 || (*(_BYTE *)(a7 + 56) & 2) == 0) )
{
goto LABEL_73;
}
v27 = *(_QWORD *)(a7 + 56);
if( (v27 & 0x20) != 0 )
goto LABEL_73;
v28 = 0x10000i64;
v29 = v17 & 0x20400000;
if( (v17 & 0x20400000) == 0x20000000 )
v28 = 0x200000i64;
v30 = v27 & 0x1A;
LODWORD(a12) = v30;
if( (v27 & 0x1A) != 0 )
{
if( ((v30 - 1) & v30) != 0 )
goto LABEL_73;
if( (v30 & 2) != 0 )
{
v49 = v29 == 541065216;
}
else
{
if( (v30 & 0x10) != 0 )
{
if( (KeFeatureBits & 0x2000000000i64) == 0 )
{
v25 = -1073741637;
goto LABEL_88;
}
if( v29 == 0x400000 )
goto LABEL_73;
v28 = 0x40000000i64;
}
else if( (v30 & 8) != 0 )
{
v28 = 0x200000i64;
}
v49 = v29 == 0x20000000;
}
if( v49 )
goto LABEL_14;
if( v29 != 0x400000 )
goto LABEL_73;
}
else
{
if( (v27 & 4) != 0 )
goto LABEL_73;
if( v29 != 0x400000 )
{
LABEL_14:
if( ((v17 & 0x2000) == 0 || v13) && (*(_QWORD *)a7 || *(_QWORD *)(a7 + 8) || *(_QWORD *)(a7 + 16)) )
goto LABEL_73;
if( ZeroBits )
{
v25 = MiValidateZeroBits(&ZeroBits);
if( v25 < 0 )
goto LABEL_88;
v31 = v52;
if( (v17 & 0x2000) != 0 && !v13 )
*(_QWORD *)(v26 + 8) = MiGetUserReservationHighestAddress((INT64)v52, ZeroBits);
v29 = v17 & 0x20400000;
v30 = a12;
}
else
{
v31 = v52;
}
if( (v17 & 0x40000) != 0 )
{
*(_DWORD *)(v14 + 60) |= 0x8000000u;
}
else
{
if( (v17 & 0x4000) == 0 )
goto LABEL_22;
if( *(_QWORD *)v26 || *(_QWORD *)(v26 + 8) || *(_QWORD *)(v26 + 16) )
goto LABEL_73;
*(_DWORD *)(v14 + 60) |= 0x4000000u;
}
if( (v17 & 0x4000) != 0 )
{
if( !v30 && v29 != 0x20000000 )
goto LABEL_23;
goto LABEL_24;
}
LABEL_22:
if( (v17 & 0x2000) == 0 )
{
LABEL_23:
v28 = 4096i64;
goto LABEL_24;
}
if( (v17 & 0x40000000) != 0 )
{
if( ((v29 - 0x20000000) & 0xFFBFFFFF) == 0 )
goto LABEL_73;
goto LABEL_23;
}
LABEL_24:
v32 = *(_QWORD *)(v26 + 16);
if( v32 )
{
if( v32 < v28
|| ((v32 - 1) & v32) != 0
|| v32 >= 0x7FFFFFFF0000i64
|| (v17 & 0x40000000) != 0 && v32 != 4096 )
{
goto LABEL_73;
}
}
else
{
*(_QWORD *)(v26 + 16) = v28;
}
if( !a4 || (v17 & 0x2000) != 0 && ((v29 - 0x20000000) & 0xFFBFFFFF) == 0 && ((v28 - 1) & a4) != 0 )
goto LABEL_73;
v33 = 0x7FFFFFFEFFFFi64;
if( v13 > 0x7FFFFFFEFFFFi64 || 0x7FFFFFFF0000i64 - v13 < a4 )
goto LABEL_73;
v34 = v13 + a4;
if( (v17 & 0x2000) == 0 )
{
if( v17 == 0x80000 || v17 == 0x1000000 )
{
v48 = ~(v28 - 1);
v13 = v48 & (v28 + v13 - 1);
v34 &= v48;
if( v13 >= v34 )
{
v25 = -1073741800;
goto LABEL_88;
}
}
else
{
v35 = ~(v28 - 1);
v13 &= v35;
v34 = v35 & (v28 + v34 - 1);
}
LABEL_34:
v36 = v54;
v37 = v34 - v13;
if( v54 )
*(_QWORD *)v26 = v13;
else
v13 = *(_QWORD *)v26;
v38 = *(_QWORD *)(v26 + 16);
v39 = v13;
if( ((v38 - 1) & v13) == 0 )
{
v40 = *(_QWORD *)(v26 + 8);
if( v40 )
{
if( v40 <= 0x7FFFFFFEFFFFi64 )
{
v39 = v13;
if( (((_WORD)v40 + 1) & 0xFFF) == 0 )
goto LABEL_41;
}
}
else
{
if( (v17 & 0x2000) != 0 && !v36 && (v17 & 0x4000) == 0 )
{
if( (unsigned __int64)(v31[187] - 1i64) < 0x7FFFFFFEFFFFi64 )
v33 = v31[187] - 1i64;
v41 = a12;
v40 = v33;
*(_QWORD *)(v26 + 8) = v33;
if( v41 && (v41 & 2) == 0 )
{
if( (v41 & 8) != 0 )
{
v51 = -2097152i64;
LABEL_131:
v40 = (v33 & v51) - 1;
*(_QWORD *)(v26 + 8) = v40;
goto LABEL_42;
}
if( (v41 & 0x10) != 0 )
{
v51 = -1073741824i64;
goto LABEL_131;
}
}
LABEL_42:
if( v39 < v40 && v40 - v39 + 1 >= v37 && (v17 & 0x7F) == 0 )
{
v42 = *(_DWORD *)(v26 + 32);
if( v42 <= (unsigned __int16)KeNumberNodes )
{
v43 = *(_BYTE *)(v26 + 49);
if( v43 != 1 || v41 || (v17 & 0x20400000) == 0x20000000 )
{
*(_BYTE *)(v14 + 56) = v43;
*(_BYTE *)(v14 + 104) = a8;
*(_DWORD *)(v14 + 60) |= a9;
*(_DWORD *)(v14 + 76) = a10;
*(_QWORD *)(v14 + 80) = a11;
*(_QWORD *)(v14 + 112) = *(_QWORD *)(v26 + 40);
v44 = *(_QWORD *)(v26 + 56);
*(_QWORD *)(v14 + 8) = v40;
v45 = a6;
*(_QWORD *)(v14 + 120) = v44;
v46 = (_QWORD *)a13;
*(_DWORD *)(v14 + 44) = v45;
*(_DWORD *)(v14 + 48) = v55;
*v46 = Object;
result = 0i64;
*(_QWORD *)v14 = v39;
*(_QWORD *)(v14 + 16) = v38;
*(_QWORD *)(v14 + 24) = v37;
*(_DWORD *)(v14 + 40) = v17 & 0xFFFBBFFF;
*(_DWORD *)(v14 + 52) = v42;
return result;
}
}
}
goto LABEL_73;
}
if( v13 + v37 >= v13 )
{
v40 = v13 + v37 - 1;
*(_QWORD *)(v26 + 8) = v40;
if( v40 <= 0x7FFFFFFEFFFFi64 )
{
LABEL_41:
v41 = a12;
goto LABEL_42;
}
}
}
}
LABEL_73:
v25 = -1073741811;
goto LABEL_88;
}
if( (v17 & 0x40000000) != 0 )
{
v50 = (((unsigned __int16)v13 | (unsigned __int16)a4) & 0xFFF) == 0;
}
else
{
if( (v17 & 0x4000) == 0 )
{
v13 &= -(__int64)v28;
if( ((v29 - 0x20000000) & 0xFFBFFFFF) != 0 )
v34 = (v34 + 4095) & 0xFFFFFFFFFFFFF000ui64;
else
v34 = v13 + a4;
goto LABEL_34;
}
v50 = ((a4 | v13) & (v28 - 1)) == 0;
}
if( !v50 )
goto LABEL_73;
goto LABEL_34;
}
}
if( (v27 & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
goto LABEL_73;
goto LABEL_14;
}
}
LABEL_88:
if( Object )
ObfDereferenceObjectWithTag(Object, 0x6D566D4Dui64);
return(unsigned int)v25;
}Referenced by:
MiAllocateVirtualMemoryCommon
MmAllocateVirtualMemory
NtAllocateVirtualMemory