PopUpdateWakeSourceWorker

VOID __stdcall PopUpdateWakeSourceWorker(VOID *Context){
  PVOID v1; 
  INT64 v2; 
  int v3; 
  CHAR **v4; 
  CHAR *v5; 
  CHAR *v6; 
  __int64 *v7; 
  __int64 **v8; 
  _QWORD *v9; 
  struct _KEVENT *v10; 
  _QWORD *v11; 
  PVOID *v12; 
  PVOID v13; 
  __int64 v14; 
  PVOID P; 
  PVOID *p_P; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  CHAR *a2; 
  __int64 *a3; 
  a3 = 0i64;
  a2 = 0i64;
  p_P = &P;
  P = &P;
  memset(&LockHandle, 0, sizeof(LockHandle));
  PopAcquireWakeSourceSpinLock(&LockHandle);
  while( 1 )
  {
    v1 = PopWakeSourceWorkList;
    if( PopWakeSourceWorkList == &PopWakeSourceWorkList )
      break;
    PopReleaseWakeSourceSpinLock(&LockHandle);
    v2 = *((_QWORD *)v1 + 3);
    IoControlPnpDeviceActionQueue(1u);
    v3 = PopProcessWakeSourceWork((INT64)v1, &a2, &a3);
    IoControlPnpDeviceActionQueue(0);
    ObfDereferenceObjectWithTag(*((PVOID *)v1 + 2), 0x67446F50ui64);
    PopAcquireWakeSourceSpinLock(&LockHandle);
    if( (v2 == PopCurrentWakeInfo || v2 == PopPendingWakeInfo) && v3 >= 0 )
    {
      v4 = *(CHAR ***)(v2 + 32);
      if( *v4 != (CHAR *)(v2 + 24) )
        goto LABEL_25;
      v5 = a2;
      a2 = 0i64;
      *(_QWORD *)v5 = v2 + 24;
      *((_QWORD *)v5 + 1) = v4;
      *v4 = v5;
      *(_QWORD *)(v2 + 32) = v5;
      ++*(_DWORD *)(v2 + 40);
      v6 = (CHAR *)a3;
      if( !a3 )
        goto LABEL_15;
      v7 = (__int64 *)*a3;
      if( *(__int64 **)(*a3 + 8) != a3 )
        goto LABEL_25;
      v8 = (__int64 **)a3[1];
      if( *v8 != a3 )
        goto LABEL_25;
      *v8 = v7;
      v7[1] = (__int64)v8;
      --*(_DWORD *)(v2 + 40);
      a2 = v6;
    }
    else
    {
      v6 = a2;
    }
    if( v6 )
    {
      v9 = p_P;
      if( *p_P != &P )
        goto LABEL_25;
      *((_QWORD *)v6 + 1) = p_P;
      *(_QWORD *)v6 = &P;
      *v9 = v6;
      p_P = (PVOID *)v6;
    }
LABEL_15:
    PopWakeInfoDereference(v2);
    v10 = (struct _KEVENT *)*((_QWORD *)v1 + 4);
    if( v10 )
      KeSetEvent(v10, 0);
    v11 = *(_QWORD **)v1;
    if( *(PVOID *)(*(_QWORD *)v1 + 8i64) != v1 || (v12 = (PVOID *)*((_QWORD *)v1 + 1), *v12 != v1) )
LABEL_25:
      __fastfail(3u);
    *v12 = v11;
    v11[1] = v12;
    ExFreePoolWithTag(v1, 0x206D654Du);
  }
  PopWakeSourceWorkInProgress = 0;
  PopReleaseWakeSourceSpinLock(&LockHandle);
  while( 1 )
  {
    v13 = P;
    if( P == &P )
      break;
    if( *((PVOID **)P + 1) != &P )
      goto LABEL_25;
    v14 = *(_QWORD *)P;
    if( *(PVOID *)(*(_QWORD *)P + 8i64) != P )
      goto LABEL_25;
    P = *(PVOID *)P;
    *(_QWORD *)(v14 + 8) = &P;
    PopFreeWakeSource(v13, &P);
  }
}

Referenced by:

No references.