MiPfCoalesceAndIssueIOs
VOID __stdcall MiPfCoalesceAndIssueIOs(
_LIST_ENTRY *BuiltInPageSupportHead,
_LIST_ENTRY *IssuedInPageSupportsHead,
UINT64 *BuiltSize){
unsigned int v3;
_LIST_ENTRY *v4;
_LIST_ENTRY *v8;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v10;
unsigned int Blink;
_LIST_ENTRY *v12;
_LIST_ENTRY *v13;
_LIST_ENTRY *v14;
_LIST_ENTRY *v15;
unsigned __int64 v16;
unsigned int v17;
_LIST_ENTRY *v18;
_LIST_ENTRY *v19;
_LIST_ENTRY *v20;
_LIST_ENTRY *v21;
_LIST_ENTRY *v22;
_LIST_ENTRY CandidateListHead;
v3 = 0;
CandidateListHead.Blink = &CandidateListHead;
v4 = 0i64;
CandidateListHead.Flink = &CandidateListHead;
v8 = 0i64;
while( 1 )
{
Flink = BuiltInPageSupportHead->Flink;
if( BuiltInPageSupportHead->Flink == BuiltInPageSupportHead )
break;
Blink = (unsigned int)Flink[11].Blink;
if( Blink < 0x100000 )
{
if( CandidateListHead.Flink != &CandidateListHead )
{
LABEL_29:
v15 = Flink[6].Flink;
goto LABEL_20;
}
if( BuiltSize && *BuiltSize < 0x100000 )
goto LABEL_5;
v4 = Flink[6].Flink;
v8 = Flink[12].Blink;
v15 = v4;
LABEL_20:
if( (__int64)v4 <= (__int64)v15
&& v8 == Flink[12].Blink
&& (v16 = (char *)v15 - (char *)v4, v17 = Blink + v16, v16 <= 0x20000)
&& v17 + v3 <= 0x100000 )
{
v18 = Flink->Flink;
if( Flink->Flink->Blink != Flink )
goto LABEL_36;
v19 = Flink->Blink;
if( v19->Flink != Flink )
goto LABEL_36;
v19->Flink = v18;
v18->Blink = v19;
v20 = CandidateListHead.Blink;
if( CandidateListHead.Blink->Flink != &CandidateListHead )
goto LABEL_36;
Flink->Blink = CandidateListHead.Blink;
Flink->Flink = &CandidateListHead;
v3 += v17;
v20->Flink = Flink;
v4 = (_LIST_ENTRY *)((char *)v4 + v17);
CandidateListHead.Blink = Flink;
if( BuiltSize )
*BuiltSize -= LODWORD(Flink[11].Blink);
}
else
{
if( MiPfIssueCoalesceCandidates(&CandidateListHead, v3, IssuedInPageSupportsHead) < 0 )
goto LABEL_5;
v3 = 0;
}
}
else
{
if( CandidateListHead.Flink != &CandidateListHead )
goto LABEL_29;
v12 = Flink->Flink;
if( Flink->Flink->Blink != Flink )
goto LABEL_36;
v13 = Flink->Blink;
if( v13->Flink != Flink )
goto LABEL_36;
v13->Flink = v12;
v12->Blink = v13;
if( BuiltSize )
*BuiltSize -= LODWORD(Flink[11].Blink);
MiIssueHardFaultIo((_MMINPAGE_SUPPORT *)Flink, 0i64, 0i64);
v14 = IssuedInPageSupportsHead->Blink;
if( v14->Flink != IssuedInPageSupportsHead )
LABEL_36:
__fastfail(3u);
Flink->Flink = IssuedInPageSupportsHead;
Flink->Blink = v14;
v14->Flink = Flink;
IssuedInPageSupportsHead->Blink = Flink;
}
}
if( CandidateListHead.Flink != &CandidateListHead )
MiPfIssueCoalesceCandidates(&CandidateListHead, v3, IssuedInPageSupportsHead);
LABEL_5:
if( !BuiltSize )
{
while( 1 )
{
v10 = BuiltInPageSupportHead->Flink;
if( BuiltInPageSupportHead->Flink == BuiltInPageSupportHead )
break;
if( v10->Blink != BuiltInPageSupportHead )
goto LABEL_36;
v21 = v10->Flink;
if( v10->Flink->Blink != v10 )
goto LABEL_36;
BuiltInPageSupportHead->Flink = v21;
v21->Blink = BuiltInPageSupportHead;
MiIssueHardFaultIo((_MMINPAGE_SUPPORT *)v10, 0i64, 0i64);
v22 = IssuedInPageSupportsHead->Blink;
if( v22->Flink != IssuedInPageSupportsHead )
goto LABEL_36;
v10->Flink = IssuedInPageSupportsHead;
v10->Blink = v22;
v22->Flink = v10;
IssuedInPageSupportsHead->Blink = v10;
}
}
}Referenced by:
MiPfCompletePrefetchIos
MiPrefetchVirtualMemory