HvpViewMapShrinkStorage

_PRIVILEGE_SET *__fastcall HvpViewMapShrinkStorage(UINT64 a1, int a2){
  __int64 v2; 
  __int64 v3; 
  _PRIVILEGE_SET *v4; 
  __int64 v5; 
  UINT64 v7; 
  UINT64 v8; 
  UINT64 v9; 
  __int64 v10; 
  UINT64 *Luid; 
  __int64 v12; 
  VOID *v13; 
  _PRIVILEGE_SET *result; 
  _PRIVILEGE_SET Privileges[2]; 

  v2 = *(_QWORD *)(a1 + 8);
  v3 = (unsigned int)(a2 + 4096);
  v4 = Privileges;
  v5 = v3;
  Privileges[0].Privilege[0].Luid = (_LUID)Privileges;
  *(_QWORD *)&Privileges[0].PrivilegeCount = Privileges;
  if( v3 < v2 )
  {
    v7 = a1 + 40;
    do
    {
      v8 = *(_QWORD *)v7;
      if( (*(_BYTE *)(v7 + 8) & 1) != 0 && v8 )
        v8 ^= v7;
      while( v8 )
      {
        if( v5 < *(_QWORD *)(v8 + 40) )
        {
          v9 = *(_QWORD *)v8;
        }
        else
        {
          if( v5 < *(_QWORD *)(v8 + 48) )
            break;
          v9 = *(_QWORD *)(v8 + 8);
        }
        if( (*(_BYTE *)(v7 + 8) & 1) != 0 && v9 )
          v8 ^= v9;
        else
          v8 = v9;
      }
      v10 = *(_QWORD *)(v8 + 48);
      HvpViewMapMakeViewRangeInvalid(a1, (_QWORD *)v8, v5, v10);
      if( *(_QWORD *)(v8 + 40) == *(_QWORD *)(v8 + 48) )
      {
        RtlRbRemoveNode((UINT64 *)v7, v8);
        Luid = (UINT64 *)Privileges[0].Privilege[0].Luid;
        if( **(_PRIVILEGE_SET ***)&Privileges[0].Privilege[0].Luid != Privileges )
          goto LABEL_22;
        *(_LUID *)(v8 + 8) = Privileges[0].Privilege[0].Luid;
        *(_QWORD *)v8 = Privileges;
        *Luid = v8;
        Privileges[0].Privilege[0].Luid = (_LUID)v8;
      }
      v5 = v10;
    }
    while( v10 < v2 );
    v4 = *(_PRIVILEGE_SET **)&Privileges[0].PrivilegeCount;
  }
  *(_QWORD *)(a1 + 8) = v3;
  v12 = *(_QWORD *)&v4->PrivilegeCount;
  if( (_PRIVILEGE_SET *)v4->Privilege[0].Luid != Privileges )
LABEL_22:
    __fastfail(3u);
  while( 1 )
  {
    if( *(_PRIVILEGE_SET **)(v12 + 8) != v4 )
      goto LABEL_22;
    *(_QWORD *)&Privileges[0].PrivilegeCount = v12;
    *(_QWORD *)(v12 + 8) = Privileges;
    result = Privileges;
    if( v4 == Privileges )
      return result;
    v13 = *(VOID **)&v4[2].Privilege[0].Attributes;
    if( v13 )
      CmSiUnmapViewOfSection((__int64)Privileges, *(VOID ***)(a1 + 24), v13);
    CmSiFreeMemory(v4);
    v4 = *(_PRIVILEGE_SET **)&Privileges[0].PrivilegeCount;
    if( *(_PRIVILEGE_SET **)(*(_QWORD *)&Privileges[0].PrivilegeCount + 8i64) != Privileges )
      goto LABEL_22;
    v12 = **(_QWORD **)&Privileges[0].PrivilegeCount;
  }
}

Referenced by:

HvFreeHivePartial
HvpAddBin