MiDecrementLargeSubsections
NTSTATUS __stdcall MiDecrementLargeSubsections(_CONTROL_AREA **a1, INT64 a2){
_CONTROL_AREA **v2;
INT64 *p_ControlAreaLock;
unsigned __int64 v4;
INT64 v5;
unsigned int v6;
unsigned int v7;
_MMPTE *v8;
_MMPFN *v9;
_MI_CONTROL_AREA_WAIT_BLOCK *v10;
NTSTATUS result;
_CONTROL_AREA *ControlArea;
_CONTROL_AREA **v13;
INT64 *v15;
v13 = a1;
v2 = a1;
ControlArea = *a1;
p_ControlAreaLock = (INT64 *)&(*a1)->ControlAreaLock;
v15 = p_ControlAreaLock;
v4 = (unsigned __int8)ExAcquireSpinLockExclusive(p_ControlAreaLock);
v5 = a2;
while( 1 )
{
if( --*((_DWORD *)v2 + 27) == 1 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
__writecr8(2ui64);
v6 = *((_DWORD *)v2 + 11);
v7 = 0;
v8 = (_MMPTE *)v2[1];
if( v6 )
{
do
{
v9 = MiLockLeafPage(v8, 0i64);
MiDecrementShareCount(v9);
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( (++v7 & 0xF) == 0 && v7 != v6 && (unsigned int)KeShouldYieldProcessor() )
{
__writecr8(v4);
KeGetCurrentIrql();
__writecr8(2ui64);
}
++v8;
}
while( v7 < v6 );
v2 = v13;
p_ControlAreaLock = v15;
}
MiChargeLargeProtoSubsection((INT64)v2, 0i64);
ExAcquireSpinLockExclusive(p_ControlAreaLock);
--*((_DWORD *)v2 + 27);
v10 = MiBuildWakeList(ControlArea, 0x200ui64);
MiReleaseControlAreaWaiters(v10);
v5 = a2;
}
if( v2 == (_CONTROL_AREA **)v5 )
break;
v2 = (_CONTROL_AREA **)v2[2];
v13 = v2;
}
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
result = KiIrqlFlags;
__writecr8(v4);
return result;
}Referenced by:
MiDeletePartialCloneVads
MiDeleteVad
MiDereferenceDataSubsections
MiIncrementLargeSubsections
MiMapViewOfDataSection
MiReferenceDataSubsections
MiRemoveMappedPtes