MiGetHardFaultPages

VOID __fastcall MiGetHardFaultPages(
        INT64 a1,
        UINT64 a2,
        _MI_PARTITION *a3,
        INT64 r9,
        INT64 a5,
        UINT64 NumberOfPages,
        INT64 a7){
  _MMPFN *v8; 
  _MI_PARTITION *v9; 
  _MMPFN *PfnDb; 
  __int64 v12; 
  __int64 v13; 
  unsigned int v14; 
  int v15; 
  UINT64 v16; 
  INT64 v17; 
  UINT64 v18; 
  unsigned int v19; 
  UINT64 v20; 
  _MI_PARTITION *v21; 
  _MMPFN *PageChain; 
  INT64 SlabPage; 
  __int64 v24; 
  _MMPFN *v25; 
  _MMPFN *v26; 
  UINT64 AvailablePagesBelowPriority; 
  UINT64 v28; 
  ULONG_PTR v29; 
  UINT64 v30; 
  unsigned int a4; 
  _MI_PARTITION *v32; 
  __int64 v33; 
  v32 = a3;
  a4 = 0;
  v8 = *(_MMPFN **)a1;
  v9 = a3;
  PfnDb = MmGetPfnDb();
  if( *(_QWORD *)a1 )
  {
    v12 = (v8 - PfnDb) / 48;
    while( 1 )
    {
      v24 = *((_QWORD *)v8 + 3) & 0xFFFFFFFFFi64;
      if( v24 == 0xFFFFFFFFFi64 )
        break;
      v8 = (_MMPFN *)((char *)PfnDb + 48 * v24);
    }
  }
  else
  {
    v12 = 0xFFFFFFFFFi64;
  }
  v13 = *(_QWORD *)(NumberOfPages + 208);
  v14 = (*(unsigned __int16 *)(v13 + 32) >> 1) & 0x1F;
  if( r9 )
  {
    if( *(_BYTE *)r9 == 1 )
    {
      AvailablePagesBelowPriority = MiGetAvailablePagesBelowPriority(a3, ((*(_DWORD *)(r9 + 80) >> 3) & 7u) + 1);
      if( a2 > AvailablePagesBelowPriority )
      {
        if( !AvailablePagesBelowPriority )
          return;
        a2 = AvailablePagesBelowPriority;
      }
    }
  }
  v15 = MiUseSlabAllocator((INT64)v9, (_BYTE *)v13, a7, &a4);
  v17 = a5;
  if( v15 && *(_QWORD *)(a1 + 8) < a2 )
  {
    while( 1 )
    {
      LODWORD(v30) = 0;
      SlabPage = MiGetSlabPage(v16, v14, a4, (INT64 *)(v17 + 120), v30);
      v33 = SlabPage;
      if( SlabPage == -1 )
        break;
      v25 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * SlabPage);
      MiSetPfnBlink(v25, v12, 0i64);
      v26 = v25;
      v12 = v33;
      v16 = (UINT64)v32;
      if( *(_QWORD *)a1 )
        v26 = v8;
      ++*(_QWORD *)(a1 + 8);
      v8 = v26;
      *(_QWORD *)a1 = v25;
      if( *(_QWORD *)(a1 + 8) >= a2 )
        goto LABEL_15;
    }
    if( *(_QWORD *)(v17 + 120) )
    {
      v28 = NumberOfPages;
      *(_QWORD *)(v17 + 128) = a2 - *(_QWORD *)(a1 + 8);
      v29 = *(_QWORD *)(v28 + 208);
      *(_QWORD *)(v17 + 104) = v29;
      MiRetainSubsection(v29);
      a2 = *(_QWORD *)(a1 + 8);
    }
LABEL_15:
    PfnDb = MmGetPfnDb();
  }
  v18 = *(_QWORD *)(a1 + 8);
  if( v18 < a2 )
  {
    NumberOfPages = a2 - v18;
    v19 = MiProtectionToCacheAttribute(v14);
    LODWORD(v30) = 0;
    PageChain = MiGetPageChain(
                  v21,
                  *(_MMSUPPORT_INSTANCE **)(v17 + 56),
                  v20,
                  v19,
                  v30,
                  0xFFFFFFFFFFFFFFFFui64,
                  &NumberOfPages);
    if( PageChain )
    {
      if( *(_QWORD *)a1 )
        MiSetPfnBlink(v8, (PageChain - PfnDb) / 48, 0i64);
      else
        *(_QWORD *)a1 = PageChain;
      *(_QWORD *)(a1 + 8) += (unsigned int)NumberOfPages;
    }
  }
}

Referenced by:

MiBuildMdlForMappedFileFault