MiAssignSoftwareWsleRegion
INT64 __fastcall MiAssignSoftwareWsleRegion(INT64 a1, UINT64 a2){
INT64 v4;
__int64 v5;
unsigned int i;
UINT64 v7;
_QWORD *v8;
__int64 v9;
__int16 v10;
INT64 v11;
struct _RTL_BITMAP BitMapHeader;
int v13;
_DWORD v14[9];
__int64 v15;
INT64 result[8];
*(&BitMapHeader.SizeOfBitMap + 1) = 0;
memset(v14, 0, 12);
memset(&v14[6], 0, 12);
memset((INT64)result, 0i64);
BitMapHeader.SizeOfBitMap = 512;
BitMapHeader.Buffer = (unsigned int *)result;
v4 = (INT64)MmGetPml4eBase() + 8 * ((a2 >> 39) & 0x1FF);
if( (MI_READ_PTE_LOCK_FREE(v4) & 1) != 0 )
{
v5 = ((v4 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
for( i = 0; i < 0x200; ++i )
{
if( MI_READ_PTE_LOCK_FREE(v5) )
_bittestandset((signed __int32 *)result, i);
v5 += 8i64;
}
}
v14[5] = 1;
v7 = a2 & 0xFFFFFF8000000000ui64;
v8 = &v14[1];
v13 = 0;
*(_QWORD *)&v14[3] = 0x1000000000i64;
v9 = 2i64;
v15 = 0x80000000i64;
do
{
v10 = ExGenRandom(1i64);
*v8 = v7
+ ((unsigned __int64)RtlFindClearBitsAndSet(
&BitMapHeader,
((unsigned __int64)(v8[1] + 0x3FFFFFFFi64) >> 30) + 1,
v10 & 0x1FF) << 30);
v8 += 3;
--v9;
}
while( v9 );
qword_140C4E070 = *(_QWORD *)&v14[1];
qword_140C4E078 = *(_QWORD *)&v14[1];
qword_140C4E080 = *(_QWORD *)&v14[1];
qword_140C4DF90 = v15;
qword_140C4DF88 = *(VOID **)&v14[7];
*(_QWORD *)(*(_QWORD *)(a1 + 240) + 2928i64) = *(_QWORD *)&v14[7];
v11 = qword_140C4DF90;
*(_QWORD *)(*(_QWORD *)(a1 + 240) + 2936i64) = qword_140C4DF90;
return v11;
}Referenced by:
MiInitializeSystemVa