MiGetHardFaultPages

VOID __stdcall 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; 
  INT64 v16; 
  INT64 v17; 
  UINT64 v18; 
  _MI_PFN_CACHE_ATTRIBUTE v19; 
  UINT64 v20; 
  PVOID *v21; 
  _MMPFN *PageChain; 
  __int64 v23; 
  __int64 v24; 
  _MMPFN *v25; 
  _MMPFN *v26; 
  UINT64 v27; 
  UINT64 v28; 
  _SUBSECTION *v29; 
  UINT64 v30; 
  UINT64 v31; 
  _MI_PARTITION *v32; 
  __int64 v33; 

  v32 = a3;
  LODWORD(v31) = 0;
  v8 = *(_MMPFN **)a1;
  v9 = a3;
  PfnDb = MmGetPfnDb();
  if( *(_QWORD *)a1 )
  {
    v12 = v8 - PfnDb;
    while( 1 )
    {
      v24 = v8->u2._bf_0 & 0xFFFFFFFFFi64;
      if( v24 == 0xFFFFFFFFFi64 )
        break;
      v8 = &PfnDb[v24];
    }
  }
  else
  {
    v12 = 0xFFFFFFFFFi64;
  }
  v13 = *(_QWORD *)(NumberOfPages + 208);
  v14 = (*(unsigned __int16 *)(v13 + 32) >> 1) & 0x1F;
  if( r9 )
  {
    if( *(_BYTE *)r9 == 1 )
    {
      LODWORD(v27) = MiGetAvailablePagesBelowPriority(a3, ((*(_DWORD *)(r9 + 80) >> 3) & 7u) + 1);
      if( a2 > v27 )
      {
        if( !v27 )
          return;
        a2 = v27;
      }
    }
  }
  v15 = MiUseSlabAllocator((__int64)v9, (_BYTE *)v13, a7, &v31);
  v17 = a5;
  if( v15 && *(_QWORD *)(a1 + 8) < a2 )
  {
    while( 1 )
    {
      LODWORD(v30) = 0;
      LODWORD(v23) = MiGetSlabPage(v16, v14, (unsigned int)v31, (INT64 *)(v17 + 120), v30);
      v33 = v23;
      if( v23 == -1 )
        break;
      v25 = &MmGetPfnDb()[v23];
      MiSetPfnBlink(v25, v12, 0i64);
      v26 = v25;
      v12 = v33;
      v16 = (INT64)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 = *(_SUBSECTION **)(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,
                  (unsigned int)v19,
                  v30,
                  0xFFFFFFFFFFFFFFFFui64,
                  &NumberOfPages);
    if( PageChain )
    {
      if( *(_QWORD *)a1 )
        MiSetPfnBlink(v8, PageChain - PfnDb, 0i64);
      else
        *(_QWORD *)a1 = PageChain;
      *(_QWORD *)(a1 + 8) += (unsigned int)NumberOfPages;
    }
  }
}

Referenced by:

MiBuildMdlForMappedFileFault