CmpWorkerEngineWorker

VOID __stdcall CmpWorkerEngineWorker(PVOID NotUsed){
  _QWORD *v1; 
  __int64 v2; 
  int v3; 
  int v4[10]; 
  while( 1 )
  {
    ExAcquireFastMutex(&CmpWorkerEngineLock);
    v1 = *(_QWORD **)CmpWorkerEngineListHead;
    if( *(INT64(__fastcall **)(INT64))CmpWorkerEngineListHead == CmpWorkerEngineListHead )
      break;
    if( *(INT64(__fastcall **)(INT64))(*(_QWORD *)CmpWorkerEngineListHead + 8i64) != CmpWorkerEngineListHead
      || (v2 = *(_QWORD *)CmpWorkerEngineListHead,
          *(_QWORD *)(*(_QWORD *)CmpWorkerEngineListHead + 8i64) != *(_QWORD *)CmpWorkerEngineListHead) )
    {
      __fastfail(3u);
    }
    *(_QWORD *)CmpWorkerEngineListHead = *(_QWORD *)CmpWorkerEngineListHead;
    *(_QWORD *)(v2 + 8) = CmpWorkerEngineListHead;
    v1[1] = v1;
    *v1 = v1;
    KeReleaseGuardedMutex(&CmpWorkerEngineLock);
    v3 = *((_DWORD *)v1 + 4);
    ((void(__fastcall *)(_QWORD))v1[3])(v1[4]);
    if( !v3 )
      ExFreePoolWithTag(v1, 0);
  }
  CmpWorkerEngineWorkItemActive = 0;
  KeReleaseGuardedMutex(&CmpWorkerEngineLock);
  _InterlockedOr(v4, 0);
  if( CmpWorkerEngineFinishedEvent.0 )
    ExfUnblockPushLock(&CmpWorkerEngineFinishedEvent, 0i64);
}

Referenced by:

No references.