MiAllocateContiguousMemory

VOID __fastcall MiAllocateContiguousMemory(
        UINT64 NumberOfBytes,
        UINT64 LowestPage,
        UINT64 HighestPage,
        UINT64 BoundaryPage,
        UINT64 ProtectionMask,
        UINT64 PreferredNode,
        UINT64 CatchOverruns){
  UINT64 v9; 
  LARGE_INTEGER PerformanceCounter; 
  unsigned int v11; 
  PHYSICAL_ADDRESS PhysicalAddress; 
  LARGE_INTEGER v13; 
  _BOOL8 v14; 
  unsigned __int64 ContiguousHeapPool; 
  UINT64 v16; 
  int v17; 
  unsigned int v18; 
  char v19; 
  UINT64 v20; 
  _MI_PFN_CACHE_ATTRIBUTE v21; 
  unsigned int v22; 
  unsigned int v23; 
  _DWORD *v24; 
  __int64 v25; 
  _DWORD *v26; 
  int i; 
  VOID *v28; 
  UINT64 v29; 
  char *v30; 
  char *v31; 
  char *v32; 
  unsigned __int64 v33; 
  char *v34; 
  UINT64 v35; 
  LPCGUID ActivityId; 
  LPCGUID ActivityIda; 
  UINT64 UserDataCount; 
  PEVENT_DATA_DESCRIPTOR UserData; 
  PEVENT_DATA_DESCRIPTOR UserDataa; 
  UINT64 Flags; 
  UINT64 Flagsa; 
  unsigned __int8 v43; 
  unsigned int v44; 
  unsigned int v45; 
  int v47; 
  _MI_PFN_CACHE_ATTRIBUTE v48; 
  POOL_TYPE PoolType; 
  BOOL GuardPte; 
  _DWORD *v53; 
  LARGE_INTEGER v55; 
  __int64 v56[7]; 
  int v57; 
  unsigned int v58; 
  unsigned int v59; 
  EVENT_DATA_DESCRIPTOR v60; 
  v9 = LowestPage;
  v44 = ProtectionMask;
  PerformanceCounter = KeQueryPerformanceCounter(0i64);
  v11 = ProtectionMask;
  PhysicalAddress.QuadPart = -1i64;
  v55 = PerformanceCounter;
  v13 = PerformanceCounter;
  v14 = MmProtectFreedNonPagedPool != 0;
  GuardPte = MmProtectFreedNonPagedPool != 0;
  ContiguousHeapPool = 0i64;
  v16 = (NumberOfBytes >> 12) + ((NumberOfBytes & 0xFFF) != 0);
  if( (ProtectionMask & 2) != 0 && (MiFlags & 0x10000) != 0 )
  {
    v11 = ProtectionMask & 0xFFFFFFFD;
    v44 = ProtectionMask & 0xFFFFFFFD;
  }
  if( !BoundaryPage || (v17 = 0, v16 <= BoundaryPage) )
  {
    v17 = 0;
    if( v9 <= HighestPage && v9 + v16 > v9 && v9 + v16 - 1 <= HighestPage )
    {
      v21 = (unsigned int)MiProtectionToCacheAttribute(v11);
      v22 = PreferredNode;
      v48 = v21;
      if( (unsigned __int16)KeNumberNodes <= 1u )
        v22 = v18;
      v45 = v22;
      if( v22 == 0x80000000 )
      {
        v23 = *(unsigned __int16 *)(*((_QWORD *)*(&KiProcessorBlock + *((unsigned int *)KeGetCurrentThread() + 147)) + 24)
                                  + 146i64);
      }
      else
      {
        v23 = v22;
        if( v22 >= (unsigned __int16)KeNumberNodes )
          goto LABEL_31;
      }
      v24 = (_DWORD *)(qword_140C4DBD8 + 4i64 * v23 * (unsigned __int16)KeNumberNodes);
      if( v22 == 0x80000000 )
        v25 = (unsigned __int16)KeNumberNodes;
      else
        v25 = 1i64;
      v53 = &v24[v25];
      PoolType = NonPagedPoolNx;
      if( (v19 & 2) != 0 )
      {
        PoolType = NonPagedPool;
      }
      else if( !v14 && v21 == MiCached && !MmProtectFreedNonPagedPool && v16 <= 0x200 )
      {
        while( 1 )
        {
          LODWORD(ActivityId) = *v24;
          ContiguousHeapPool = ExAllocateContiguousHeapPool(
                                 LowestPage,
                                 v20,
                                 BoundaryPage,
                                 NumberOfBytes,
                                 (UINT64)ActivityId);
          if( ContiguousHeapPool )
            break;
          v20 = HighestPage;
          if( ++v24 == v53 )
          {
            v21 = v48;
            goto LABEL_20;
          }
        }
        v17 = 1;
        goto LABEL_31;
      }
LABEL_20:
      v47 = 135266304;
      v26 = (_DWORD *)(qword_140C4DBD8 + 4i64 * v23 * (unsigned __int16)KeNumberNodes);
      LODWORD(Flags) = 135266304;
      LODWORD(UserData) = 0x80000000;
      LODWORD(UserDataCount) = *v26;
      for( i = MiFindContiguousPages(
                  (_MI_PARTITION *)&MiSystemPartition,
                  LowestPage,
                  v20,
                  BoundaryPage,
                  v16,
                  v21,
                  UserDataCount,
                  (UINT64)UserData,
                  Flags,
                  0i64);
            i < 0;
            i = MiFindContiguousPages(
                  (_MI_PARTITION *)&MiSystemPartition,
                  LowestPage,
                  HighestPage,
                  BoundaryPage,
                  v16,
                  v48,
                  UserDataCount,
                  (UINT64)UserDataa,
                  Flagsa,
                  0i64) )
      {
        if( ++v26 == v53 )
          goto LABEL_49;
        LODWORD(UserDataa) = 0x80000000;
        LODWORD(UserDataCount) = *v26;
        v47 &= ~0x8000000u;
        LODWORD(Flagsa) = v47;
      }
      v28 = MiMapContiguousMemory((LARGE_INTEGER)-4096i64, v16 << 12, v44, GuardPte);
      ContiguousHeapPool = (unsigned __int64)v28;
      if( v28 )
      {
        LODWORD(ActivityIda) = GuardPte;
        if( !(unsigned int)ExInsertPoolTag(v29, v28, v16 << 12, PoolType, (UINT64)ActivityIda) )
        {
          v35 = (v16 << 12) + 4096;
          if( !GuardPte )
            v35 = v16 << 12;
          MmUnmapIoSpace((PVOID)ContiguousHeapPool, v35);
          ContiguousHeapPool = 0i64;
        }
      }
      v30 = (char *)MmGetPfnDb() - 48;
      v31 = &v30[48 * v16];
      if( ContiguousHeapPool )
        v32 = (char *)MmGetPteBase() + ((ContiguousHeapPool >> 9) & 0x7FFFFFFFF8i64);
      else
        v32 = 0i64;
      do
      {
        v43 = MiLockPageInline((INT64)v30);
        v33 = *((_QWORD *)v30 + 5) & 0xFFFFFFF000000000ui64 | 0xFFFFFFFFDi64;
        *((_QWORD *)v30 + 1) = v32;
        *((_QWORD *)v30 + 5) = v33;
        _InterlockedAnd64((volatile signed __int64 *)v30 + 3, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v43);
        v34 = v32;
        v30 += 48;
        v32 += 8;
        if( !v34 )
          v32 = 0i64;
      }
      while( v30 < v31 );
      v13 = v55;
      if( ContiguousHeapPool )
      {
        v22 = v45;
        v17 = 0;
        goto LABEL_31;
      }
      v22 = v45;
LABEL_49:
      v17 = 0;
LABEL_31:
      v9 = LowestPage;
      goto LABEL_32;
    }
  }
  v22 = PreferredNode;
LABEL_32:
  if( EtwEventEnabled(
         EtwpMemoryProvRegHandle,
         (EVENT_DESCRIPTOR *)&KERNEL_MEM_EVENT_CONT_ALLOCATION,
         (EVENT_DESCRIPTOR *)v14) )
  {
    if( ContiguousHeapPool )
      PhysicalAddress = MmGetPhysicalAddress((PVOID)ContiguousHeapPool);
    v56[0] = EtwpGetDurationSince(v13.QuadPart);
    v56[3] = HighestPage << 12;
    v56[4] = BoundaryPage << 12;
    v58 = v44;
    v56[1] = NumberOfBytes;
    v60.Ptr = (unsigned __int64)v56;
    LODWORD(UserDataCount) = 1;
    v56[6] = ContiguousHeapPool;
    v56[5] = PhysicalAddress.QuadPart;
    v56[2] = v9 << 12;
    v57 = v17;
    v59 = v22;
    *(_QWORD *)&v60.Size = 68i64;
    EtwWriteEx(
      EtwpMemoryProvRegHandle,
      (EVENT_DESCRIPTOR *)&KERNEL_MEM_EVENT_CONT_ALLOCATION,
      0i64,
      1ui64,
      0i64,
      0i64,
      UserDataCount,
      &v60);
  }
}

Referenced by:

MmAllocateContiguousMemory
MmAllocateContiguousNodeMemory