MiDecrementCloneBlockReference
INT64 __fastcall MiDecrementCloneBlockReference(UINT64 P2, volatile INT64 *P3, UINT64 a3){
_ETHREAD *v5;
INT64 v7;
unsigned int v8;
v5 = *(_ETHREAD **)(a3 + 1248);
if( v5 && v5 != (_ETHREAD *)KeGetCurrentThread() )
KeBugCheckEx(0x1Au, 0x61945ui64, P2, (ULONG_PTR)P3, 0i64);
v7 = *(_QWORD *)(*(_QWORD *)(P2 + 56) + 24i64);
if( *(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(a3 + 1838)) != v7
&& _InterlockedExchangeAdd64(P3 + 1, 0xFFFFFFFFFFFFFFFFui64) == 1 )
{
MiReturnCrossPartitionCloneCharges(v7);
}
if( _InterlockedExchangeAdd64(P3 + 3, 0xFFFFFFFFFFFFFFFFui64) == 1 )
v8 = MiDeleteMergedPte((_MI_PARTITION *)v7, (_MMPTE *)P3);
else
v8 = 4;
if( *(_QWORD *)(*(_QWORD *)(a3 + 1680) + 360i64) > *(_QWORD *)(P2 + 96) )
{
if( (_InterlockedDecrement64(P3 + 2) & 0x7FFFFFFFFFFFFFFi64) == 0 )
{
_InterlockedAdd64((volatile signed __int64 *)(v7 + 7624), 0xFFFFFFFFFFFFFFFFui64);
if( v8 != 3 )
MiReturnCommit((_MI_PARTITION *)v7, 1ui64);
}
v8 = 5;
}
if( _InterlockedExchangeAdd64((volatile signed __int64 *)(P2 + 48), 0xFFFFFFFFFFFFFFFFui64) == 1 )
MiDeleteCloneDescriptor(a3, P2);
return v8;
}Referenced by:
MiCopyOnWrite
MiDecommitPages
MiDeletePteList
MiDeletePteRun
MiDeleteVa