MiFreeCombineBlock
VOID __stdcall MiFreeCombineBlock(_MI_COMBINE_BLOCK *CombineBlock){
__int64 v1;
unsigned __int64 v2;
__int64 v4;
__int64 v5;
__int64 v6;
unsigned __int64 v7;
_MI_COMBINE_BLOCK **v9;
__int64 v10;
_MI_COMBINE_BLOCK *v11;
unsigned int i;
__int64 v13;
_MI_COMBINE_BLOCK **v14;
_KLOCK_QUEUE_HANDLE LockHandle;
v1 = *((_QWORD *)CombineBlock + 3);
v2 = (unsigned __int64)CombineBlock & 0xFFFFFFFFFFFFF000ui64;
memset(&LockHandle, 0, sizeof(LockHandle));
v4 = *(_QWORD *)(((unsigned __int64)CombineBlock & 0xFFFFFFFFFFFFF000ui64) + 0x10);
if( v1 )
{
v5 = v1 & 0xF;
v6 = 16i64 * (unsigned int)v5;
v7 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)(v6 + v4 + 104));
RtlAvlRemoveNode((UINT64 *)(v4 + 16 * (v5 + 6)), (INT64 *)CombineBlock);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v6 + v4 + 104));
__writecr8(v7);
*((_QWORD *)CombineBlock + 3) = 0i64;
}
CombineBlock[10] &= 0xFFFFFFE0;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(v4 + 88), &LockHandle);
if( (*(_DWORD *)(v2 + 8))-- == 1 )
{
v11 = (_MI_COMBINE_BLOCK *)(v2 + 72);
for( i = 0; i < 0x37; ++i )
{
if( v11 != CombineBlock )
{
v13 = *(_QWORD *)v11;
v14 = (_MI_COMBINE_BLOCK **)*((_QWORD *)v11 + 1);
if( *(_MI_COMBINE_BLOCK **)(*(_QWORD *)v11 + 8i64) != v11 || *v14 != v11 )
goto LABEL_15;
*v14 = (_MI_COMBINE_BLOCK *)v13;
*(_QWORD *)(v13 + 8) = v14;
}
v11 += 18;
}
*(_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((PWORK_QUEUE_ITEM)(v4 + 32), DelayedWorkQueue);
}
}
else
{
v9 = (_MI_COMBINE_BLOCK **)(v4 + 72);
v10 = *(_QWORD *)(v4 + 72);
if( *(_QWORD *)(v10 + 8) != v4 + 72 )
LABEL_15:
__fastfail(3u);
*(_QWORD *)CombineBlock = v10;
*((_QWORD *)CombineBlock + 1) = v9;
*(_QWORD *)(v10 + 8) = CombineBlock;
*v9 = CombineBlock;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
_InterlockedExchangeAdd((volatile signed __int32 *)(v4 + 388), 0xFFFFFFFF);
}Referenced by:
MiDecrementCombinedPte
MiDemoteCombinedPte
MiProcessCrcList