CmpTryToRundownHive

INT64 __fastcall CmpTryToRundownHive(
        _CMHIVE *CmHive,
        _CM_KEY_CONTROL_BLOCK *RootKcb,
        UINT8 *RundownAcquired,
        UINT *RundownLogIndex){
  char v5; 
  char v6; 
  char *v9; 
  char v10; 
  PVOID **v11; 
  bool v12; 
  _CM_RM *CmRm; 
  INT64 result; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  UINT8 v18; 
  __int64 v19; 
  __int64 v20; 
  signed __int32 v21[8]; 
  UINT64 pCount[5]; 

  v5 = 0;
  v6 = 0;
  *(_OWORD *)pCount = 0i64;
  CmpInitializeRollbackPacket(pCount);
  v10 = *v9;
  while( 1 )
  {
    if( *RundownAcquired )
      CmpReleaseShutdownRundown();
    *RundownAcquired = 0;
    if( !CmpAcquireShutdownRundown() )
      goto LABEL_26;
    v12 = RootKcb->RefCount == 2;
    *RundownAcquired = 1;
    if( !v12 && (CmpDoesKeyHaveOpenSubkeys((INT64)RootKcb) || RootKcb->RefCount != 2) )
      goto LABEL_26;
    if( !v5 )
    {
      RootKcb->_bf_8 |= 0x40000u;
      CmpUnlockRegistry();
      UNLOCK_HIVE_LOAD();
      _InterlockedIncrement((_DWORD *)&WheapErrorSourceTable + 95);
      ExWaitForRundownProtectionRelease(&CmHive->HiveRundown);
      ExRundownCompleted((INT64 *)&CmHive->HiveRundown);
      v5 = 1;
      LOCK_HIVE_LOAD();
      goto LABEL_15;
    }
    CmRm = CmHive->CmRm;
    if( !CmRm || v6 )
      break;
    if( CmSnapshotRMTxArray(CmRm, pCount, v11) < 0 )
      goto LABEL_26;
    CmpLogTransactionAbortedForRollbackPacket((__int64)RootKcb, 11, (unsigned int *)pCount, v15);
    CmpUnlockRegistry();
    if( LODWORD(pCount[0]) )
    {
      UNLOCK_HIVE_LOAD();
      if( (int)CmpAbortRollbackPacket((INT64)pCount) < 0 )
      {
        LOCK_HIVE_LOAD();
        CmpLockRegistryFreezeAware(1u);
LABEL_26:
        if( v5 )
        {
          RootKcb->_bf_8 &= ~0x40000u;
          _InterlockedExchange64((volatile __int64 *)&CmHive->HiveRundown, 0i64);
          if( _InterlockedExchangeAdd((_DWORD *)&WheapErrorSourceTable + 95, 0xFFFFFFFF) == 1 )
          {
            _InterlockedOr(v21, 0);
            if( *(&CmpDummyThreadEvent + 133) )
              ExpUnblockPushLock((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 133, 0i64, 0);
          }
        }
        CmpCleanupRollbackPacket((INT64)pCount);
        if( *RundownAcquired )
        {
          CmpReleaseShutdownRundown();
          *RundownAcquired = 0;
        }
        LOBYTE(result) = 0;
        return result;
      }
      LOCK_HIVE_LOAD();
LABEL_15:
      CmpLockRegistryFreezeAware(1u);
    }
    else
    {
      LODWORD(v16) = CmCloseRmHandle(CmHive->CmRm, 0);
      v17 = v16;
      LODWORD(v19) = CmCloseTmHandle(CmHive->CmRm, v18);
      v20 = v19;
      UNLOCK_HIVE_LOAD();
      if( v17 )
        ZwClose(v17);
      if( v20 )
        ZwClose(v20);
      LOCK_HIVE_LOAD();
      CmShutdownCmRM((__int64)CmHive->CmRm, 1);
      CmpLockRegistryFreezeAware(1u);
      v6 = 1;
    }
  }
  if( _InterlockedExchangeAdd((_DWORD *)&WheapErrorSourceTable + 95, 0xFFFFFFFF) == 1 )
  {
    _InterlockedOr(v21, 0);
    if( *(&CmpDummyThreadEvent + 133) )
      ExpUnblockPushLock((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 133, 0i64, 0);
  }
  CmpCleanupRollbackPacket((INT64)pCount);
  if( !v10 )
  {
    CmpReleaseShutdownRundown();
    *RundownAcquired = 0;
  }
  LOBYTE(result) = 1;
  return result;
}

Referenced by:

CmpLateUnloadHiveWorker