MiSelectUserAddress
NTSTATUS __stdcall MiSelectUserAddress(
UINT64 AllocationType,
UINT64 ZeroBits,
UINT64 CapturedViewSize,
UINT64 Alignment,
UINT64 ProtectionMask,
UINT64 InternalFlags,
UINT64 *HINTHonored,
PVOID *StartingAddress){
int v8;
unsigned __int64 v10;
unsigned __int64 v11;
_ETHREAD *CurrentThread;
unsigned int v13;
__int64 v14;
unsigned __int64 v15;
__int64 v16;
unsigned __int64 v17;
int v18;
NTSTATUS result;
UINT64 *v20;
int v21;
_QWORD *v24;
unsigned __int64 *v25;
v8 = AllocationType;
v21 = 0;
v10 = ZeroBits;
*v25 = 0i64;
v11 = Alignment;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
*v24 = 0i64;
v13 = (unsigned int)StartingAddress >> 31;
v14 = *((_QWORD *)CurrentThread + 23);
v15 = *(_QWORD *)(v14 + 1496);
if( CapturedViewSize > v15 - 1 && v15 <= 0x100000000i64 )
v13 = 2;
v16 = *(_QWORD *)(v14 + 1680) + 8 * (9i64 * v13 + 6);
if( (v8 & 0x20400000) != 541065216 && (v8 & 0x20000000) != 0 && Alignment >= 0x40000000 )
{
v17 = ProtectionMask;
if( ProtectionMask == 0x200000 )
{
v17 = 0x40000000i64;
v21 = 1;
}
}
else
{
v17 = ProtectionMask;
}
v18 = v8 & 0x100000;
while( 1 )
{
if( v18 || (*(_DWORD *)(v14 + 1124) & 0x200000) != 0 )
{
result = MiFindEmptyAddressRangeDown(v16, v11, v17, InternalFlags, v10, CapturedViewSize, (char)HINTHonored, v25);
}
else
{
LODWORD(v20) = (_DWORD)HINTHonored;
result = MiFindEmptyAddressRange(v16, v11, (PVOID)v17, InternalFlags, v10, (PVOID *)CapturedViewSize, v20);
}
if( result >= 0 || v21 != 1 )
break;
v11 = Alignment;
v17 = 0x200000i64;
v10 = ZeroBits;
v21 = 0;
}
return result;
}Referenced by:
MiAllocateEnclaveVad
MiAllocateNewSubAllocatedRegion
MiMapLockedPagesInUserSpace
MiMapViewOfDataSection
MiMapViewOfImageSection
MiMapViewOfPhysicalSection
MiReserveUserMemory