CmpDoQueueLateUnloadWorker
void __fastcall CmpDoQueueLateUnloadWorker(__int64 a1){
volatile signed __int64 *v1;
signed __int64 v3;
char v4;
v1 = (volatile signed __int64 *)(a1 + 1672);
v3 = a1 + 2952;
ExAcquirePushLockExclusiveEx(a1 + 1672, 0i64);
*(_DWORD *)(a1 + 4i64 * (_InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 4276), 1u) & 0x7F) + 4280) = 19;
if( **(_QWORD **)(a1 + 2928) == 2i64 && !*(_QWORD *)(a1 + 2944) )
{
*(_DWORD *)(a1 + 4i64 * (_InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 4276), 1u) & 0x7F) + 4280) = 20;
if( !_InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 2944), v3, 0i64) )
{
*(_DWORD *)(a1 + 4i64 * (_InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 4276), 1u) & 0x7F) + 4280) = 21;
*(_DWORD *)(v3 + 16) = 1;
*(_QWORD *)(v3 + 24) = CmpLateUnloadHiveWorker;
*(_QWORD *)(v3 + 32) = a1;
CmpReferenceHive((_CMHIVE *)a1);
CmWorkerEngineQueueWorkItem(v3);
}
}
v4 = _InterlockedExchangeAdd64(v1, 0xFFFFFFFFFFFFFFFFui64);
if( (v4 & 2) != 0 && (v4 & 4) == 0 )
ExfTryToWakePushLock(v1);
KeAbPostRelease((PVOID)v1);
}Referenced by:
CmReleaseLoadKeyContext
CmpDelayDerefKeyControlBlock
CmpDereferenceKeyControlBlock
CmpDereferenceKeyControlBlockWithLock
CmpDoFlushNextHive