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