MiComputeDataFlushRange
NTSTATUS __stdcall MiComputeDataFlushRange(
_CONTROL_AREA *ControlArea,
UINT8 OldIrql,
_LARGE_INTEGER *Offset,
UINT64 RegionSize,
UINT64 Purging,
_MI_FLUSH_RANGE *FlushRange){
unsigned __int64 v8;
_CONTROL_AREA *v9;
_SUBSECTION *v10;
_SUBSECTION *v11;
unsigned __int64 v12;
_SUBSECTION *SubsectionNode;
unsigned __int64 v14;
UINT64 v15;
_SUBSECTION *v16;
_SUBSECTION *LastSubsection;
UINT64 v18;
_MI_FLUSH_RANGE v19;
__int64 SubsectionBase;
_MI_CONTROL_AREA_WAIT_BLOCK *v21;
_MMPTE *v22;
NTSTATUS result;
INT64 *p_ControlAreaLock;
_SUBSECTION *NextSubsection;
v8 = OldIrql;
v9 = ControlArea;
if( !ControlArea->NumberOfPfnReferences )
{
p_ControlAreaLock = (INT64 *)&ControlArea->ControlAreaLock;
LABEL_18:
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
LABEL_19:
__writecr8(v8);
return 0;
}
v10 = 0i64;
v11 = (_SUBSECTION *)&ControlArea[1];
if( !Offset )
{
v14 = 0i64;
LABEL_16:
LastSubsection = MiFindLastSubsection(ControlArea, 1ui64);
v18 = LastSubsection->PtesInSubsection - (LastSubsection->_bf_34 & 0x3FFFFFFF) - 1;
goto LABEL_7;
}
v12 = (unsigned __int64)Offset->QuadPart >> 12;
SubsectionNode = MiLocateSubsectionNode(ControlArea, Offset->QuadPart, 1ui64);
v11 = SubsectionNode;
if( !SubsectionNode )
{
LABEL_24:
p_ControlAreaLock = (INT64 *)&v9->ControlAreaLock;
goto LABEL_18;
}
v14 = v12
- (SubsectionNode->StartingSector | ((unsigned __int64)(SubsectionNode->u.SubsectionFlags._bf_0 & 0xFFC0) << 26));
if( !RegionSize
|| (v15 = (Offset->QuadPart + RegionSize - 1) >> 12,
v16 = MiLocateSubsectionNode(v9, Offset->QuadPart + RegionSize - 1, 1ui64),
(LastSubsection = v16) == 0i64) )
{
ControlArea = v9;
goto LABEL_16;
}
v18 = v15 - (v16->StartingSector | ((unsigned __int64)(v16->u.SubsectionFlags._bf_0 & 0xFFC0) << 26));
LABEL_7:
if( !v11[1].u1.e1._bf_0 || MiReferenceSubsection(v11, 0i64) <= 1 )
{
v19 = v11->PtesInSubsection - v14;
if( v11 == LastSubsection )
{
LABEL_26:
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&v9->ControlAreaLock);
goto LABEL_19;
}
while( 1 )
{
v11 = v11->NextSubsection;
if( !v11 )
goto LABEL_24;
if( v11[1].u1.e1._bf_0 && MiReferenceSubsection(v11, 0i64) > 1 )
{
SubsectionBase = (__int64)v11->SubsectionBase;
goto LABEL_10;
}
v19 += v11->PtesInSubsection;
if( v11 == LastSubsection )
goto LABEL_26;
}
}
v19 = 0;
SubsectionBase = (__int64)&v11->SubsectionBase[v14];
LABEL_10:
if( !LastSubsection[1].u1.e1._bf_0 || MiReferenceSubsection(LastSubsection, 0i64) <= 1 )
{
NextSubsection = v11->NextSubsection;
if( NextSubsection == LastSubsection )
goto LABEL_22;
do
{
if( NextSubsection[1].u1.e1._bf_0 && NextSubsection->SubsectionBase )
v10 = NextSubsection;
NextSubsection = NextSubsection->NextSubsection;
}
while( NextSubsection != LastSubsection );
if( !v10 )
LABEL_22:
LastSubsection = v11;
else
LastSubsection = v10;
MiReferenceSubsection(LastSubsection, 0i64);
v18 = LastSubsection->PtesInSubsection - (LastSubsection->_bf_34 & 0x3FFFFFFF) - 1;
}
++v9->NumberOfMappedViews;
v21 = MiBuildWakeList(v9, 4ui64);
MiRemoveUnusedSegment(v9);
if( (_DWORD)Purging == 1 )
v9->u.LongFlags |= 4u;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&v9->ControlAreaLock);
__writecr8(v8);
MiReleaseControlAreaWaiters(v21);
v22 = LastSubsection->SubsectionBase;
*(_QWORD *)FlushRange = v9;
*((_QWORD *)FlushRange + 1) = SubsectionBase;
*((_QWORD *)FlushRange + 2) = &v22[v18];
result = 259;
*((_QWORD *)FlushRange + 3) = v11;
*((_QWORD *)FlushRange + 4) = LastSubsection;
FlushRange[10] = v19;
return result;
}Referenced by:
MiComputeFlushRange
MmPurgeSection