MiAddPhysicalMemory

NTSTATUS __stdcall MiAddPhysicalMemory(
        _MI_PARTITION *TargetPartition,
        _LARGE_INTEGER *StartAddress,
        _LARGE_INTEGER *NumberOfBytes,
        UINT64 Flags){
  __int128 v5; 
  UINT64 v6; 
  unsigned __int64 v7; 
  __int64 v8; 
  _ETHREAD *CurrentThread; 
  int v11; 
  unsigned int v12; 
  int v13; 
  unsigned __int64 v14; 
  int v15; 
  unsigned __int64 v16; 
  unsigned __int64 *p_PageCount; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  PHYSICAL_MEMORY_DESCRIPTOR *v20; 
  unsigned int v21; 
  _MI_MEMORY_NODE *v22; 
  __int64 v23; 
  int v24; 
  unsigned int v25; 
  _PHYSICAL_MEMORY_RUN *Run; 
  __int64 v27; 
  UINT64 Flagsa; 
  UINT64 Flagsb; 
  UINT64 v30; 
  UINT64 v31; 
  _QWORD ListHead[3]; 
  PHYSICAL_MEMORY_DESCRIPTOR *NewPageRunBlock; 
  PHYSICAL_MEMORY_DESCRIPTOR *OutputNewPhysicalMemoryBlock; 
  PHYSICAL_MEMORY_DESCRIPTOR *Memory; 
  _ETHREAD *Thread; 
  __int128 MemoryNode; 
  __int128 MemoryNode_16; 
  __int64 v39; 
  UINT16 PartitionId; 
  int v42; 

  PartitionId = (unsigned __int16)TargetPartition;
  MemoryNode = 0i64;
  v39 = 0i64;
  MemoryNode_16 = 0i64;
  if( (StartAddress->anonymous_0.LowPart & 0xFFF) != 0 )
    return -1073741585;
  if( (NumberOfBytes->anonymous_0.LowPart & 0xFFF) != 0 )
    return -1073741584;
  *(_QWORD *)&v5 = (unsigned __int64)StartAddress->QuadPart >> 12;
  *((_QWORD *)&v5 + 1) = (unsigned __int64)NumberOfBytes->QuadPart >> 12;
  v6 = v5 + *((_QWORD *)&v5 + 1);
  if( (unsigned __int64)v5 >= (_QWORD)v5 + *((_QWORD *)&v5 + 1) )
    return -1073741585;
  v7 = 0xFFFFFFFFFi64;
  if( (unsigned __int64)((*(&stru_140C4DB30 + 42) >> 12) - 1i64) < 0xFFFFFFFFFi64 )
    v7 = (*(&stru_140C4DB30 + 42) >> 12) - 1i64;
  if( v6 - 1 > v7 )
  {
    if( (Flags & 2) == 0 )
    {
      v6 = v7 + 1;
      *((_QWORD *)&v5 + 1) = v7 + 1 - v5;
      goto LABEL_9;
    }
    return -1073741584;
  }
LABEL_9:
  v8 = *((_QWORD *)&v5 + 1);
  if( (unsigned __int64)v5 >= v6 )
    return -1073741585;
  if( (_QWORD)v5 + *((_QWORD *)&v5 + 1) >= *(&stru_140C4DB30 + 374)
    && (unsigned __int64)v5 < *(&stru_140C4DB30 + 374) + 2048i64
    || (_QWORD)v5 + *((_QWORD *)&v5 + 1) >= 0xFFFFFFFFAui64 )
  {
    return -1073741800;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Thread = CurrentThread;
  NewPageRunBlock = 0i64;
  Memory = 0i64;
  OutputNewPhysicalMemoryBlock = 0i64;
  ListHead[2] = 0i64;
  ListHead[1] = ListHead;
  ListHead[0] = ListHead;
  v11 = 5;
  if( TargetPartition == &Irp )
    v11 = 1;
  v12 = Flags | v11;
  if( (v12 & 0xFE) != 0 && (v12 & 0x100) != 0 )
    return -1073741582;
  v13 = v12 & 2;
  if( (v12 & 2) != 0 )
    MiDeleteExtentPfns(0i64);
  else
    MiLockDynamicMemoryExclusive(&Irp, CurrentThread);
  if( (v12 & 2) != 0 || byte_140C4C870 )
  {
    LODWORD(v14) = MiIsExtentDangling(v5, *((UINT64 *)&v5 + 1), v12);
    if( v14 >= (unsigned __int64)v5 && v14 < v6 )
    {
LABEL_25:
      v15 = -1073741800;
      goto LABEL_72;
    }
    if( (v12 & 2) != 0 )
    {
      MiLockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
      v16 = 0i64;
      if( MmPhysicalMemoryBlock->NumberOfRuns )
      {
        p_PageCount = &MmPhysicalMemoryBlock->Run[0].PageCount;
        do
        {
          v18 = *(p_PageCount - 1);
          if( *p_PageCount )
          {
            if( (unsigned __int64)v5 >= v18 )
            {
              if( (unsigned __int64)v5 < *p_PageCount + v18 )
              {
LABEL_32:
                MiUnlockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
                goto LABEL_25;
              }
            }
            else if( v6 > v18 )
            {
              goto LABEL_32;
            }
          }
          ++v16;
          p_PageCount += 2;
        }
        while( v16 < MmPhysicalMemoryBlock->NumberOfRuns );
      }
      byte_140C4C870 = 1;
      MiUnlockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
LABEL_59:
      HIDWORD(Flagsa) = v42;
      MiMapNewPfns(v5, v6, PartitionId, v12);
      v15 = v24;
      if( v24 >= 0 )
      {
        NumberOfBytes->QuadPart = *((_QWORD *)&v5 + 1) << 12;
        if( !v13 )
        {
          LODWORD(Flagsa) = v12;
          MiPerformMemoryChange(v5, *((UINT64 *)&v5 + 1), &OutputNewPhysicalMemoryBlock, &NewPageRunBlock, Flagsa);
          MiComputeNodeMemory(&Irp);
          v25 = -1;
          if( *(&stru_140C50B28 + 853) <= 0xFFFFFFFFui64 )
            v25 = *(&stru_140C50B28 + 1706);
          KUSER_SHARED_DATA.NumberOfPhysicalPages = v25;
          if( (v12 & 0x40) == 0 )
          {
            LODWORD(Flagsb) = 0;
            MiUpdateLargePageBitMap((UINT64)&Irp, v5, ((v6 + 511) >> 9) - ((unsigned __int64)v5 >> 9), 0i64, Flagsb);
          }
          if( (v12 & 4) == 0 )
            MiEnableNewPfns(v5, v6);
          if( (MiFlags & 0x10000000) != 0 && (MiFlags & 0x30u) >= 0x20 )
          {
            LODWORD(v31) = 0;
            LODWORD(v30) = 0;
            ZwUpdateWnfStateData(&WNF_MM_PHYSICAL_MEMORY_CHANGE, 0i64, 0i64, 0i64, 0i64, v30, v31);
          }
          KePulseEvent(*(&stru_140C50B28 + 28), 0, 0);
        }
        v15 = 0;
      }
LABEL_72:
      if( v13 )
        goto LABEL_76;
      goto LABEL_75;
    }
  }
  v19 = *(&stru_140C50B28 + 853) + *((_QWORD *)&v5 + 1);
  if( *(&stru_140C50B28 + 853) + *((_QWORD *)&v5 + 1) > *(&stru_140C4DB30 + 32) )
    v6 = v5 + *(&stru_140C4DB30 + 32) - *(&stru_140C50B28 + 853);
  *((_QWORD *)&v5 + 1) = *(&stru_140C4DB30 + 32) - *(&stru_140C50B28 + 853);
  if( v19 <= *(&stru_140C4DB30 + 32) )
    *((_QWORD *)&v5 + 1) = v8;
  Memory = MiReferencePageRuns((ULONG_PTR *)&Irp.Core.PartitionId, 1ui64);
  v20 = Memory;
  if( (unsigned __int64)v5 < v6 )
  {
    if( (v12 & 0x404) == 0 )
    {
      v15 = KeConfigureDynamicMemory(v5, v6 - 1, 0i64);
      if( v15 < 0 )
        goto LABEL_75;
    }
    if( MiDescribePageRun((_MI_MEMORY_NODE_LISTHEAD *)ListHead, v5, *((UINT64 *)&v5 + 1)) )
    {
      *(_QWORD *)&MemoryNode = 0i64;
      MemoryNode_16 = v5;
      v15 = MiConfigureMemoryInsertion(
              &OutputNewPhysicalMemoryBlock,
              MmPhysicalMemoryBlock,
              (_MI_MEMORY_NODE *)&MemoryNode);
      if( v15 < 0 )
        goto LABEL_75;
      if( MiSplitPfnBitMaps((UINT64 *)&Irp.Core.PartitionId, v5, *((INT64 *)&v5 + 1)) )
      {
        v21 = 0;
        while( MiSplitMirrorBitMap((_RTL_BITMAP_EX *)&stru_140C4DB30 + v21 + 146, v5, *((UINT64 *)&v5 + 1)) )
        {
          if( ++v21 >= 2 )
          {
            while( 1 )
            {
              v22 = (_MI_MEMORY_NODE *)ListHead[0];
              if( (_QWORD *)ListHead[0] == ListHead )
                break;
              if( *(_QWORD **)(ListHead[0] + 8i64) != ListHead
                || (v23 = *(_QWORD *)ListHead[0], *(_QWORD *)(*(_QWORD *)ListHead[0] + 8i64) != ListHead[0]) )
              {
LABEL_85:
                __fastfail(3u);
              }
              ListHead[0] = *(_QWORD *)ListHead[0];
              *(_QWORD *)(v23 + 8) = ListHead;
              v15 = MiConfigureMemoryInsertion(&NewPageRunBlock, v20, v22);
              ExFreePoolWithTag(v22, 0);
              if( v20 != Memory )
                ExFreePoolWithTag(v20[-1].Run, 0);
              if( v15 < 0 )
              {
                v13 = v12 & 2;
                goto LABEL_75;
              }
              v20 = NewPageRunBlock;
            }
            v13 = v12 & 2;
            goto LABEL_59;
          }
        }
      }
    }
    v15 = -1073741670;
    goto LABEL_75;
  }
  v15 = -1073741585;
LABEL_75:
  MiUnlockDynamicMemoryExclusive(&Irp, Thread);
LABEL_76:
  if( OutputNewPhysicalMemoryBlock )
    ExFreePoolWithTag(OutputNewPhysicalMemoryBlock[-1].Run, 0);
  if( !NewPageRunBlock )
    goto LABEL_81;
  Run = NewPageRunBlock[-1].Run;
  while( 1 )
  {
    ExFreePoolWithTag(Run, 0);
LABEL_81:
    Run = (_PHYSICAL_MEMORY_RUN *)ListHead[0];
    if( (_QWORD *)ListHead[0] == ListHead )
      break;
    if( *(_QWORD **)(ListHead[0] + 8i64) != ListHead )
      goto LABEL_85;
    v27 = *(_QWORD *)ListHead[0];
    if( *(_QWORD *)(*(_QWORD *)ListHead[0] + 8i64) != ListHead[0] )
      goto LABEL_85;
    ListHead[0] = *(_QWORD *)ListHead[0];
    *(_QWORD *)(v27 + 8) = ListHead;
  }
  if( !v13 )
  {
    if( Memory )
      MiDereferencePageRuns(Memory);
    if( v15 >= 0 )
      IoUpdateDumpPhysicalRanges();
  }
  return v15;
}

Referenced by:

MiAddPhysicalMemoryChunks
MiAllocateFileExtents