MiAddRangeToCrashDump

NTSTATUS __stdcall MiAddRangeToCrashDump(
        _MM_KERNEL_DUMP_CONTEXT *Context,
        _MMPTE *PointerPxe,
        _MMPTE *EndPxe,
        _MI_VA_RANGE *VaHierarchy,
        UINT64 PagingLevel){
  __int64 v5; 
  __int64 v6; 
  _MMPTE *v7; 
  NTSTATUS v9; 
  UINT64 v10; 
  UINT64 v11; 
  UINT64 v12; 
  UINT64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  NTSTATUS SystemRegionType; 
  _MI_VA_RANGE *v19; 
  union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4; 
  __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; 
  _MMPTE *v33; 
  NTSTATUS v34; 
  UINT64 v35; 
  union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *v36; 
  __int64 v37; 
  _MMPFN *v38; 
  int v39; 
  UINT64 v40; 
  unsigned __int64 v41; 
  _MMPTE *PteBase; 
  int v43; 
  UINT64 v45; 
  UINT64 v46; 
  _MI_VA_RANGE *VaHierarchya; 

  VaHierarchya = VaHierarchy;
  v5 = (unsigned int)PagingLevel;
  v6 = (__int64)PointerPxe;
  v7 = EndPxe;
  v9 = 0;
  if( (unsigned __int64)PointerPxe < *(_QWORD *)&VaHierarchy[4 * (int)PagingLevel] )
    v6 = *(_QWORD *)&VaHierarchy[4 * (int)PagingLevel];
  if( (unsigned __int64)EndPxe > *(_QWORD *)&VaHierarchy[4 * (int)PagingLevel + 2] )
    v7 = *(_MMPTE **)&VaHierarchy[4 * (int)PagingLevel + 2];
  while( v6 <= (unsigned __int64)v7 )
  {
    if( (_DWORD)v5 == 3 )
      KdCheckForDebugBreak();
    LODWORD(v10) = MI_READ_PTE_LOCK_FREE(v6);
    v46 = v10;
    v11 = v10;
    v12 = v10 & 1;
    if( (v10 & 1) != 0 )
    {
      v13 = v10;
      MiPteInShadowRange((UINT64)&v46);
      v14 = (v13 >> 12) & 0xFFFFFFFFFi64;
      if( v14 == MiState[(int)v5 + 1185] || v14 == MiState[(int)v5 + 1181] )
        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 = VaHierarchya;
      if( VaHierarchya[20] == 1 && SystemRegionType == 1 )
        goto LABEL_64;
      if( SystemRegionType == 8 )
        goto LABEL_64;
    }
    else
    {
      v19 = VaHierarchya;
    }
    if( (_DWORD)v5 )
    {
      p_u4 = &MmGetPfnDb()->u4;
      if( (v11 & 0x80u) != 0i64 )
      {
        if( (((unsigned __int64)p_u4[6 * v14]._bf_0 >> 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 + 9);
        v27 = *((_QWORD *)v19 + 8) & 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( (((unsigned __int64)p_u4[6 * v14]._bf_0 >> 50) & 1) != 0 )
      {
        v32 = (*(__int64(__fastcall **)(_MM_KERNEL_DUMP_CONTEXT *, __int64, __int64))Context)(Context, v14, 1i64);
        if( v32 < 0 && v9 >= 0 )
          v9 = v32;
      }
      v33 = (_MMPTE *)(((v6 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
      LODWORD(v45) = v5 - 1;
      v34 = MiAddRangeToCrashDump(Context, v33, v33 + 511, VaHierarchya, v45);
      if( v34 < 0 && v9 >= 0 )
        v9 = v34;
    }
    else
    {
      if( !v12 )
      {
        if( (v11 & 0x400) != 0 || (v11 & 0x800) == 0 )
          goto LABEL_64;
        v35 = v11;
        if( *(&stru_140C4DB30 + 42) && (v11 & 0x10) == 0 )
          v35 = v11 & ~*(&stru_140C4DB30 + 42);
        v14 = (v35 >> 12) & 0xFFFFFFFFFi64;
      }
      v36 = &MmGetPfnDb()->u4;
      v37 = ((unsigned __int64)v36[6 * v14]._bf_0 >> 50) & 1;
      if( (((unsigned __int64)v36[6 * v14]._bf_0 >> 50) & 1) != 0 )
      {
        v38 = &MmGetPfnDb()[v14];
        LOBYTE(v39) = MiIsPageSecured((INT64)v38);
        if( !v39 )
        {
          if( MiGetSystemRegionType(v40) == 9 )
          {
            v41 = v38->PteLong | 0x8000000000000000ui64;
            PteBase = MmGetPteBase();
            if( v41 <= (unsigned __int64)&PteBase[0x7FFFFFFEFi64]
              && v41 >= (unsigned __int64)PteBase
              && ((v38->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 0
               || (*(_BYTE *)(&v38->u3 + 1) & 7) != 6
               || (v38->u4._bf_0 & 0xFFFFFFFFFi64) != 0xFFFFFFFFDi64)
              && v14 != *(&stru_140C4DB30 + 304) )
            {
              LODWORD(v37) = 0;
            }
          }
          if( (_DWORD)v37 == 1 )
          {
            v28 = 2i64;
            v31 = 1i64;
            v27 = v14;
LABEL_61:
            v43 = (*(__int64(__fastcall **)(_MM_KERNEL_DUMP_CONTEXT *, unsigned __int64, unsigned __int64, __int64))Context)(
                    Context,
                    v27,
                    v31,
                    v28);
            if( v43 < 0 && v9 >= 0 )
              v9 = v43;
          }
        }
      }
    }
LABEL_64:
    v6 += 8i64;
  }
  return v9;
}

Referenced by:

MiAddRangeToCrashDump
MmAddRangeToCrashDump