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