CmpLateUnloadHiveWorker

VOID __stdcall CmpLateUnloadHiveWorker(PVOID Hive){
  _CM_KEY_CONTROL_BLOCK *v2; 
  UINT *v3; 
  char v4; 
  UINT64 v5; 
  INT64 v6; 
  char RundownAcquired[4]; 
  int a3; 
  _KAPC_STATE ApcState; 

  a3 = 2;
  memset(&ApcState, 0, sizeof(ApcState));
  LOCK_HIVE_LOAD();
  CmpLockRegistryFreezeAware(1u);
  *((_DWORD *)Hive + (_InterlockedExchangeAdd((volatile signed __int32 *)Hive + 1069, 1u) & 0x7F) + 1070) = 22;
  v2 = (_CM_KEY_CONTROL_BLOCK *)*((_QWORD *)Hive + 366);
  if( (*((_DWORD *)Hive + 40) & 0x40) != 0 )
  {
    *((_DWORD *)Hive + (_InterlockedExchangeAdd((volatile signed __int32 *)Hive + 1069, 1u) & 0x7F) + 1070) = 23;
LABEL_11:
    CmpUnlockRegistry();
    UNLOCK_HIVE_LOAD();
    goto LABEL_12;
  }
  RundownAcquired[0] = CmpAcquireShutdownRundown();
  if( !RundownAcquired[0] )
  {
    *((_DWORD *)Hive + (_InterlockedExchangeAdd((volatile signed __int32 *)Hive + 1069, 1u) & 0x7F) + 1070) = 24;
    goto LABEL_11;
  }
  if( !*((_BYTE *)Hive + 2936) )
  {
    *((_DWORD *)Hive + (_InterlockedExchangeAdd((volatile signed __int32 *)Hive + 1069, 1u) & 0x7F) + 1070) = 25;
    goto LABEL_8;
  }
  if( (*((_DWORD *)Hive + 1038) & 0x20) != 0 )
    ++*(&CmpDummyThreadEvent + 222);
  v4 = CmpTryToRundownHive((_CMHIVE *)Hive, v2, (UINT8 *)RundownAcquired, v3);
  *((_QWORD *)Hive + 368) = 0i64;
  if( v4 )
  {
    v5 = *((_QWORD *)Hive + 366);
    *((_DWORD *)Hive + (_InterlockedExchangeAdd((volatile signed __int32 *)Hive + 1069, 1u) & 0x7F) + 1070) = 30;
    CmpAttachToRegistryProcess(&ApcState);
    CmpCompleteUnloadKey(v5, v6, &a3);
    CmpDetachFromRegistryProcess(&ApcState);
    CmpLockRegistry();
    CmpDereferenceKeyControlBlock(v5);
LABEL_8:
    CmpUnlockRegistry();
    UNLOCK_HIVE_LOAD();
    CmpDereferenceHive((_CMHIVE *)Hive);
    CmpReleaseShutdownRundown();
    return;
  }
  if( (*((_DWORD *)Hive + 1038) & 0x20) != 0 )
    CmpDecrementAppHiveUnloadCount();
  CmpUnlockRegistry();
  UNLOCK_HIVE_LOAD();
  if( RundownAcquired[0] )
    CmpReleaseShutdownRundown();
LABEL_12:
  CmpDereferenceHive((_CMHIVE *)Hive);
}

Referenced by:

No references.