MiUnlinkHugeRange
NTSTATUS __stdcall MiUnlinkHugeRange(INT64 a1, INT64 a2){
__int64 v2;
unsigned __int64 v4;
unsigned __int64 v5;
__int64 v6;
__int64 v7;
__int64 v8;
unsigned __int64 v9;
int v10;
__int64 v11;
__int64 v12;
int v13;
__int64 *v14;
unsigned __int64 *v15;
__int64 v16;
unsigned __int64 v17;
v2 = *(_QWORD *)(a1 + 6160);
v4 = *(&stru_140C4DB30 + 100);
v5 = a2 & 0x3FFFF;
LODWORD(v6) = MiSearchNumaNodeTable((PVOID)((a2 & 0x3FFFF) << 18));
v7 = *(&stru_140C4DB30 + 272);
v8 = *(unsigned int *)(v6 + 8);
v9 = *(_QWORD *)(*(&stru_140C4DB30 + 272) + 8 * v5);
if( (v9 & 0x1C0000) == 0x80000 )
{
v10 = 1;
v11 = 4200i64;
v12 = v4 + (unsigned int)(2 * v4 * v8);
}
else
{
if( (v9 & 0x1C0000) == 0x40000 )
{
v10 = 0;
v13 = *(_DWORD *)(v6 + 8);
v11 = 4192i64;
}
else
{
v13 = (unsigned __int16)KeNumberNodes;
v10 = 5;
v11 = 4232i64;
}
v12 = (unsigned int)(2 * v4 * v13);
}
v14 = (__int64 *)(v2 + 8 * v12);
if( v10 != 5 )
v14 += v5 % v4;
v15 = (unsigned __int64 *)v14;
if( ((v9 >> 21) & 0x3FFFF) != 0 )
v15 = (unsigned __int64 *)(*(&stru_140C4DB30 + 272) + 8 * ((v9 >> 21) & 0x3FFFF));
*v15 = v9 & 0x3FFFF | *v15 & 0xFFFFFFFFFFFC0000ui64;
if( (v9 & 0x3FFFF) != 0 )
v14 = (__int64 *)(*(&stru_140C4DB30 + 272) + 8 * (v9 & 0x3FFFF));
v16 = *v14 ^ (v9 ^ *v14) & 0x7FFFE00000i64;
*v14 = v16;
if( *(_BYTE *)(a1 + 4829) == 1 || v10 )
v17 = v9 & 0xFFFFFFFFFFFC0000ui64 | 1;
else
v17 = v9 & 0xFFFFFFFFFFFC0000ui64;
*(_QWORD *)(v7 + 8 * v5) = v17 & 0xFFFFFFFFFFE3FFFFui64 | 0xC0000;
if( v10 != 5 )
{
--*(_QWORD *)(v11 + *(_QWORD *)(a1 + 16) + 4544 * v8);
--*(_QWORD *)(a1 + 6168);
}
return v16;
}Referenced by:
MiGetHugeRangeFromNode
MiMakeEntireHugePfnGood
MiMarkHugePfnBad
MiMarkHugePfnGood