CmpVolumeContextDecrementRefCount
NTSTATUS __stdcall CmpVolumeContextDecrementRefCount(PPRIVILEGE_SET Privileges){
volatile INT64 *v1;
signed __int64 v3;
signed __int64 i;
signed __int64 v5;
__int64 v6;
__int64 v7;
PPRIVILEGE_SET *Luid;
v1 = *(volatile INT64 **)&Privileges->Privilege[0].Attributes;
_m_prefetchw(&Privileges[1].Control);
v3 = *(_QWORD *)&Privileges[1].Control;
for( i = v3 - 1; i > 0; i = v3 - 1 )
{
v5 = v3;
v3 = _InterlockedCompareExchange64((volatile signed __int64 *)&Privileges[1].Control, i, v3);
if( v5 == v3 )
return v3;
}
if( i )
__fastfail(0xEu);
ExAcquirePushLockExclusiveEx((UINT64)v1, 0i64);
v6 = _InterlockedDecrement64((volatile signed __int64 *)&Privileges[1].Control);
if( v6 > 0 )
{
if( (_InterlockedExchangeAdd64(v1, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v1);
KeAbPostRelease((PVOID)v1);
}
else
{
if( v6 )
__fastfail(0xEu);
v7 = *(_QWORD *)&Privileges->PrivilegeCount;
if( *(PPRIVILEGE_SET *)(*(_QWORD *)&Privileges->PrivilegeCount + 8i64) != Privileges
|| (Luid = (PPRIVILEGE_SET *)Privileges->Privilege[0].Luid, *Luid != Privileges) )
{
__fastfail(3u);
}
*Luid = (PPRIVILEGE_SET)v7;
*(_QWORD *)(v7 + 8) = Luid;
if( (_InterlockedExchangeAdd64(v1, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v1);
KeAbPostRelease((PVOID)v1);
CmpVolumeContextCleanup();
CmSiFreeMemory(Privileges);
}
return v3;
}Referenced by:
CmShutdownSystem
CmpCompleteUnloadKey
CmpDestroyHive