MiPfIssueCoalescedSupport

_MMINPAGE_SUPPORT *__stdcall MiPfIssueCoalescedSupport(_LIST_ENTRY *CoalescedList, UINT64 CoalescedSize){
  _LARGE_INTEGER v2; 
  __int64 v3; 
  _MMINPAGE_SUPPORT *result; 
  _MMINPAGE_SUPPORT *v6; 
  $DA99D4CD11841341409C225E54F97692 *v7; 
  int v8; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v10; 
  _LIST_ENTRY *Blink; 
  _FILE_OBJECT *v12; 
  ULONG v13; 
  unsigned __int64 v14; 
  size_t v15; 
  unsigned __int64 v16; 
  __int64 Blink_low; 
  NTSTATUS v18; 
  UINT64 Flags; 
  _LARGE_INTEGER StartingOffset; 
  _FILE_OBJECT *FileObject; 

  v2.QuadPart = 0i64;
  v3 = (unsigned int)CoalescedSize;
  StartingOffset.QuadPart = 0i64;
  result = (_MMINPAGE_SUPPORT *)MiAllocatePool(64i64, 8 * ((unsigned int)CoalescedSize >> 12) + 320, 0x7343694Dui64);
  v6 = result;
  if( result )
  {
    MiInitializeInPageSupport(result, 0i64);
    v6->u1.e1._bf_0 |= 0x800000u;
    v6->Mdl.Next = 0i64;
    v7 = &v6->320;
    v6->Mdl.MdlFlags = 0;
    v8 = 0;
    v6->Mdl.Size = 8 * (((unsigned __int64)(v3 + 4095) >> 12) + 6);
    v6->Mdl.StartVa = 0i64;
    v6->Mdl.ByteOffset = 0;
    v6->Mdl.ByteCount = v3;
    v6->Mdl.MdlFlags |= 0x4042u;
    FileObject = (_FILE_OBJECT *)MmBadPointer;
    while( 1 )
    {
      Flink = CoalescedList->Flink;
      if( CoalescedList->Flink == CoalescedList )
        break;
      if( Flink->Blink != CoalescedList
        || (v10 = Flink->Flink, Flink->Flink->Blink != Flink)
        || (CoalescedList->Flink = v10,
            v10->Blink = CoalescedList,
            Blink = v6->ListHead[0].Blink,
            Blink->Flink != v6->ListHead) )
      {
        __fastfail(3u);
      }
      Flink->Blink = Blink;
      Flink->Flink = v6->ListHead;
      Blink->Flink = Flink;
      v6->ListHead[0].Blink = Flink;
      if( (WORD1(Flink[17].Blink) & 0x4000) == 0 )
        v6->Mdl.MdlFlags &= ~0x4000u;
      if( v8 )
      {
        if( (_LIST_ENTRY *)v2.QuadPart != Flink[6].Flink )
        {
          v6->Mdl.MdlFlags &= ~0x4000u;
          v13 = LODWORD(Flink[6].Flink) - v2.anonymous_0.LowPart;
          v14 = (unsigned __int64)(8 * (v13 >> 12)) >> 3;
          memset64(v7, *(&stru_140C4DB30 + 497), v14);
          v7 = ($DA99D4CD11841341409C225E54F97692 *)((char *)v7 + 8 * v14);
          v2.QuadPart += v13;
          v8 += v13;
        }
      }
      else
      {
        v2 = (_LARGE_INTEGER)Flink[6].Flink;
        v12 = (_FILE_OBJECT *)Flink[12].Blink;
        StartingOffset = v2;
        FileObject = v12;
      }
      v15 = 8 * (LODWORD(Flink[11].Blink) >> 12);
      v16 = v15;
      memmove(v7, &Flink[20], v15);
      Blink_low = LODWORD(Flink[11].Blink);
      v2.QuadPart += Blink_low;
      v8 += Blink_low;
      v7 = ($DA99D4CD11841341409C225E54F97692 *)((char *)v7 + 8 * (v16 >> 3));
    }
    LODWORD(Flags) = 6;
    v18 = IoPageReadEx(FileObject, &v6->Mdl, &StartingOffset, (_KEVENT *)&v6->ListHead[1], &v6->IoStatus, Flags, 0i64);
    if( v18 < 0 )
    {
      v6->IoStatus.Information = 0i64;
      v6->IoStatus.Status = v18;
      KeSetEvent((PRKEVENT)&v6->ListHead[1], 0, 0);
    }
    return v6;
  }
  return result;
}

Referenced by:

MiPfIssueCoalesceCandidates