MiTrimSection
NTSTATUS __stdcall MiTrimSection(_MI_FLUSH_RANGE *FlushRange, UINT64 ReplaceOk, UINT64 Flags){
_MI_FLUSH_RANGE *v3;
_MMPTE *v4;
unsigned int v5;
_SUBSECTION *v6;
_CONTROL_AREA *ControlArea;
UINT64 v8;
_ETHREAD *CurrentThread;
_MI_VIEW_INFO *v10;
unsigned __int8 v11;
volatile int *p_ControlAreaLock;
unsigned __int64 v13;
_SUBSECTION *v14;
int v15;
_RTL_BALANCED_NODE *Root;
_QWORD *i;
_MI_VIEW_INFO *v19;
_MI_VIEW_INFO *v20;
_MI_VIEW_INFO *v21;
unsigned __int64 v22;
_SUBSECTION *v23;
UINT64 EndingOffset;
_MMPTE *ProtoPte;
UINT64 StartingOffset;
unsigned int ReplaceOka;
int v29;
_MI_VIEW_INFO *v30;
ReplaceOka = ReplaceOk;
v3 = FlushRange;
v4 = (_MMPTE *)*((_QWORD *)FlushRange + 1);
ProtoPte = v4;
v5 = Flags;
v29 = Flags & 1;
v6 = (_SUBSECTION *)*((_QWORD *)v3 + 3);
v23 = v6;
ControlArea = v6->ControlArea;
if( (Flags & 1) != 0 && (!ControlArea->FilePointer.Value || (ControlArea->u.LongFlags & 0x20) != 0) )
return -1073741688;
LODWORD(v8) = MiStartingOffset(v6, v4, 0xFFFFFFFFui64);
EndingOffset = v8;
MiStartingOffset(*((_SUBSECTION **)v3 + 4), *((_MMPTE **)v3 + 2), 0xFFFFFFFFui64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v10 = 0i64;
v30 = 0i64;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx(&ControlArea->FileObjectLock, 0i64);
v11 = ExAcquireSpinLockShared((INT64 *)&ControlArea->ControlAreaLock);
p_ControlAreaLock = &ControlArea->ControlAreaLock;
v13 = v11;
if( ControlArea->NumberOfMappedViews )
{
StartingOffset = *(_QWORD *)ControlArea->gap8;
ExReleaseSpinLockSharedFromDpcLevel(p_ControlAreaLock);
__writecr8(v13);
if( (ControlArea->u.LongFlags & 0x20) == 0 && ControlArea->FilePointer.Value )
{
v14 = (_SUBSECTION *)*((_QWORD *)v3 + 4);
while( 1 )
{
v15 = 1;
if( v6 == *((_SUBSECTION **)v3 + 3)
|| v6 == v14
|| ((v22 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock),
!v6[1].u1.e1._bf_0)
|| MiReferenceSubsection(v6, 0i64) <= 1 ? (v15 = 0) : (v15 = 2),
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock),
__writecr8(v22),
v15) )
{
if( v29 || (v5 & 0x20) != 0 )
v15 = (unsigned int)MiAnyProtosAreMapped((__int64)v6, v3) != 0 ? v15 : 0;
if( v15 )
{
Root = v6[1].GlobalPerSessionHead.Root;
if( Root != (_RTL_BALANCED_NODE *)&v6[1].24 )
{
v20 = v30;
do
{
v21 = MiViewMayContainPage(ControlArea, (_LIST_ENTRY *)v5, (UINT64)Root, EndingOffset);
if( v21 )
{
*(_QWORD *)v21 = v20;
v20 = v21;
}
Root = Root->Children[0];
}
while( Root != (_RTL_BALANCED_NODE *)&v6[1].24 );
v6 = v23;
v3 = FlushRange;
v30 = v20;
}
if( v15 == 2 )
MiDecrementSubsection(v6);
}
}
v14 = (_SUBSECTION *)*((_QWORD *)v3 + 4);
if( v6 == v14 )
break;
v6 = v6->NextSubsection;
v23 = v6;
}
v10 = v30;
}
for( i = (_QWORD *)StartingOffset; i != (_QWORD *)ControlArea->gap8; i = (_QWORD *)*i )
{
v19 = MiViewMayContainPage(ControlArea, (_LIST_ENTRY *)v5, (UINT64)i, EndingOffset);
if( v19 )
{
*(_QWORD *)v19 = v10;
v10 = v19;
}
}
MiUnlockControlAreaFileObjectShared(ControlArea);
return MiTrimSharedPageFromViews(v10, ReplaceOka, v5, ControlArea, ProtoPte);
}
else
{
ExReleaseSpinLockSharedFromDpcLevel(p_ControlAreaLock);
__writecr8(v13);
MiUnlockControlAreaFileObjectShared(ControlArea);
return 0;
}
}Referenced by:
MiTrimSharedPage
MmTrimSection