PopUpdateWakeSourceWorker

VOID __stdcall PopUpdateWakeSourceWorker(VOID *Context){
  __int64 *v1; 
  __int64 v2; 
  NTSTATUS v3; 
  POP_WAKE_SOURCE **v4; 
  POP_WAKE_SOURCE *v5; 
  POP_WAKE_SOURCE *v6; 
  __int64 v7; 
  POP_WAKE_SOURCE **v8; 
  _POP_WAKE_SOURCE **v9; 
  _KEVENT *v10; 
  __int64 *v11; 
  __int64 **v12; 
  _POP_WAKE_SOURCE *v13; 
  __int64 v14; 
  _POP_WAKE_SOURCE *WakeSource; 
  _POP_WAKE_SOURCE **p_WakeSource; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  POP_WAKE_SOURCE *NewWakeSource; 
  POP_WAKE_SOURCE *RemoveWakeSource; 

  RemoveWakeSource = 0i64;
  NewWakeSource = 0i64;
  p_WakeSource = &WakeSource;
  WakeSource = (_POP_WAKE_SOURCE *)&WakeSource;
  memset(&LockHandle, 0, sizeof(LockHandle));
  PopAcquireWakeSourceSpinLock(&LockHandle);
  while( 1 )
  {
    v1 = (__int64 *)*(&stru_140C23628 + 361);
    if( (_UNKNOWN *)*(&stru_140C23628 + 361) == (_UNKNOWN *)((char *)&stru_140C23628 + 2888) )
      break;
    PopReleaseWakeSourceSpinLock(&LockHandle);
    v2 = v1[3];
    IoControlPnpDeviceActionQueue(1u);
    v3 = PopProcessWakeSourceWork((POP_WAKE_SOURCE_WORK *)v1, &NewWakeSource, &RemoveWakeSource);
    IoControlPnpDeviceActionQueue(0);
    ObfDereferenceObjectWithTag((VOID *)v1[2], 0x67446F50ui64);
    PopAcquireWakeSourceSpinLock(&LockHandle);
    if( (v2 == *(&stru_140C23628 + 357) || v2 == *(&stru_140C23628 + 356)) && v3 >= 0 )
    {
      v4 = *(POP_WAKE_SOURCE ***)(v2 + 32);
      if( *v4 != (POP_WAKE_SOURCE *)(v2 + 24) )
        goto LABEL_25;
      v5 = NewWakeSource;
      NewWakeSource = 0i64;
      *(_QWORD *)v5 = v2 + 24;
      *((_QWORD *)v5 + 1) = v4;
      *v4 = v5;
      *(_QWORD *)(v2 + 32) = v5;
      ++*(_DWORD *)(v2 + 40);
      v6 = RemoveWakeSource;
      if( !RemoveWakeSource )
        goto LABEL_15;
      v7 = *(_QWORD *)RemoveWakeSource;
      if( *(POP_WAKE_SOURCE **)(*(_QWORD *)RemoveWakeSource + 8i64) != RemoveWakeSource )
        goto LABEL_25;
      v8 = (POP_WAKE_SOURCE **)*((_QWORD *)RemoveWakeSource + 1);
      if( *v8 != RemoveWakeSource )
        goto LABEL_25;
      *v8 = (POP_WAKE_SOURCE *)v7;
      *(_QWORD *)(v7 + 8) = v8;
      --*(_DWORD *)(v2 + 40);
      NewWakeSource = v6;
    }
    else
    {
      v6 = NewWakeSource;
    }
    if( v6 )
    {
      v9 = p_WakeSource;
      if( *p_WakeSource != (_POP_WAKE_SOURCE *)&WakeSource )
        goto LABEL_25;
      *((_QWORD *)v6 + 1) = p_WakeSource;
      *(_QWORD *)v6 = &WakeSource;
      *v9 = v6;
      p_WakeSource = (_POP_WAKE_SOURCE **)v6;
    }
LABEL_15:
    PopWakeInfoDereference(v2);
    v10 = (_KEVENT *)v1[4];
    if( v10 )
      KeSetEvent(v10, 0, 0);
    v11 = (__int64 *)*v1;
    if( *(__int64 **)(*v1 + 8) != v1 || (v12 = (__int64 **)v1[1], *v12 != v1) )
LABEL_25:
      __fastfail(3u);
    *v12 = v11;
    v11[1] = (__int64)v12;
    ExFreePoolWithTag(v1, 0x206D654Du);
  }
  *(&stru_140C23628 + 2904) = 0;
  PopReleaseWakeSourceSpinLock(&LockHandle);
  while( 1 )
  {
    v13 = WakeSource;
    if( WakeSource == (_POP_WAKE_SOURCE *)&WakeSource )
      break;
    if( *((_POP_WAKE_SOURCE ***)WakeSource + 1) != &WakeSource )
      goto LABEL_25;
    v14 = *(_QWORD *)WakeSource;
    if( *(_POP_WAKE_SOURCE **)(*(_QWORD *)WakeSource + 8i64) != WakeSource )
      goto LABEL_25;
    WakeSource = *(_POP_WAKE_SOURCE **)WakeSource;
    *(_QWORD *)(v14 + 8) = &WakeSource;
    PopFreeWakeSource(v13);
  }
}

Referenced by:

No references.