MiConfigureMemoryInsertion

NTSTATUS __stdcall MiConfigureMemoryInsertion(
        PHYSICAL_MEMORY_DESCRIPTOR **OutputNewPhysicalMemoryBlock,
        PHYSICAL_MEMORY_DESCRIPTOR *PhysicalMemoryBlock,
        _MI_MEMORY_NODE *MemoryNode){
  unsigned __int64 v3; 
  unsigned __int64 v5; 
  unsigned __int64 v7; 
  __int64 NumberOfRuns; 
  _PHYSICAL_MEMORY_RUN *v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 *p_PageCount; 
  __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  UINT64 v20; 
  char *Pool; 
  _PHYSICAL_MEMORY_RUN *Run; 
  PHYSICAL_MEMORY_DESCRIPTOR *v23; 
  unsigned int *v24; 
  _PHYSICAL_MEMORY_RUN *v25; 
  unsigned __int64 v26; 
  int v27; 
  unsigned __int64 v28; 
  unsigned __int64 BasePage; 
  unsigned __int64 PageCount; 
  __int64 v31; 
  int v32; 
  __int64 v34; 
  unsigned __int64 v35; 

  v3 = *(_QWORD *)&MemoryNode[1].List[4];
  v5 = *(_QWORD *)&MemoryNode->NodeNumber;
  *OutputNewPhysicalMemoryBlock = 0i64;
  v35 = v3;
  v7 = v3 + v5;
  NumberOfRuns = PhysicalMemoryBlock->NumberOfRuns;
  if( *(_QWORD *)MemoryNode->List )
    v9 = &PhysicalMemoryBlock->Run[NumberOfRuns];
  else
    v9 = 0i64;
  if( (int)NumberOfRuns + 1 < (unsigned int)NumberOfRuns )
    return -1073741670;
  v10 = PhysicalMemoryBlock->NumberOfRuns;
  v11 = 16i64 * (unsigned int)(NumberOfRuns - 1);
  v12 = v11 + 48;
  if( v9 )
    v12 = v11 + 8 * ((unsigned int)(NumberOfRuns + 1) + 6i64);
  v13 = 0i64;
  v34 = 1i64;
  v14 = 0i64;
  p_PageCount = &PhysicalMemoryBlock->Run[0].PageCount;
  v16 = 1i64;
  while( 1 )
  {
    v17 = *(p_PageCount - 1);
    if( *p_PageCount )
    {
      v18 = v17 + *p_PageCount;
      if( v5 >= v17 )
      {
        if( v5 < v18 )
          return -1073741800;
      }
      else if( v7 > v17 )
      {
        return -1073741800;
      }
      if( (v5 == v18 || v7 == v17)
        && (!v9
         || *((_DWORD *)&v9->BasePage + 2 * v13) == MemoryNode[1].PageCount
         && *((_DWORD *)&v9->BasePage + 2 * v13 + 1) == *(_DWORD *)&MemoryNode[1].NodeNumber) )
      {
        if( v16 == 1 )
        {
          v14 = v13;
          v16 = 0i64;
        }
        else
        {
          v16 = -1i64;
        }
        v34 = v16;
      }
    }
    if( ++v13 >= v10 )
      break;
    p_PageCount += 2;
  }
  v20 = 16 * v16 + v12;
  if( v9 )
    v20 += 8 * (v10 + v16);
  Pool = (char *)MiAllocatePool(64i64, v20, 0x20206D4Dui64);
  if( !Pool )
    return -1073741670;
  *(_QWORD *)Pool = &Irp;
  Run = PhysicalMemoryBlock->Run;
  *((_QWORD *)Pool + 1) = 1i64;
  v23 = (PHYSICAL_MEMORY_DESCRIPTOR *)(Pool + 16);
  *((_DWORD *)Pool + 4) = v16 + v10;
  v24 = (unsigned int *)&Pool[16 * (unsigned int)(v16 + v10) + 32];
  *((_QWORD *)Pool + 3) = v35 + PhysicalMemoryBlock->NumberOfPages;
  v25 = (_PHYSICAL_MEMORY_RUN *)(Pool + 32);
  if( v34 == -1 )
  {
    v26 = v14;
    memmove(v25, Run, 16 * v14 + 16);
    if( v9 )
      memmove(v24, v9, 8 * v14 + 8);
    v23->Run[v26].PageCount += v35 + *(unsigned __int64 *)((char *)&PhysicalMemoryBlock[1].NumberOfPages + v26 * 16);
    if( v14 + 2 != v10 )
    {
      v27 = v10 - v14;
      memmove((char *)&v23[1] + v26 * 16, &PhysicalMemoryBlock[1].Run[v26], 16 * v27 - 32);
      if( v9 )
        memmove(&v24[2 * v14 + 2], &v9[1].BasePage + v14, 8 * v27 - 16);
    }
  }
  else if( v34 )
  {
    v31 = 0i64;
    v32 = 0;
    do
    {
      if( !v32 && v35 + v5 <= Run->BasePage )
      {
        v25->BasePage = v5;
        v25->PageCount = v35;
        ++v25;
        if( v9 )
        {
          v24[1] = *(_DWORD *)&MemoryNode[1].NodeNumber;
          *v24 = MemoryNode[1].PageCount;
          v24 += 2;
        }
        v32 = 1;
      }
      *v25++ = *Run;
      if( v9 )
      {
        *(_QWORD *)v24 = *(&v9->BasePage + v31);
        v24 += 2;
      }
      ++v31;
      ++Run;
    }
    while( v31 != PhysicalMemoryBlock->NumberOfRuns );
    if( !v32 )
    {
      v25->BasePage = v5;
      v25->PageCount = v35;
      if( v9 )
      {
        v24[1] = *(_DWORD *)&MemoryNode[1].NodeNumber;
        *v24 = MemoryNode[1].PageCount;
      }
    }
  }
  else
  {
    memmove(v25, Run, 16 * v10);
    if( v9 )
      memmove(v24, v9, 8 * v10);
    v28 = v14;
    BasePage = PhysicalMemoryBlock->Run[v28].BasePage;
    PageCount = PhysicalMemoryBlock->Run[v28].PageCount;
    v23->Run[v28].PageCount += v35;
    if( v5 != BasePage + PageCount )
      v23->Run[v28].BasePage = v5;
  }
  *OutputNewPhysicalMemoryBlock = v23;
  return 0;
}

Referenced by:

MiAddPhysicalMemory