MiAddRangeToCrashDump

__int64 __fastcall MiAddRangeToCrashDump(
        __int64 (__fastcall **a1)(_QWORD, __int64, __int64),
        unsigned __int64 a2,
        unsigned __int64 a3,
        __int64 a4,
        unsigned int a5){
  __int64 v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  int v9; 
  INT64 v10; 
  unsigned __int64 v11; 
  INT64 v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  int SystemRegionType; 
  __int64 v19; 
  char *v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  unsigned __int64 v27; 
  __int64 v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 
  unsigned __int64 v31; 
  int v32; 
  __int64 v33; 
  int v34; 
  unsigned __int64 v35; 
  char *v36; 
  __int64 v37; 
  char *v38; 
  UINT64 v39; 
  unsigned __int64 v40; 
  _MMPTE *PteBase; 
  int v42; 
  UINT64 v44; 
  __int64 v45; 
  v45 = a4;
  v5 = a5;
  v6 = a2;
  v7 = a3;
  v9 = 0;
  if( a2 < *(_QWORD *)(a4 + 16i64 * (int)a5) )
    v6 = *(_QWORD *)(a4 + 16i64 * (int)a5);
  if( a3 > *(_QWORD *)(a4 + 16i64 * (int)a5 + 8) )
    v7 = *(_QWORD *)(a4 + 16i64 * (int)a5 + 8);
  while( v6 <= v7 )
  {
    if( (_DWORD)v5 == 3 )
      KdCheckForDebugBreak();
    v10 = MI_READ_PTE_LOCK_FREE(v6);
    v44 = v10;
    v11 = v10;
    v12 = v10 & 1;
    if( (v10 & 1) != 0 )
    {
      v13 = v10;
      MiPteInShadowRange((UINT64)&v44);
      v14 = (v13 >> 12) & 0xFFFFFFFFFi64;
      if( v14 == *(_QWORD *)&MiState[8 * (int)v5 + 9480] || v14 == *(_QWORD *)&MiState[8 * (int)v5 + 9448] )
        goto LABEL_64;
    }
    else
    {
      if( (_DWORD)v5 )
        goto LABEL_64;
      v14 = 0i64;
    }
    if( (_DWORD)v5 == 3 )
    {
      if( (_MMPTE *)v6 == MmGetPxeSelfRef() )
        goto LABEL_64;
      v15 = v6;
      v16 = (_QWORD)MmGetPteBase() << 25;
      v17 = 4i64;
      do
      {
        v15 = ((v15 << 25) - v16) >> 16;
        --v17;
      }
      while( v17 );
      SystemRegionType = MiGetSystemRegionType(v15);
      v19 = v45;
      if( *(_DWORD *)(v45 + 80) == 1 && SystemRegionType == 1 )
        goto LABEL_64;
      if( SystemRegionType == 8 )
        goto LABEL_64;
    }
    else
    {
      v19 = v45;
    }
    if( (_DWORD)v5 )
    {
      v20 = (char *)MmGetPfnDb() + 40;
      if( (v11 & 0x80u) != 0i64 )
      {
        if( ((*(_QWORD *)&v20[48 * v14] >> 50) & 1) == 0 )
          goto LABEL_64;
        v21 = (_QWORD)MmGetPteBase() << 25;
        v22 = (v6 << 25) - v21;
        v23 = (v22 + 0x10000000) >> 16;
        v24 = v22 >> 16;
        if( (int)v5 > 0 )
        {
          v25 = v5;
          do
          {
            v24 = (__int64)((v24 << 25) - v21) >> 16;
            v23 = ((v23 << 25) - v21) >> 16;
            --v25;
          }
          while( v25 );
        }
        v26 = *(_QWORD *)(v19 + 72);
        v27 = *(_QWORD *)(v19 + 64) & 0xFFFFFFFFFFFFF000ui64;
        v28 = 1i64;
        v29 = v23 - 1;
        if( v24 >= v27 )
          v27 = v24;
        v30 = v26 | 0xFFF;
        if( v29 <= v30 )
          v30 = v29;
        v31 = (v30 - v27 + 1) >> 12;
        goto LABEL_61;
      }
      if( ((*(_QWORD *)&v20[48 * v14] >> 50) & 1) != 0 )
      {
        v32 = (*a1)(a1, v14, 1i64);
        if( v32 < 0 && v9 >= 0 )
          v9 = v32;
      }
      v33 = (__int64)((v6 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
      v34 = MiAddRangeToCrashDump(a1, v33, v33 + 4088, v45, (int)v5 - 1);
      if( v34 < 0 && v9 >= 0 )
        v9 = v34;
    }
    else
    {
      if( !v12 )
      {
        if( (v11 & 0x400) != 0 || (v11 & 0x800) == 0 )
          goto LABEL_64;
        v35 = v11;
        if( qword_140C4DC80 && (v11 & 0x10) == 0 )
          v35 = v11 & ~qword_140C4DC80;
        v14 = (v35 >> 12) & 0xFFFFFFFFFi64;
      }
      v36 = (char *)MmGetPfnDb() + 40;
      v37 = (*(_QWORD *)&v36[48 * v14] >> 50) & 1i64;
      if( ((*(_QWORD *)&v36[48 * v14] >> 50) & 1) != 0 )
      {
        v38 = (char *)MmGetPfnDb() + 48 * v14;
        if( !MiIsPageSecured((INT64)v38) )
        {
          if( (unsigned int)MiGetSystemRegionType(v39) == 9 )
          {
            v40 = *((_QWORD *)v38 + 1) | 0x8000000000000000ui64;
            PteBase = MmGetPteBase();
            if( v40 <= (unsigned __int64)PteBase + 0x3FFFFFFF78i64
              && v40 >= (unsigned __int64)PteBase
              && ((*((_QWORD *)v38 + 3) & 0x3FFFFFFFFFFFFFFFi64) == 0
               || (v38[34] & 7) != 6
               || (*((_QWORD *)v38 + 5) & 0xFFFFFFFFFi64) != 0xFFFFFFFFDi64)
              && v14 != qword_140C4E4B0 )
            {
              LODWORD(v37) = 0;
            }
          }
          if( (_DWORD)v37 == 1 )
          {
            v28 = 2i64;
            v31 = 1i64;
            v27 = v14;
LABEL_61:
            v42 = ((__int64(__fastcall *)(__int64(__fastcall **)(_QWORD, __int64, __int64), unsigned __int64, unsigned __int64, __int64))*a1)(
                    a1,
                    v27,
                    v31,
                    v28);
            if( v42 < 0 && v9 >= 0 )
              v9 = v42;
          }
        }
      }
    }
LABEL_64:
    v6 += 8i64;
  }
  return(unsigned int)v9;
}

Referenced by:

MiAddRangeToCrashDump
MmAddRangeToCrashDump