MiDecrementCloneBlockReference
_MI_PAGE_DELETE_RESULT __stdcall MiDecrementCloneBlockReference(
ULONG_PTR CloneDescriptor,
ULONG_PTR CloneBlock,
ULONG_PTR CurrentProcess){
INT64 v3;
_EPROCESS *v4;
_ETHREAD *v5;
_MMPTE *v6;
_MI_CROSS_PARTITION_CHARGES *v7;
_MI_PAGE_DELETE_RESULT v8;
v3 = *(_QWORD *)&CloneDescriptor;
v4 = *(_EPROCESS **)&CurrentProcess;
v5 = *(_ETHREAD **)(*(_QWORD *)&CurrentProcess + 1248i64);
v6 = *(_MMPTE **)&CloneBlock;
if( v5 && v5 != (_ETHREAD *)KeGetCurrentThread() )
KeBugCheckEx(0x1Au, (PVOID)0x61945, (PVOID)v3, *(PVOID *)&CloneBlock, 0i64);
v7 = *(_MI_CROSS_PARTITION_CHARGES **)(*(_QWORD *)(v3 + 56) + 24i64);
if( *(_MI_CROSS_PARTITION_CHARGES **)(*(&stru_140C4DB30 + 267)
+ 8i64 * *(unsigned __int16 *)(*(_QWORD *)&CurrentProcess + 1838i64)) != v7
&& _InterlockedExchangeAdd64((volatile signed __int64 *)(*(_QWORD *)&CloneBlock + 8i64), 0xFFFFFFFFFFFFFFFFui64) == 1 )
{
MiReturnCrossPartitionCloneCharges(v7);
}
if( _InterlockedExchangeAdd64((volatile signed __int64 *)&v6[3], 0xFFFFFFFFFFFFFFFFui64) == 1 )
v8 = MiDeleteMergedPte((_MI_PARTITION *)v7, v6);
else
v8 = PageInserted;
if( v4->Vm.Instance.VmWorkingSetList[9].NextPteToTrim > (_MMPTE *)*(_QWORD *)(v3 + 96) )
{
if( (_InterlockedDecrement64((volatile signed __int64 *)&v6[2]) & 0x7FFFFFFFFFFFFFFi64) == 0 )
{
_InterlockedAdd64((volatile signed __int64 *)&v7[238].ChargeFailures, 0xFFFFFFFFFFFFFFFFui64);
if( v8 != PageStillReferenced )
MiReturnCommit((_MI_PARTITION *)v7, 1ui64);
}
v8 = PageCommitNotCharged;
}
if( _InterlockedExchangeAdd64((volatile signed __int64 *)(v3 + 48), 0xFFFFFFFFFFFFFFFFui64) == 1 )
MiDeleteCloneDescriptor(v4, v3);
return v8;
}Referenced by:
MiCopyOnWrite
MiDecommitPages
MiDeletePteList
MiDeletePteRun
MiDeleteVa