MiPreventControlAreaDeletion
NTSTATUS __stdcall MiPreventControlAreaDeletion(INT64 a1, INT64 a2, INT64 *a3, INT64 **a4){
int v6;
__int64 v7;
__int64 v8;
_CONTROL_AREA *v9;
INT64 *v10;
union {unsigned int LongFlags;_MMSECTION_FLAGS Flags;} v11;
_MI_CONTROL_AREA_WAIT_BLOCK *v12;
*a4 = 0i64;
*a3 = 0i64;
v6 = a2;
v7 = *(_QWORD *)(a1 + 16);
if( *(&stru_140C4DB30 + 42) && (v7 & 0x10) == 0 )
v7 &= ~*(&stru_140C4DB30 + 42);
v8 = v7 >> 16;
if( (*(_BYTE *)(v8 + 34) & 2) == 0 )
{
v9 = *(_CONTROL_AREA **)v8;
v10 = (INT64 *)(*(_QWORD *)v8 + 72i64);
ExAcquireSpinLockExclusiveAtDpcLevel(v10);
v11.LongFlags = (unsigned int)v9->u;
if( !(v11.LongFlags & 1 | ((v11.LongFlags & 2) != 0)) )
{
if( (v11.LongFlags & 0x20) != 0 )
goto LABEL_7;
if( (*(_BYTE *)(v8 + 34) & 1) == 0 && (v6 != 1 || !*(_DWORD *)(v8 + 108)) )
{
MiReferenceSubsection((_SUBSECTION *)v8, 0i64);
*a3 = v8;
LABEL_7:
v12 = MiBuildWakeList(v9, 4ui64);
++v9->ModifiedWriteCount;
*a4 = (INT64 *)v12;
MiRemoveUnusedSegment(v9);
if( v6 == 1 )
v9->u.LongFlags |= 4u;
goto LABEL_9;
}
}
LODWORD(v9) = 0;
LABEL_9:
ExReleaseSpinLockExclusiveFromDpcLevel(v10);
return(int)v9;
}
return 0;
}Referenced by:
MiPurgeBadFileOnlyPages
MiTrimSharedPage