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