MiCoalescePlaceholderAllocations

NTSTATUS __stdcall MiCoalescePlaceholderAllocations(_EPROCESS *Process, VOID *StartingVa, UINT64 a3){
  unsigned __int64 v5; 
  UINT64 v6; 
  _MMVAD *Address; 
  _MMVAD_SHORT *p_Core; 
  _MMVAD_SHORT *i; 
  int v10; 
  __int64 LongFlags1; 
  int v12; 
  _MMVAD_SHORT **ExtraCreateInfo; 
  _MMVAD_SHORT *v14; 
  _MMVAD_SHORT *v15; 
  _MMVAD_SHORT *NextVad; 
  _MMVAD_SHORT *v17; 
  _MMVAD *v18; 
  _MMVAD_SHORT *v19; 
  _MMVAD_SHORT *j; 
  unsigned __int64 k; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  _QWORD *v24; 
  unsigned __int64 m; 
  _MMVAD *v26; 
  _ETHREAD *Thread; 

  Thread = (_ETHREAD *)KeGetCurrentThread();
  LODWORD(v5) = MiLockVadRange(Process, StartingVa, (VOID *)(a3 & 0xFFFFFFFFFFFFF000ui64));
  v6 = v5;
  if( v5 >= 2 )
  {
    Address = MiLocateAddress(StartingVa);
    p_Core = &Address->Core;
    if( (VOID *)((Address->Core.StartingVpn | ((unsigned __int64)Address->Core.StartingVpnHigh << 32)) << 12) == StartingVa )
    {
      i = &Address->Core;
      v10 = 0;
      while( 1 )
      {
        LongFlags1 = i->u1.LongFlags1;
        LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
        if( (LongFlags1 | ((unsigned __int64)i->CommitChargeHigh << 31)) != 0x7FFFFFFFDi64 )
          break;
        if( (i->u.LongFlags & 8) != 0 )
        {
          v12 = MiCheckSecuredVad(
                  i,
                  (VOID *)((i->StartingVpn | ((unsigned __int64)i->StartingVpnHigh << 32)) << 12),
                  ((i->EndingVpn | ((unsigned __int64)i->EndingVpnHigh << 32))
                 - (i->StartingVpn | ((unsigned __int64)i->StartingVpnHigh << 32))
                 + 1) << 12,
                  0x55ui64);
          if( v12 < 0 )
            goto LABEL_38;
        }
        ExtraCreateInfo = (_MMVAD_SHORT **)i->ExtraCreateInfo;
        v14 = i;
        v15 = i;
        if( ExtraCreateInfo )
        {
          NextVad = *ExtraCreateInfo;
          for( i = (_MMVAD_SHORT *)i->ExtraCreateInfo; NextVad; NextVad = NextVad->NextVad )
            i = NextVad;
        }
        else
        {
          while( 1 )
          {
            i = (_MMVAD_SHORT *)(i->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
            if( !i || i->NextVad == v15 )
              break;
            v15 = i;
          }
        }
        if( (unsigned int)++v10 >= v6 )
        {
          if( (((v14->EndingVpn | ((unsigned __int64)v14->EndingVpnHigh << 32)) << 12) | 0xFFF) != a3 )
            break;
          v17 = (_MMVAD_SHORT *)p_Core->ExtraCreateInfo;
          v18 = 0i64;
          v19 = p_Core;
          if( v17 )
          {
            for( j = v17->NextVad; j; j = j->NextVad )
              v17 = j;
          }
          else
          {
            for( k = p_Core->VadNode.ParentValue; ; k = v17->VadNode.ParentValue )
            {
              v17 = (_MMVAD_SHORT *)(k & 0xFFFFFFFFFFFFFFFCui64);
              if( !v17 || v17->NextVad == v19 )
                break;
              v19 = v17;
            }
          }
          while( 1 )
          {
            v22 = (unsigned __int64)v17->ExtraCreateInfo;
            v23 = (unsigned __int64)v17;
            if( v22 )
            {
              v24 = *(_QWORD **)v22;
              if( *(_QWORD *)v22 )
              {
                do
                {
                  v22 = (unsigned __int64)v24;
                  v24 = (_QWORD *)*v24;
                }
                while( v24 );
              }
            }
            else
            {
              for( m = v17->VadNode.ParentValue; ; m = *(_QWORD *)(v22 + 16) )
              {
                v22 = m & 0xFFFFFFFFFFFFFFFCui64;
                if( !v22 || *(_QWORD *)v22 == v23 )
                  break;
                v23 = v22;
              }
            }
            MiReferenceVad(v17);
            MiRemovePlaceholderVad((_RTL_BALANCED_NODE *)v17);
            v17->NextVad = &v18->Core;
            v18 = (_MMVAD *)v17;
            if( v17 == v14 )
              break;
            v17 = (_MMVAD_SHORT *)v22;
          }
          p_Core->EndingVpn = a3 >> 12;
          p_Core->EndingVpnHigh = a3 >> 44;
          UNLOCK_ADDRESS_SPACE_UNORDERED(Thread, Process);
          do
          {
            v26 = v18;
            v18 = (_MMVAD *)v18->Core.NextVad;
            MiDeleteVad(v26, 0i64);
          }
          while( v18 );
          MiUnlockVad(Thread, p_Core);
          return 0;
        }
      }
    }
  }
  v12 = -1073741800;
LABEL_38:
  MiUnlockVadRange(Process, StartingVa, v6);
  return v12;
}

Referenced by:

MmFreeVirtualMemory