PopCompleteNotifyTransitionCommon

NTSTATUS __fastcall PopCompleteNotifyTransitionCommon(INT64 a1, INT64 *a2, INT64 a3, DEVICE_OBJECT *a4){
  __int64 *v4; 
  INT64 v5; 
  __int64 v6; 
  char v8; 
  unsigned int v9; 
  INT64 v10; 
  _PO_DEVICE_NOTIFY_ORDER *v11; 
  INT64 v12; 
  __int64 v13; 
  INT64 **v14; 
  INT64 v15; 
  INT64 **v16; 
  INT64 v17; 
  INT64 *v18; 
  INT64 i; 
  UINT64 v20; 
  NTSTATUS result; 
  INT64 v22; 
  INT64 **v23; 
  INT64 *j; 
  INT64 *v25; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  int v28; 
  v28 = a3;
  v4 = (__int64 *)*(a2 - 19);
  v5 = a1;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v6 = 0i64;
  if( (PVOID)*(a2 - 18) != IopRootDeviceNode )
    v6 = *(a2 - 18);
  v8 = 0;
  v9 = 0;
  KeAcquireInStackQueuedSpinLock((UINT64 *)DevState + 1, &LockHandle);
  v11 = (_PO_DEVICE_NOTIFY_ORDER *)(v5 + 48);
  v12 = *a2;
  v13 = 9i64 * *((unsigned __int8 *)a2 + 56);
  v14 = (INT64 **)a2[1];
  if( *(INT64 **)(*a2 + 8) != a2 || *v14 != a2 )
    goto LABEL_47;
  *v14 = (INT64 *)v12;
  *(_QWORD *)(v12 + 8) = v14;
  if( !*(_BYTE *)(v5 + 464) )
  {
    v15 = v5 + 104 + 8 * v13;
    v16 = *(INT64 ***)(v15 + 8);
    if( *v16 == (INT64 *)v15 )
    {
      *a2 = v15;
      a2[1] = (INT64)v16;
      *v16 = a2;
      *(_QWORD *)(v15 + 8) = a2;
      --v11->OrderLevel[(unsigned __int64)v13 / 9].ActiveCount;
      if( v6
        && PopReadyParentSleep(
             (_PO_DEVICE_NOTIFY *)(v6 + 160),
             (_PO_DEVICE_NOTIFY_ORDER *)(v5 + 48),
             *((_BYTE *)a2 + 56)) )
      {
        v9 = 1;
      }
      v17 = a2[4];
      if( (INT64 *)v17 != a2 + 4 )
      {
        do
        {
          if( PopReadyParentSleep(*(_PO_DEVICE_NOTIFY **)(v17 + 40), v11, *((_BYTE *)a2 + 56)) )
            ++v9;
          v17 = *(_QWORD *)v17;
        }
        while( (INT64 *)v17 != a2 + 4 );
        v5 = a1;
      }
      while( v4 )
      {
        PopPrepChildWake((_PO_DEVICE_NOTIFY *)(v4 + 20), v11);
        v4 = (__int64 *)*v4;
      }
      v18 = a2 + 2;
      for( i = a2[2]; (INT64 *)i != v18; i = *v25 )
        PopPrepChildWake(*(_PO_DEVICE_NOTIFY **)(i - 8), v11);
      if( v28 >= 0 )
        goto LABEL_15;
      if( a4 && *(_BYTE *)v5 == 3 )
        PopDiagTraceDriverVeto(a4, a2);
      if( v28 >= 0 || *(_BYTE *)(v5 + 466) || v28 == -1073741637 && *(_BYTE *)(v5 + 467) || *(int *)(v5 + 448) < 0 )
      {
LABEL_15:
        v8 = 0;
      }
      else
      {
        *(_DWORD *)(v5 + 448) = v28;
        v8 = 1;
        *(_QWORD *)(v5 + 456) = a2[8];
      }
      goto LABEL_16;
    }
LABEL_47:
    __fastfail(3u);
  }
  v22 = v5 + 72 + 8 * v13;
  v23 = *(INT64 ***)(v22 + 8);
  if( *v23 != (INT64 *)v22 )
    goto LABEL_47;
  *a2 = v22;
  a2[1] = (INT64)v23;
  *v23 = a2;
  *(_QWORD *)(v22 + 8) = a2;
  ++v11->OrderLevel[(unsigned __int64)v13 / 9].ActiveCount;
  while( v4 )
  {
    LOBYTE(v10) = *((_BYTE *)a2 + 56);
    if( (unsigned __int8)PopReadyChildWake((_PO_DEVICE_NOTIFY *)(v4 + 20), (_PO_DEVICE_NOTIFY_ORDER *)(v5 + 48), v10) )
      ++v9;
    v4 = (__int64 *)*v4;
  }
  for( j = (INT64 *)a2[2]; j != a2 + 2; j = (INT64 *)*j )
  {
    LOBYTE(v10) = *((_BYTE *)a2 + 56);
    if( (unsigned __int8)PopReadyChildWake((_PO_DEVICE_NOTIFY *)*(j - 1), (_PO_DEVICE_NOTIFY_ORDER *)(v5 + 48), v10) )
      ++v9;
  }
LABEL_16:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  result = KiIrqlFlags;
  __writecr8(LockHandle.OldIrql);
  if( v8 )
    return KeSetEvent(*(PRKEVENT *)(v5 + 24), 0);
  if( v9 )
    return KeReleaseSemaphoreEx(*(KSEMAPHORE **)(v5 + 32), 0i64, v9, v20);
  return result;
}

Referenced by:

PopCompleteDirectedPowerTransitionCallback
PopSystemIrpCompletion