MiFreeCombineBlock
INT64 __fastcall MiFreeCombineBlock(INT64 a1){
__int64 v1;
unsigned __int64 v2;
__int64 v4;
__int64 v5;
__int64 v6;
unsigned __int64 v7;
INT64 *v9;
__int64 v10;
INT64 result;
_QWORD *v12;
unsigned int i;
__int64 v14;
_QWORD *v15;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v1 = *(_QWORD *)(a1 + 24);
v2 = a1 & 0xFFFFFFFFFFFFF000ui64;
memset(&LockHandle, 0, sizeof(LockHandle));
v4 = *(_QWORD *)((a1 & 0xFFFFFFFFFFFFF000ui64) + 0x10);
if( v1 )
{
v5 = v1 & 0xF;
v6 = 16i64 * (unsigned int)v5;
v7 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v6 + v4 + 104));
RtlAvlRemoveNode((unsigned __int64 *)(v4 + 16 * (v5 + 6)), (__int64 *)a1);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v6 + v4 + 104));
__writecr8(v7);
*(_QWORD *)(a1 + 24) = 0i64;
}
*(_DWORD *)(a1 + 40) &= 0xFFFFFFE0;
KeAcquireInStackQueuedSpinLock((UINT64 *)(v4 + 88), &LockHandle);
if( (*(_DWORD *)(v2 + 8))-- == 1 )
{
v12 = (_QWORD *)(v2 + 72);
for( i = 0; i < 0x37; ++i )
{
if( v12 != (_QWORD *)a1 )
{
v14 = *v12;
v15 = (_QWORD *)v12[1];
if( *(_QWORD **)(*v12 + 8i64) != v12 || (_QWORD *)*v15 != v12 )
goto LABEL_15;
*v15 = v14;
*(_QWORD *)(v14 + 8) = v15;
}
v12 += 9;
}
*(_QWORD *)v2 = *(_QWORD *)(v4 + 24);
*(_QWORD *)(v4 + 24) = v2;
if( !*(_QWORD *)v2 )
{
*(_QWORD *)(v4 + 32) = 0i64;
*(_QWORD *)(v4 + 48) = MiFreeCombinePool;
*(_QWORD *)(v4 + 56) = v4;
ExQueueWorkItem((WORK_QUEUE_ITEM *)(v4 + 32), DelayedWorkQueue);
}
}
else
{
v9 = (INT64 *)(v4 + 72);
v10 = *(_QWORD *)(v4 + 72);
if( *(_QWORD *)(v10 + 8) != v4 + 72 )
LABEL_15:
__fastfail(3u);
*(_QWORD *)a1 = v10;
*(_QWORD *)(a1 + 8) = v9;
*(_QWORD *)(v10 + 8) = a1;
*v9 = a1;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = (unsigned int)KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
_InterlockedExchangeAdd((volatile signed __int32 *)(v4 + 388), 0xFFFFFFFF);
return result;
}Referenced by:
MiDecrementCombinedPte
MiDemoteCombinedPte
MiProcessCrcList