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.