MiAllocateFileExtents

__int64 __fastcall MiAllocateFileExtents(ULONG_PTR BugCheckParameter2, unsigned int a2, ULONG_PTR a3, int a4, int a5){
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  UINT64 v12; 
  _FILE_OBJECT *v13; 
  ULONG i; 
  PHYSICAL_EXTENTS_DESCRIPTOR *v15; 
  INT64 v16; 
  PHYSICAL_EXTENTS_DESCRIPTOR *v17; 
  int v19; 
  __int64 v20; 
  int v21; 
  unsigned __int64 v22; 
  UINT64 *v23; 
  NTSTATUS v24; 
  ULONG_PTR v25; 
  int v26; 
  unsigned __int64 v27; 
  INT64 v28; 
  UINT64 v29; 
  int v30; 
  UINT64 v31; 
  _CONTROL_AREA *v32; 
  _MI_PARTITION *ControlAreaPartition; 
  int v34; 
  __int64 v35; 
  void *v36; 
  unsigned int v37; 
  ULONG NumberOfValidRuns; 
  int v39; 
  int v40; 
  unsigned int v41; 
  ULONG_PTR BugCheckParameter2a; 
  ULONG_PTR BugCheckParameter2b; 
  UINT64 v44; 
  unsigned __int64 v45; 
  UINT64 NumberOfPages; 
  __int64 v47; 
  _LARGE_INTEGER NumberOfBytes; 
  _LARGE_INTEGER StartAddress; 
  __int128 Node; 
  __int128 Node_16; 
  __int128 v52; 
  INT64 a2a[2]; 
  __int128 v54; 
  __int64 v55; 
  ULONG_PTR v56; 
  ULONG_PTR v57; 
  int v58; 
  int v59; 
  int v60; 
  NTSTATUS v61; 
  unsigned int v62; 
  v62 = a2;
  v41 = 0;
  NumberOfPages = 0i64;
  v44 = 0i64;
  v7 = a3;
  v8 = (unsigned int)(a4 << 12);
  BugCheckParameter2a = (unsigned int)v8;
  *(_OWORD *)a2a = 0i64;
  v55 = 0i64;
  v54 = 0i64;
  Node = 0i64;
  Node_16 = 0i64;
  v52 = 0i64;
  while( 2 )
  {
    v9 = *(_QWORD *)BugCheckParameter2;
    v10 = v8;
    v47 = v9;
    if( (*(_DWORD *)(v9 + 56) & 0x20) != 0 )
    {
      v40 = 1;
      if( *(_QWORD *)(BugCheckParameter2 + 8) )
        v11 = MiStartingOffset(BugCheckParameter2, v7, 0);
      else
        v11 = (unsigned __int64)a2 << 12;
      v12 = MiEndingOffset((_SUBSECTION *)BugCheckParameter2);
      v44 = v12;
      if( v11 == v12 && !v11 )
        return 0i64;
      if( v10 + v11 > v12 )
        v10 = ((unsigned int)(v12 - v11) + 511i64) & 0xFFFFFFFFFFFFFE00ui64;
    }
    else
    {
      v40 = 2;
      v11 = (a2
           + (*(unsigned int *)(BugCheckParameter2 + 36) | ((unsigned __int64)(*(_WORD *)(BugCheckParameter2 + 32) & 0xFFC0) << 26))) << 12;
    }
    v13 = MiReferenceControlAreaFile((_CONTROL_AREA *)v9);
    v39 = 1;
    for( i = ((__rdtsc() >> 4) & 7) + 8; ; i = NumberOfValidRuns )
    {
      while( 1 )
      {
        if( !i )
        {
LABEL_16:
          MiDereferenceControlAreaFile(v9, (unsigned __int64)v13);
          return 3221225626i64;
        }
        LODWORD(v15) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
        v17 = v15;
        if( v15 )
          break;
        if( !v39 )
          goto LABEL_16;
        i >>= 1;
      }
      v15->NumberOfRuns = i;
      v15->NumberOfValidRuns = 0;
      v39 = 0;
      v60 = 0;
      if( v40 == 1 )
      {
        if( v10 + v11 > v44 )
          v10 = (unsigned int)(v44 - v11);
        v16 = *(_QWORD *)(BugCheckParameter2 + 8);
        if( v16 && (*(_BYTE *)(*(_QWORD *)(v9 + 96) + 48i64) & 1) != 0 )
          v11 = (v16 - *(_QWORD *)(*(_QWORD *)v9 + 64i64)) >> 3 << 12;
      }
      v10 = (v10 + 4095) & 0xFFFFFFFFFFFFF000ui64;
      if( v40 != 1 || (*(_DWORD *)(v9 + 56) & 2) == 0 )
      {
        v61 = MiChangingSubsectionProtos((PVOID)BugCheckParameter2);
        if( v61 < 0 )
        {
          MiDereferenceControlAreaFile(v9, (unsigned __int64)v13);
          ExFreePoolWithTag(v17, 0);
          return(unsigned int)v61;
        }
        v60 = 1;
      }
      FsRtlGetFileExtents((INT64)v13, v16);
      v37 = v19;
      if( v19 < 0 )
      {
        MiDereferenceControlAreaFile(v9, (unsigned __int64)v13);
        if( v60 == 1 )
          MiUnlinkSubsectionWaitBlock((__int64 *)BugCheckParameter2, (__int64)a2a, 0);
        v36 = v17;
LABEL_115:
        ExFreePoolWithTag(v36, 0);
        return v37;
      }
      NumberOfValidRuns = v17->NumberOfValidRuns;
      if( NumberOfValidRuns <= i )
        break;
      if( v60 == 1 )
      {
        MiUnlinkSubsectionWaitBlock((__int64 *)BugCheckParameter2, (__int64)a2a, 0);
        NumberOfValidRuns = v17->NumberOfValidRuns;
      }
      v17->NumberOfValidRuns = i;
      ExFreePoolWithTag(v17, 0);
    }
    MiDereferenceControlAreaFile(v9, (unsigned __int64)v13);
    v20 = 0i64;
    if( !(unsigned int)MiNewPfnsSuitable(v17) )
    {
      v24 = -1073740761;
LABEL_109:
      ExFreePoolWithTag(v17, 0);
      if( v60 == 1 )
        MiUnlinkSubsectionWaitBlock((__int64 *)BugCheckParameter2, (__int64)a2a, 0);
      return(unsigned int)v24;
    }
    if( v17->NumberOfValidRuns )
    {
      v23 = MiConvertRunsToPages(v17, &NumberOfPages);
      if( v23 )
      {
        if( (a5 & 0x40) == 0 || v41 <= 1 )
        {
          v22 = NumberOfPages;
          v21 = v40;
          goto LABEL_41;
        }
        v24 = -1073741800;
      }
      else
      {
        v24 = -1073741670;
      }
      goto LABEL_109;
    }
    if( (a5 & 0x40) != 0 || (v21 = v40, v40 == 1) )
    {
      v24 = -1073741823;
      goto LABEL_109;
    }
    v41 = -1;
    v22 = 0i64;
    NumberOfPages = 0i64;
    v23 = 0i64;
LABEL_41:
    if( v21 == 1 && (*(_DWORD *)(v9 + 56) & 2) != 0 )
      goto LABEL_54;
    v24 = MiChangingSubsectionProtos((PVOID)BugCheckParameter2);
    if( v24 >= 0 )
    {
      if( v23 )
      {
        v25 = a3;
        if( (a5 & 1) == 0 )
          MiEliminateStaleExtents((MMPTE *)a3, v23, v22);
        goto LABEL_55;
      }
LABEL_54:
      v25 = a3;
LABEL_55:
      ExFreePoolWithTag(v17, 0);
      if( v23 && (*(_BYTE *)(v9 + 56) & 0x20) == 0 && (a5 & 1) != 0 )
      {
        *((_QWORD *)&v52 + 1) = v22;
        *(_QWORD *)&v52 = v25;
        *((_QWORD *)&Node_16 + 1) = *((_QWORD *)&Node_16 + 1) & 0xFFFFFFFFFFFFFFF8ui64 | 4;
        MiUpdateSystemProtoPtesTree((RTL_BALANCED_NODE *)&Node, 1i64);
      }
      v26 = 0;
      v27 = 0i64;
      v37 = 0;
      v28 = -1i64;
      v45 = 0i64;
      v29 = 0i64;
      BugCheckParameter2b = -1i64;
      v30 = a5 & 0x40;
      while( 1 )
      {
        if( (unsigned int)v20 == v22 )
        {
          if( !v29 )
            goto LABEL_72;
        }
        else
        {
          if( !v29 )
          {
            v28 = v23[v20];
            BugCheckParameter2b = v28;
            v29 = 1i64;
            goto LABEL_94;
          }
          v27 = v45;
          if( v23[v20 - 1] + 1 == v23[v20] )
          {
            ++v29;
            goto LABEL_95;
          }
          v30 = a5 & 0x40;
        }
        if( v28 == 0x8000000000000000ui64 )
        {
          if( v26 >= 0 )
          {
            *(_QWORD *)(a3 + 8 * ((unsigned int)v20 - v29)) = MiMakeSubsectionPte(BugCheckParameter2);
            if( (a5 & 2) != 0 )
            {
              v26 = -1073740023;
              v37 = -1073740023;
LABEL_71:
              v30 = a5 & 0x40;
LABEL_72:
              if( v26 < 0 )
              {
                if( (_QWORD)v52 )
                  MiUpdateSystemProtoPtesTree((RTL_BALANCED_NODE *)&Node, 0i64);
LABEL_101:
                v35 = v47;
              }
              else
              {
                if( (a5 & 1) == 0 )
                  goto LABEL_101;
                if( v30 )
                  *(_DWORD *)(BugCheckParameter2 + 108) = 2;
                MiSetSubsectionBase(BugCheckParameter2, a3, v41);
                if( (_QWORD)v52 )
                {
                  MiReplaceSystemProtoPtesNode(
                    (RTL_BALANCED_NODE *)&Node,
                    (RTL_BALANCED_NODE *)(BugCheckParameter2 + 112));
                  goto LABEL_101;
                }
                v35 = v47;
                if( (*(_DWORD *)(v47 + 56) & 0x20) == 0 )
                  MiUpdateSystemProtoPtesTree((RTL_BALANCED_NODE *)(BugCheckParameter2 + 112), 1i64);
              }
              if( v40 != 1 || (*(_DWORD *)(v35 + 56) & 2) == 0 )
                MiSubsectionProtosCreated((INT64 *)BugCheckParameter2, (INT64)a2a, (unsigned int)a4, 0i64);
              if( v23 )
              {
                v36 = v23;
                goto LABEL_115;
              }
              return v37;
            }
            goto LABEL_90;
          }
          goto LABEL_92;
        }
        if( (v28 & 0x4000000000000000i64) != 0 )
        {
          if( v26 >= 0 || (unsigned __int64)&v23[v20] > v27 )
            goto LABEL_92;
          if( (unsigned int)v20 == v22 )
            goto LABEL_71;
          v29 = 0i64;
          LODWORD(v20) = v20 - 1;
        }
        else
        {
          if( v26 < 0 )
          {
            if( (unsigned __int64)&v23[v20] <= v27 )
            {
              if( (a5 & 0x40) != 0 )
                MiDecrementProtoShareCounts(v28, v29);
              MiRemovePhysicalMemory(BugCheckParameter2b, v29, 0x12ui64);
LABEL_90:
              v26 = v37;
LABEL_91:
              v28 = BugCheckParameter2b;
            }
LABEL_92:
            if( (unsigned int)v20 == v22 )
              goto LABEL_71;
            v29 = 0i64;
            LODWORD(v20) = v20 - 1;
LABEL_94:
            v27 = v45;
            goto LABEL_95;
          }
          v59 = 0;
          v56 = BugCheckParameter2;
          v31 = (unsigned int)v20 - v29;
          v58 = 2 - (v30 != 0);
          v32 = *(_CONTROL_AREA **)BugCheckParameter2;
          NumberOfBytes.QuadPart = v29 << 12;
          v57 = a3 + 8 * v31;
          StartAddress.QuadPart = v28 << 12;
          ControlAreaPartition = MiGetControlAreaPartition(v32);
          MiAddPhysicalMemory(ControlAreaPartition, &StartAddress, &NumberOfBytes, 2ui64);
          v37 = v34;
          v26 = v34;
          if( v34 >= 0 )
            goto LABEL_91;
          v28 = BugCheckParameter2b;
          v27 = (unsigned __int64)&v23[v31];
          v29 = 0i64;
          v45 = v27;
          LODWORD(v20) = -1;
        }
LABEL_95:
        v20 = (unsigned int)(v20 + 1);
        v30 = a5 & 0x40;
        if( (unsigned int)v20 > v22 )
          goto LABEL_72;
      }
    }
    ExFreePoolWithTag(v17, 0);
    if( v23 )
      ExFreePoolWithTag(v23, 0);
    if( v24 == -1073740748 )
    {
      a2 = v62;
      v8 = BugCheckParameter2a;
      v7 = a3;
      continue;
    }
    return(unsigned int)v24;
  }
}

Referenced by:

MiAddViewsForSection
MiCreatePrototypePtes
MiFaultGetFileExtents
MiInitializeImageExtents
MiRefillPurgedExtents
MiUpdateActiveSubsection