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