MiAllocateVad
_MMVAD_SHORT *__stdcall MiAllocateVad(VOID *StartingVirtualAddress, VOID *EndingVirtualAddress){
char v2;
char v4;
_MMVAD_SHORT *Pool;
_MMVAD_SHORT *v7;
union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v8;
unsigned int v9;
unsigned __int64 v10;
int v11;
v4 = v2;
Pool = (_MMVAD_SHORT *)MiAllocatePool(64i64, 0x40ui64, 0x53646156ui64);
v7 = Pool;
if( Pool )
{
v8.LongFlags = (unsigned int)Pool->u;
Pool->PushLock._bf_0 = 0i64;
Pool->StartingVpn = (unsigned __int64)StartingVirtualAddress >> 12;
v9 = v8.LongFlags & 0xFFFFF07F | 0x80;
Pool->StartingVpnHigh = (unsigned __int64)StartingVirtualAddress >> 44;
Pool->VadNode.ParentValue = -2i64;
Pool->EndingVpn = (unsigned __int64)EndingVirtualAddress >> 12;
Pool->EndingVpnHigh = (unsigned __int64)EndingVirtualAddress >> 44;
if( (v4 & 1) != 0 )
{
v10 = ((unsigned int)((unsigned __int64)EndingVirtualAddress >> 12) | ((unsigned __int64)(unsigned __int8)((unsigned __int64)EndingVirtualAddress >> 44) << 32))
- ((unsigned int)((unsigned __int64)StartingVirtualAddress >> 12) | ((unsigned __int64)(unsigned __int8)((unsigned __int64)StartingVirtualAddress >> 44) << 32))
+ 1;
Pool->u1.LongFlags1 |= 0x80000000;
}
else if( (v4 & 2) != 0 )
{
v10 = 0x7FFFFFFFDi64;
v9 = v9 & 0xFFFFF07F | 0xC00;
}
else
{
v10 = 0x7FFFFFFFFi64;
}
v11 = v10 ^ Pool->u1.LongFlags1;
v7->u.LongFlags = v9 | 0x100000;
v7->u1.LongFlags1 ^= v11 & 0x7FFFFFFF;
v7->CommitChargeHigh = v10 >> 31;
if( (v4 & 2) != 0
|| MiAddSecureEntry(
(_MI_PARTITION *)v7,
(__int64)StartingVirtualAddress,
(__int64)EndingVirtualAddress,
-2147483647,
0) )
{
return v7;
}
ExFreePoolWithTag(v7, 0);
}
return 0i64;
}Referenced by:
MiAllocateProcessVads
MiCreatePlaceholderStorage
MiFreeVadRange