MiHotRemoveHugeRange
VOID __stdcall MiHotRemoveHugeRange(UINT64 a1, UINT64 a2){
UINT64 v2;
INT64 v3;
UINT64 v4;
unsigned __int64 *v5;
INT64 v6;
UINT64 v7;
RTL_BALANCED_NODE *EntireHugePfnGood;
_QWORD *v9;
bool v10;
RTL_BALANCED_NODE *v11;
unsigned int v12;
_QWORD *v13;
INT64 v14;
PVOID *v15;
struct _KLOCK_QUEUE_HANDLE LockHandle;
PVOID P;
P = 0i64;
v2 = (a1 >> 18) & 0x3FFFF;
v3 = v2;
memset(&LockHandle, 0, sizeof(LockHandle));
v4 = a2 >> 18;
v5 = (unsigned __int64 *)(qword_140C4E3B0 + 8 * v2);
v6 = MiHugePfnPartition(v5);
KeAcquireInStackQueuedSpinLock((UINT64 *)(v6 + 4128), &LockHandle);
if( !v4 )
goto LABEL_14;
v7 = v4;
do
{
if( (*v5 & 0x10000000000i64) == 0 )
goto LABEL_13;
EntireHugePfnGood = MiMakeEntireHugePfnGood(v3);
v9 = P;
v10 = 0;
v11 = EntireHugePfnGood;
if( !P )
goto LABEL_12;
v12 = (__int64)EntireHugePfnGood[1].Children[0] & 0x3FFFF;
while( v12 < (v9[3] & 0x3FFFFui64) )
{
v13 = (_QWORD *)*v9;
if( !*v9 )
{
v10 = 0;
goto LABEL_12;
}
LABEL_10:
v9 = v13;
}
v13 = (_QWORD *)v9[1];
if( v13 )
goto LABEL_10;
v10 = 1;
LABEL_12:
RtlAvlInsertNodeEx((unsigned __int64 *)&P, (__int64)v9, v10, v11);
LABEL_13:
*v5 = *v5 & 0xFFF001FFFFFFFFFFui64 | 0x8020000000000i64;
++v5;
v3 = ((unsigned int)v3 ^ ((_DWORD)v3 + 1)) & 0x3FFFF ^ (unsigned __int64)v3;
--v7;
}
while( v7 );
LABEL_14:
*(_QWORD *)(v6 + 424) -= v4;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v14 = qword_140C4E3B0 + 8 * v2;
KeAcquireInStackQueuedSpinLock(&qword_140C4E3C0, &LockHandle);
RtlClearBitsEx((INT64)&qword_140C4E3A0, v2, v4);
if( v4 )
memset(v14, 0i64);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
while( P )
{
v15 = (PVOID *)P;
RtlAvlRemoveNode((unsigned __int64 *)&P, (__int64 *)P);
ExFreePoolWithTag(v15[4], 0);
ExFreePoolWithTag(v15, 0);
}
}Referenced by:
MiActOnPartitionNodePages