CmpTransMgrSyncHive

NTSTATUS __stdcall CmpTransMgrSyncHive(_CMHIVE *CmHive){
  volatile signed __int64 *v2; 
  char v3; 
  EVENT_DESCRIPTOR *v4; 
  NTSTATUS v5; 
  CHAR v7; 
  char v8; 
  CmpLockRegistry();
  v2 = (volatile signed __int64 *)((char *)CmHive + 72);
  ExAcquirePushLockExclusiveEx((UINT64)CmHive + 72, 0i64);
  if( (*(_DWORD *)(*((_QWORD *)CmHive + 8) + 144i64) & 1) != 0 )
    goto LABEL_2;
  ExAcquirePushLockExclusiveEx((UINT64)CmHive + 80, 0i64);
  v7 = HvpMarkDirty((INT64)CmHive, 0i64, 32i64);
  v8 = _InterlockedExchangeAdd64((volatile signed __int64 *)CmHive + 10, 0xFFFFFFFFFFFFFFFFui64);
  if( (v8 & 2) != 0 && (v8 & 4) == 0 )
    ExfTryToWakePushLock((volatile INT64 *)CmHive + 10);
  KeAbPostRelease((char *)CmHive + 80);
  if( v7 )
  {
    *(_DWORD *)(*((_QWORD *)CmHive + 8) + 144i64) |= 1u;
LABEL_2:
    v3 = _InterlockedExchangeAdd64(v2, 0xFFFFFFFFFFFFFFFFui64);
    if( (v3 & 2) != 0 && (v3 & 4) == 0 )
      ExfTryToWakePushLock((volatile INT64 *)CmHive + 9);
    KeAbPostRelease((char *)CmHive + 72);
    CmpUnlockRegistry();
    v5 = CmpFlushHive((ULONG_PTR)CmHive, 0, v4);
    if( v5 < 0 )
      return -1073741670;
    return v5;
  }
  v5 = -1073741670;
  if( (_InterlockedExchangeAdd64(v2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v2);
  KeAbPostRelease((PVOID)v2);
  CmpUnlockRegistry();
  return v5;
}

Referenced by:

CmpTransMgrCommit
CmpTransMgrPrepare