CmpTrimHive
void __fastcall CmpTrimHive(__int64 a1){
unsigned int v2;
UINT64 v3;
char v4;
if( CmpAccessBitForPhase == 2 )
{
v2 = *(_DWORD *)(a1 + 4792);
if( v2 || (v2 = *(_DWORD *)(a1 + 4796)) != 0 )
{
CmpLockRegistry();
ExAcquirePushLockSharedEx(a1 + 72, 0i64);
ExAcquirePushLockExclusiveEx(a1 + 80, 0i64);
v3 = *(unsigned int *)(a1 + 272);
*(_DWORD *)(a1 + 4800) = v3;
*(_DWORD *)(a1 + 4796) = v2;
HvTrimHive(a1, v2, v3);
v4 = _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 80), 0xFFFFFFFFFFFFFFFFui64);
if( (v4 & 2) != 0 && (v4 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)(a1 + 80));
KeAbPostRelease((PVOID)(a1 + 80));
if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 72), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(a1 + 72));
KeAbPostRelease((PVOID)(a1 + 72));
CmpUnlockRegistry();
}
}
}Referenced by:
CmpLoadKeyCommon
CmpUpdatePhaseAccessBit