MiDeleteSegmentPages
VOID __fastcall MiDeleteSegmentPages(_CONTROL_AREA *ControlArea){
_SUBSECTION *v1;
__int64 v2;
__int64 v4;
_MI_PARTITION *v5;
_SEGMENT *Segment;
_SEGMENT_FLAGS SegmentFlags;
__int64 v8;
unsigned __int64 v9;
__int64 CommittedPages;
unsigned __int64 v11;
struct _KPRCB *CurrentPrcb;
__int64 CachedResidentAvailable;
bool v14;
signed __int32 v15;
UINT64 DanglingPageCount;
_MI_PARTITION *v17;
v1 = (_SUBSECTION *)&ControlArea[1];
v2 = ControlArea->u1.Flags._bf_0 & 0x3FF;
DanglingPageCount = 0i64;
v4 = 0i64;
v5 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v2);
Segment = ControlArea->Segment;
v17 = v5;
SegmentFlags = Segment->SegmentFlags;
while( v1 )
{
LODWORD(v8) = MiDeleteSubsectionPages(v1, &DanglingPageCount);
v1 = v1->NextSubsection;
v4 += v8;
}
v9 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
if( ControlArea->NumberOfPfnReferences )
{
do
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
__writecr8(v9);
_mm_pause();
ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
}
while( ControlArea->NumberOfPfnReferences );
v5 = v17;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
__writecr8(v9);
CommittedPages = MiGetCommittedPages(ControlArea);
if( CommittedPages )
{
if( (SegmentFlags.Short0 & 0x1000) != 0 )
{
v11 = CommittedPages - DanglingPageCount;
if( v5 == &Irp )
{
CurrentPrcb = KeGetCurrentPrcb();
CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable != -1 )
{
if( v11 + CachedResidentAvailable <= 0x100 )
{
do
{
if( v11 >= 0x80000 )
break;
v15 = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
CachedResidentAvailable + v11,
CachedResidentAvailable);
v14 = (_DWORD)CachedResidentAvailable == v15;
LODWORD(CachedResidentAvailable) = v15;
if( v14 )
goto LABEL_7;
}
while( v15 != -1 && v11 + v15 <= 0x100 );
}
if( (int)CachedResidentAvailable > 192
&& (_DWORD)CachedResidentAvailable != -1
&& (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
192,
CachedResidentAvailable) )
{
v11 += (int)CachedResidentAvailable - 192;
}
}
}
if( v11 )
_InterlockedExchangeAdd64((volatile signed __int64 *)&v5->Vp.ResidentAvailablePages, v11);
}
LABEL_7:
MiReturnCommit(v5, CommittedPages - DanglingPageCount);
_InterlockedExchangeAdd64((volatile signed __int64 *)&v5->Vp.SharedCommit, -CommittedPages);
}
}Referenced by:
MiInitializeImageExtents
MiSegmentDelete