MiComputeDataFlushRange
__int64 __fastcall MiComputeDataFlushRange(
__int64 a1,
unsigned __int8 a2,
unsigned __int64 *a3,
__int64 a4,
int a5,
__int64 a6){
unsigned __int64 v8;
__int64 v9;
_SUBSECTION *v10;
__int64 v11;
unsigned __int64 v12;
_SUBSECTION *SubsectionNode;
unsigned __int64 v14;
unsigned __int64 v15;
_SUBSECTION *v16;
_SUBSECTION *LastSubsection;
unsigned __int64 v18;
int v19;
int v20;
__int64 v21;
int v22;
_QWORD *v23;
_QWORD *v24;
__int64 v25;
__int64 result;
INT64 *v27;
__int64 v28;
int v29;
v8 = a2;
v9 = a1;
if( !*(_QWORD *)(a1 + 32) )
{
v27 = (INT64 *)(a1 + 72);
LABEL_18:
ExReleaseSpinLockExclusiveFromDpcLevel(v27);
LABEL_19:
__writecr8(v8);
return 0i64;
}
v10 = 0i64;
v11 = a1 + 128;
if( !a3 )
{
v14 = 0i64;
LABEL_16:
LastSubsection = MiFindLastSubsection((_CONTROL_AREA *)a1, 1ui64);
v18 = *((_DWORD *)LastSubsection + 11) - (*((_DWORD *)LastSubsection + 13) & 0x3FFFFFFFu) - 1;
goto LABEL_7;
}
v12 = *a3 >> 12;
SubsectionNode = MiLocateSubsectionNode((_CONTROL_AREA *)a1, *a3, 1ui64);
v11 = (__int64)SubsectionNode;
if( !SubsectionNode )
{
LABEL_24:
v27 = (INT64 *)(v9 + 72);
goto LABEL_18;
}
v14 = v12
- (*((unsigned int *)SubsectionNode + 9) | ((unsigned __int64)(*((_WORD *)SubsectionNode + 16) & 0xFFC0) << 26));
if( !a4
|| (v15 = (*a3 + a4 - 1) >> 12,
v16 = MiLocateSubsectionNode((_CONTROL_AREA *)v9, *a3 + a4 - 1, 1ui64),
(LastSubsection = v16) == 0i64) )
{
a1 = v9;
goto LABEL_16;
}
v18 = v15 - (*((unsigned int *)v16 + 9) | ((unsigned __int64)(*((_WORD *)v16 + 16) & 0xFFC0) << 26));
LABEL_7:
if( !*(_DWORD *)(v11 + 104) || (MiReferenceSubsection((_SUBSECTION *)v11, 0i64), v19 <= 1) )
{
v20 = *(_DWORD *)(v11 + 44) - v14;
if( (_SUBSECTION *)v11 == LastSubsection )
{
LABEL_26:
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v9 + 72));
goto LABEL_19;
}
while( 1 )
{
v11 = *(_QWORD *)(v11 + 16);
if( !v11 )
goto LABEL_24;
if( *(_DWORD *)(v11 + 104) )
{
MiReferenceSubsection((_SUBSECTION *)v11, 0i64);
if( v29 > 1 )
{
v21 = *(_QWORD *)(v11 + 8);
goto LABEL_10;
}
}
v20 += *(_DWORD *)(v11 + 44);
if( (_SUBSECTION *)v11 == LastSubsection )
goto LABEL_26;
}
}
v20 = 0;
v21 = *(_QWORD *)(v11 + 8) + 8 * v14;
LABEL_10:
if( !*((_DWORD *)LastSubsection + 26) || (MiReferenceSubsection(LastSubsection, 0i64), v22 <= 1) )
{
v28 = *(_QWORD *)(v11 + 16);
if( (_SUBSECTION *)v28 == LastSubsection )
goto LABEL_22;
do
{
if( *(_DWORD *)(v28 + 104) && *(_QWORD *)(v28 + 8) )
v10 = (_SUBSECTION *)v28;
v28 = *(_QWORD *)(v28 + 16);
}
while( (_SUBSECTION *)v28 != LastSubsection );
if( !v10 )
LABEL_22:
LastSubsection = (_SUBSECTION *)v11;
else
LastSubsection = v10;
MiReferenceSubsection(LastSubsection, 0i64);
v18 = *((_DWORD *)LastSubsection + 11) - (*((_DWORD *)LastSubsection + 13) & 0x3FFFFFFFu) - 1;
}
++*(_QWORD *)(v9 + 40);
MiBuildWakeList((_CONTROL_AREA *)v9, 4ui64);
v24 = v23;
MiRemoveUnusedSegment((_CONTROL_AREA *)v9);
if( a5 == 1 )
*(_DWORD *)(v9 + 56) |= 4u;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v9 + 72));
__writecr8(v8);
MiReleaseControlAreaWaiters(v24);
v25 = *((_QWORD *)LastSubsection + 1);
*(_QWORD *)a6 = v9;
*(_QWORD *)(a6 + 8) = v21;
*(_QWORD *)(a6 + 16) = v25 + 8 * v18;
result = 259i64;
*(_QWORD *)(a6 + 24) = v11;
*(_QWORD *)(a6 + 32) = LastSubsection;
*(_DWORD *)(a6 + 40) = v20;
return result;
}Referenced by:
MiComputeFlushRange
MmPurgeSection