HvpViewMapPromoteRangeToMapping

INT64 __fastcall HvpViewMapPromoteRangeToMapping(UINT64 a1, INT64 a2, UINT64 a3, INT64 *a4){
  UINT64 v4; 
  unsigned __int64 v5; 
  INT64 v6; 
  INT64 v7; 
  bool v8; 
  UINT64 v9; 
  int v10; 
  unsigned __int64 v11; 
  int ViewRangeValid; 
  INT64 MemoryAllocationGranularity; 
  int View; 
  INT64 v16; 
  PPRIVILEGE_SET v17; 
  INT64 v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  INT64 v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  __int64 i; 
  _QWORD *v25; 
  __int64 v26; 
  UINT64 v27; 
  _QWORD *v28; 
  unsigned __int64 v29; 
  bool v30; 
  unsigned __int64 v31; 
  PPRIVILEGE_SET v32; 
  __int64 v33; 
  VOID *v34; 
  unsigned __int64 v35; 
  unsigned __int64 v36; 
  _QWORD *v37; 
  _QWORD *v38; 
  VOID *v39; 
  PPRIVILEGE_SET v40; 
  PPRIVILEGE_SET Privileges; 
  PPRIVILEGE_SET *p_Privileges; 
  v40 = 0i64;
  v4 = a1 + 40;
  v5 = *(_QWORD *)(a1 + 40);
  v6 = (unsigned int)(a2 + 4096);
  v7 = v6 + (unsigned int)a3;
  p_Privileges = &Privileges;
  v8 = (*(_BYTE *)(a1 + 48) & 1) == 0;
  Privileges = (PPRIVILEGE_SET)&Privileges;
  v9 = a1;
  if( !v8 && v5 )
    v5 ^= v4;
  v10 = *(_BYTE *)(a1 + 48) & 1;
  while( v5 )
  {
    if( v6 >= *(_QWORD *)(v5 + 40) )
    {
      if( v6 < *(_QWORD *)(v5 + 48) )
        break;
      v11 = *(_QWORD *)(v5 + 8);
    }
    else
    {
      v11 = *(_QWORD *)v5;
    }
    if( v10 && v11 )
      v5 ^= v11;
    else
      v5 = v11;
  }
  if( *(_QWORD *)(v5 + 48) >= v7 )
  {
    *a4 = v6 + *(_QWORD *)(v5 + 56) - *(_QWORD *)(v5 + 24);
    return 0;
  }
  MemoryAllocationGranularity = CmSiGetMemoryAllocationGranularity();
  View = HvpViewMapCreateView(v9, v6 & -MemoryAllocationGranularity, v7, (CHAR **)&v40);
  v17 = v40;
  ViewRangeValid = View;
  if( View >= 0 )
  {
    ViewRangeValid = HvpViewMapMakeViewRangeValid(v9, v40, v6, v7, 0);
    if( ViewRangeValid >= 0 )
    {
      v18 = v6;
      if( v6 < (unsigned __int64)v7 )
      {
        do
        {
          v19 = *(_QWORD *)v4;
          if( (*(_BYTE *)(v4 + 8) & 1) != 0 && v19 )
            v19 ^= v4;
          while( v19 )
          {
            if( v18 >= *(_QWORD *)(v19 + 40) )
            {
              if( v18 < *(_QWORD *)(v19 + 48) )
                break;
              v20 = *(_QWORD *)(v19 + 8);
            }
            else
            {
              v20 = *(_QWORD *)v19;
            }
            if( (*(_BYTE *)(v4 + 8) & 1) != 0 && v20 )
              v19 ^= v20;
            else
              v19 = v20;
          }
          ViewRangeValid = HvpViewMapMigrateCOWData(a1, v17, v19);
          if( ViewRangeValid < 0 )
            goto LABEL_75;
          v18 = *(_QWORD *)(v19 + 48);
        }
        while( v18 < v7 );
      }
      v21 = v7 - 1;
      v22 = *(_QWORD *)v4;
      if( (*(_BYTE *)(v4 + 8) & 1) != 0 && v22 )
        v22 ^= v4;
      while( v22 )
      {
        if( v21 >= *(_QWORD *)(v22 + 40) )
        {
          if( v21 < *(_QWORD *)(v22 + 48) )
            break;
          v23 = *(_QWORD *)(v22 + 8);
        }
        else
        {
          v23 = *(_QWORD *)v22;
        }
        if( (*(_BYTE *)(v4 + 8) & 1) != 0 && v23 )
          v22 ^= v23;
        else
          v22 = v23;
      }
      for( i = *(_QWORD *)(v5 + 48); i < *(_QWORD *)(v22 + 40); i = *(_QWORD *)(v35 + 48) )
      {
        v35 = *(_QWORD *)v4;
        if( (*(_BYTE *)(v4 + 8) & 1) != 0 && v35 )
          v35 ^= v4;
        while( v35 )
        {
          if( i < *(_QWORD *)(v35 + 40) )
          {
            v36 = *(_QWORD *)v35;
          }
          else
          {
            if( i < *(_QWORD *)(v35 + 48) )
              break;
            v36 = *(_QWORD *)(v35 + 8);
          }
          if( (*(_BYTE *)(v4 + 8) & 1) != 0 && v36 )
            v35 ^= v36;
          else
            v35 = v36;
        }
        RtlRbRemoveNode((unsigned __int64 *)v4, v35);
        v37 = p_Privileges;
        if( *p_Privileges != (PPRIVILEGE_SET)&Privileges )
          goto LABEL_104;
        *(_QWORD *)(v35 + 8) = p_Privileges;
        *(_QWORD *)v35 = &Privileges;
        *v37 = v35;
        p_Privileges = (PPRIVILEGE_SET *)v35;
      }
      v25 = (_QWORD *)v5;
      if( *(_QWORD *)(v5 + 40) == v6 )
      {
        RtlRbRemoveNode((unsigned __int64 *)v4, v5);
        v38 = p_Privileges;
        if( *p_Privileges != (PPRIVILEGE_SET)&Privileges )
          goto LABEL_104;
        *(_QWORD *)(v5 + 8) = p_Privileges;
        *(_QWORD *)v5 = &Privileges;
        *v38 = v5;
        p_Privileges = (PPRIVILEGE_SET *)v5;
        v27 = a1;
      }
      else
      {
        v26 = *(_QWORD *)(v5 + 48);
        v27 = a1;
        HvpViewMapMakeViewRangeInvalid(a1, v25, v6, v26);
      }
      if( *(_QWORD *)(v22 + 48) == v7 )
      {
        RtlRbRemoveNode((unsigned __int64 *)v4, v22);
        v28 = p_Privileges;
        if( *p_Privileges != (PPRIVILEGE_SET)&Privileges )
          goto LABEL_104;
        *(_QWORD *)(v22 + 8) = p_Privileges;
        *(_QWORD *)v22 = &Privileges;
        *v28 = v22;
        p_Privileges = (PPRIVILEGE_SET *)v22;
      }
      else
      {
        HvpViewMapMakeViewRangeInvalid(v27, (_QWORD *)v22, *(_QWORD *)(v22 + 40), v7);
      }
      v29 = *(_QWORD *)v4;
      if( (*(_BYTE *)(v4 + 8) & 1) != 0 && v29 )
        v29 ^= v4;
      v30 = 0;
      if( v29 )
      {
        while( 1 )
        {
          if( *(_QWORD *)&v17[2].PrivilegeCount < *(_QWORD *)(v29 + 40) )
          {
            v31 = *(_QWORD *)v29;
            if( (*(_BYTE *)(v4 + 8) & 1) != 0 )
            {
              if( !v31 )
                goto LABEL_103;
              v31 ^= v29;
            }
            if( !v31 )
            {
LABEL_103:
              v30 = 0;
              break;
            }
          }
          else
          {
            v31 = *(_QWORD *)(v29 + 8);
            if( (*(_BYTE *)(v4 + 8) & 1) != 0 )
            {
              if( !v31 )
                goto LABEL_102;
              v31 ^= v29;
            }
            if( !v31 )
            {
LABEL_102:
              v30 = 1;
              break;
            }
          }
          v29 = v31;
        }
      }
      RtlRbInsertNodeEx((unsigned __int64 *)v4, v29, v30, (unsigned __int64)v17);
      v32 = Privileges;
      v33 = *(_QWORD *)&Privileges->PrivilegeCount;
      if( (PPRIVILEGE_SET *)Privileges->Privilege[0].Luid == &Privileges )
      {
        while( 1 )
        {
          if( *(PPRIVILEGE_SET *)(v33 + 8) != v32 )
            goto LABEL_104;
          Privileges = (PPRIVILEGE_SET)v33;
          *(_QWORD *)(v33 + 8) = &Privileges;
          if( v32 == (PPRIVILEGE_SET)&Privileges )
            break;
          v34 = *(VOID **)&v32[2].Privilege[0].Attributes;
          if( v34 )
            CmSiUnmapViewOfSection((INT64)&Privileges, *(PVOID **)(v27 + 24), v34);
          CmSiFreeMemory(v32);
          v32 = Privileges;
          if( (PPRIVILEGE_SET *)Privileges->Privilege[0].Luid != &Privileges )
            goto LABEL_104;
          v33 = *(_QWORD *)&Privileges->PrivilegeCount;
        }
        ViewRangeValid = 0;
        v16 = v6 + *(_QWORD *)&v17[2].Privilege[0].Attributes - *(_QWORD *)&v17[1].Control;
        v17 = 0i64;
        *a4 = v16;
LABEL_75:
        v9 = a1;
        goto LABEL_76;
      }
LABEL_104:
      __fastfail(3u);
    }
  }
LABEL_76:
  if( v17 )
  {
    v39 = *(VOID **)&v17[2].Privilege[0].Attributes;
    if( v39 )
      CmSiUnmapViewOfSection(v16, *(PVOID **)(v9 + 24), v39);
    CmSiFreeMemory(v17);
  }
  return(unsigned int)ViewRangeValid;
}

Referenced by:

HvpAddBin
HvpRemapAndEnlistHiveBins