MmGetDumpRange

VOID __stdcall MmGetDumpRange(PVOID Context, _MM_DUMP_TYPE DumpType, UINT64 Flags){
  _MMPFN *PfnDb; 
  char v4; 
  _KPRCB **v6; 
  __int64 v7; 
  signed __int64 v8; 
  char *v9; 
  char *v10; 
  PHYSICAL_MEMORY_DESCRIPTOR *v11; 
  unsigned int i; 
  __int64 PageCount; 
  __int64 BasePage; 
  unsigned int v15; 
  unsigned int v16; 
  int v17; 
  int v18; 
  __int64 v19; 
  unsigned int v20; 
  unsigned int v21; 
  _QWORD *v22; 
  __int64 j; 
  unsigned __int64 v24; 
  unsigned int v25; 
  unsigned int v26; 
  __int64 v27; 
  __int64 v28; 
  _MMPFN *v29; 
  _MMPFN *v30; 
  unsigned __int64 v31; 
  _MMPFN *v32; 
  signed __int64 v33; 
  int v34; 

  PfnDb = MmGetPfnDb();
  v4 = Flags;
  if( DumpType )
  {
    v11 = MmPhysicalMemoryBlock;
    for( i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; ++i )
    {
      PageCount = v11->Run[i].PageCount;
      BasePage = v11->Run[i].BasePage;
      if( (MiFlags & 0x8000) != 0 )
        MiAddNonSecuredPagesToDump(
          (__int64(__fastcall **)(_QWORD, __int64, __int64, __int64))Context,
          BasePage,
          PageCount);
      else(*(void(__fastcall **)(PVOID, __int64, __int64, __int64))Context)(Context, BasePage, PageCount, 2i64);
      v11 = MmPhysicalMemoryBlock;
    }
  }
  else
  {
    if( (_DWORD)KeNumberProcessors_0 )
    {
      v6 = &KiProcessorBlock;
      v7 = (unsigned int)KeNumberProcessors_0;
      do
      {
        (*(void(__fastcall **)(PVOID, unsigned __int64, __int64, __int64))Context)(
          Context,
          (*v6++)->CurrentThread->Tcb.ApcState.Process->Pcb.DirectoryTableBase >> 12,
          1i64,
          2i64);
        --v7;
      }
      while( v7 );
      PfnDb = MmGetPfnDb();
    }
    MmAddRangeToCrashDump((_MM_KERNEL_DUMP_CONTEXT *)Context, (VOID *)0xFFFF800000000000i64, 0x800000000000ui64);
    if( (v4 & 1) != 0 && (KiBugCheckActive & 3) != 0 )
      MmAddRangeToCrashDump((_MM_KERNEL_DUMP_CONTEXT *)Context, 0i64, 0x7FFFFFFF0000ui64);
    v8 = __readcr3();
    (*(void(__fastcall **)(PVOID, signed __int64, __int64, __int64))Context)(Context, v8 / 4096, 1i64, 2i64);
    if( (v4 & 2) != 0 )
    {
      MiAddPhysicalPagesToCrashDump((_MM_KERNEL_DUMP_CONTEXT *)Context);
      MmRemoveSystemCacheFromDump((_MM_KERNEL_DUMP_CONTEXT *)Context);
    }
    v9 = (char *)qword_140C4C618;
    while( v9 )
    {
      v10 = v9;
      v9 = *(char **)v9;
      (*((void(__fastcall **)(PVOID, signed __int64, __int64, __int64))Context + 1))(
        Context,
        (v10 - (char *)PfnDb) / 48,
        1i64,
        2i64);
    }
  }
  v15 = 0;
  while( 1 )
  {
    v16 = v15 < **(&stru_140C4DB30 + 263) ? v15 : 0;
    v17 = **(&stru_140C4DB30 + 263) - 1;
    v18 = (*(_DWORD *)(*(&stru_140C4DB30 + 263) + 8i64) & 4) != 0i64 ? 0x20 : 0;
    v19 = *(_QWORD *)(*(&stru_140C4DB30 + 263) + 8i64)
        - ((*(_QWORD *)(*(&stru_140C4DB30 + 263) + 8i64) & 4i64) != 0 ? 4 : 0);
    while( 1 )
    {
      v20 = v18 + v17;
      if( v17 - v16 == -1 )
        goto LABEL_23;
      v22 = (_QWORD *)(v19 + 8 * ((unsigned __int64)(v18 + v16) >> 6));
      for( j = ~*v22 | ((1i64 << ((v18 + v16) & 0x3F)) - 1); j == -1; j = ~*v22 )
      {
        if( (unsigned __int64)++v22 > v19 + 8 * ((unsigned __int64)v20 >> 6) )
          goto LABEL_23;
      }
      _BitScanForward64(&v24, ~j);
      v21 = v24 + ((unsigned int)(((__int64)v22 - v19) >> 3) << 6);
      if( v21 > v20 )
      {
LABEL_23:
        v21 = -1;
      }
      else if( v21 != -1 )
      {
        break;
      }
      if( !v16 )
        break;
      v25 = v15 + 1;
      v16 = 0;
      if( v15 + 1 > **(&stru_140C4DB30 + 263) )
        v25 = **(&stru_140C4DB30 + 263);
      v17 = v25 - 1;
    }
    v26 = v21 - v18;
    if( v21 == -1 )
      v26 = -1;
    if( v26 < v15 || v26 == -1 )
      break;
    v15 = v26 + 1;
    v27 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * v26);
    if( (*(_DWORD *)(v27 + 4) & 2) != 0 )
    {
      v28 = *(_QWORD *)(v27 + 4112);
      if( v28 != 0xFFFFFFFFFi64 )
      {
        v29 = MmGetPfnDb();
        do
        {
          (*((void(__fastcall **)(PVOID, __int64, __int64, __int64))Context + 1))(Context, v28, 1i64, 2i64);
          v28 = v29[v28].u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 & 0xFFFFFFFFFi64;
        }
        while( v28 != 0xFFFFFFFFFi64 );
      }
    }
  }
  if( *(&stru_140C4DB30 + 2568) == 1 )
  {
    v30 = MmGetPfnDb();
    v31 = (unsigned __int64)v30;
    v32 = &v30[*(&stru_140C50B28 + 852)];
    if( v30 <= v32 )
    {
      do
      {
        v33 = v31 - (_QWORD)v30;
        if( (*((_BYTE *)&MmGetPfnDb()->u3 + v31 - (_QWORD)v30 + 3) & 0x40) != 0
          || (LOBYTE(v34) = MiIsPageOnBadList(v31), v34) )
        {
          (*((void(__fastcall **)(PVOID, signed __int64, __int64, __int64))Context + 1))(Context, v33 / 48, 1i64, 2i64);
        }
        v31 += 48i64;
        v30 = MmGetPfnDb();
      }
      while( v31 <= (unsigned __int64)v32 );
    }
  }
  if( *(&stru_140C4DB30 + 530) )
    MiRemoveEnclavePagesFromDump((__int64)Context);
}

Referenced by:

IoWriteCrashDump