IoSetDumpRange

__int64 __fastcall IoSetDumpRange(__int64 a1, char *a2, unsigned __int64 a3, unsigned int a4){
  unsigned int v5; 
  unsigned __int64 v6; 
  char *v7; 
  unsigned __int64 v9; 
  unsigned int v10; 
  unsigned int v11; 
  unsigned int v12; 
  UINT8 *v13; 
  unsigned __int64 v14; 
  unsigned int v15; 
  _QWORD *v16; 
  unsigned __int64 v17; 
  char v18; 
  PHYSICAL_ADDRESS PhysicalAddress; 
  int v20; 
  UINT64 v22; 
  v5 = a4 & 0xF;
  v6 = a3;
  v7 = a2;
  if( v5 == 1 )
  {
    v9 = (unsigned __int64)MmGetPhysicalAddress(a2).QuadPart >> 12;
    LODWORD(v22) = 0;
    v10 = IopAddPageToPageMap(
            *(_QWORD *)(a1 + 24),
            *(_QWORD *)(a1 + 16),
            *(UINT64 **)(a1 + 32),
            v9,
            v6,
            *(_BYTE *)(a1 + 40) & 1,
            v22);
LABEL_20:
    v11 = v10;
  }
  else
  {
    if( v5 == 2 )
    {
      v11 = -1073741503;
      v12 = 0;
      if( *(_DWORD *)MmPhysicalMemoryBlock )
      {
        v13 = MmPhysicalMemoryBlock + 24;
        do
        {
          v14 = *((_QWORD *)v13 - 1);
          if( v14 > (unsigned __int64)v7 )
            break;
          if( *(_QWORD *)v13 + v14 > (unsigned __int64)v7 )
          {
            if( v6 > *(_QWORD *)&MmPhysicalMemoryBlock[16 * v12 + 16]
                    + *(_QWORD *)&MmPhysicalMemoryBlock[16 * v12 + 24]
                    - (_QWORD)v7 )
              break;
LABEL_19:
            LODWORD(v22) = a4;
            v10 = IopAddPageToPageMap(
                    *(_QWORD *)(a1 + 24),
                    *(_QWORD *)(a1 + 16),
                    *(UINT64 **)(a1 + 32),
                    (UINT64)v7,
                    v6,
                    *(_BYTE *)(a1 + 40) & 1,
                    v22);
            goto LABEL_20;
          }
          ++v12;
          v13 += 16;
        }
        while( v12 < *(_DWORD *)MmPhysicalMemoryBlock );
      }
      if( SpecialMemoryRanges )
      {
        v15 = 0;
        if( *(_DWORD *)SpecialMemoryRanges )
        {
          v16 = (_QWORD *)(SpecialMemoryRanges + 24);
          while( 1 )
          {
            v17 = *(v16 - 1);
            if( v17 > (unsigned __int64)v7 )
              break;
            if( *v16 + v17 > (unsigned __int64)v7 )
            {
              if( v6 > *(_QWORD *)(SpecialMemoryRanges + 16i64 * v15 + 16)
                      + *(_QWORD *)(SpecialMemoryRanges + 16i64 * v15 + 24)
                      - (_QWORD)v7 )
                goto LABEL_30;
              goto LABEL_19;
            }
            ++v15;
            v16 += 2;
            if( v15 >= *(_DWORD *)SpecialMemoryRanges )
              goto LABEL_30;
          }
        }
      }
      goto LABEL_30;
    }
    v18 = 1;
    if( !a3 )
      return 0;
    do
    {
      if( MmIsAddressValidEx((INT64)v7) )
      {
        PhysicalAddress = MmGetPhysicalAddress(v7);
        LODWORD(v22) = 0;
        v20 = IopAddPageToPageMap(
                *(_QWORD *)(a1 + 24),
                *(_QWORD *)(a1 + 16),
                *(UINT64 **)(a1 + 32),
                (unsigned __int64)PhysicalAddress.QuadPart >> 12,
                1ui64,
                *(_BYTE *)(a1 + 40) & 1,
                v22);
        if( v20 == -1073741789 )
          return 3221225507i64;
        if( v20 < 0 )
          v18 = 0;
      }
      v7 += 4096;
      --v6;
    }
    while( v6 );
    if( v18 == 1 )
      return 0;
    v11 = -1073741503;
  }
  if( v11 == -1073741503 )
  {
LABEL_30:
    if( (*(_BYTE *)(a1 + 40) & 1) != 0 )
      return 0;
  }
  return v11;
}

Referenced by:

IoSetDumpRangeForPartialKernelDump
IopAddPageDumpRange