IoBuildPoDeviceNotifyList

VOID __stdcall IoBuildPoDeviceNotifyList(_PO_DEVICE_NOTIFY_ORDER *Order){
  unsigned int v1; 
  unsigned int v2; 
  __int64 **v3; 
  _LIST_ENTRY **p_Blink; 
  __int64 v6; 
  _QWORD *v7; 
  _QWORD *v8; 
  _QWORD *i; 
  __int64 ***v10; 
  DEVICE_OBJECT *AttachedDeviceReference; 
  PWCHAR v12; 
  void *v13; 
  PWCHAR v14; 
  void *v15; 
  _QWORD **v16; 
  _QWORD *j; 
  __int64 **v18; 
  __int64 *v19; 
  __int64 **v20; 
  __int64 v21; 
  __int64 **v22; 
  __int64 *k; 
  _QWORD *v24; 
  char v25; 
  _QWORD *m; 
  _QWORD *v27; 
  _QWORD *v28; 
  _QWORD *v29; 
  _QWORD *v30; 
  _QWORD *v31; 
  _QWORD *n; 
  _QWORD *v33; 
  _QWORD *ii; 
  _QWORD *v35; 
  _QWORD *jj; 
  _QWORD *v37; 
  _QWORD *v38; 
  char v39; 
  _DWORD *v40; 
  _DWORD *LowerDeviceObjectWithTag; 
  _QWORD *v42; 
  char v43; 
  _QWORD *v44; 
  _QWORD **v45; 
  _BYTE *v46; 
  unsigned __int8 v47; 
  _QWORD *kk; 
  _QWORD *mm; 
  _QWORD *nn; 
  _QWORD *v51; 
  _QWORD *i1; 
  __int64 v53; 
  unsigned __int8 v54; 
  _QWORD *v55; 
  __int64 v56; 
  __int64 *v57; 
  __int64 i2; 
  __int64 v59; 
  __int64 i3; 
  char *v61; 
  char **v62; 
  _QWORD *v63; 
  PVOID v64; 
  __int64 v65; 
  __int64 *v66; 
  __int64 v67; 
  char v68; 
  _LIST_ENTRY *Blink; 
  __int64 *v70; 
  __int64 **v71; 
  LIST_ENTRY ListHead; 
  v2 = v1;
  v71 = &v70;
  ListHead.Blink = &ListHead;
  ListHead.Flink = &ListHead;
  v3 = &v70;
  v70 = (__int64 *)&v70;
  if( (v1 & 1) == 0 )
  {
    PnpLockDeviceActionQueue();
    v3 = (__int64 **)v70;
  }
  memset((INT64)Order, 0i64);
  p_Blink = &Order->OrderLevel[0].ReadySleep.Blink;
  Order->Flags = v2;
  v6 = 5i64;
  do
  {
    *(p_Blink - 2) = (_LIST_ENTRY *)(p_Blink - 3);
    *(p_Blink - 3) = (_LIST_ENTRY *)(p_Blink - 3);
    *p_Blink = (_LIST_ENTRY *)(p_Blink - 1);
    *(p_Blink - 1) = (_LIST_ENTRY *)(p_Blink - 1);
    p_Blink[2] = (_LIST_ENTRY *)(p_Blink + 1);
    p_Blink[1] = (_LIST_ENTRY *)(p_Blink + 1);
    v7 = p_Blink + 3;
    p_Blink[4] = (_LIST_ENTRY *)(p_Blink + 3);
    p_Blink += 9;
    *v7 = v7;
    --v6;
  }
  while( v6 );
  v8 = IopRootDeviceNode;
  for( i = (_QWORD *)*((_QWORD *)IopRootDeviceNode + 1); i; i = (_QWORD *)i[1] )
    v8 = i;
  if( v8 == IopRootDeviceNode )
    goto LABEL_27;
  do
  {
    v10 = (__int64 ***)(v8 + 20);
    *((_DWORD *)v8 + 62) = 0;
    *((_DWORD *)v8 + 63) = 0;
    *((_DWORD *)v8 + 64) = 0;
    *((_DWORD *)v8 + 65) = 0;
    *((_BYTE *)v8 + 216) = 0;
    v8[28] = v8[4];
    AttachedDeviceReference = IoGetAttachedDeviceReference((DEVICE_OBJECT *)v8[4]);
    v8[26] = AttachedDeviceReference;
    v12 = IopCaptureObjectName(*((PVOID *)AttachedDeviceReference + 1));
    v13 = (void *)v8[26];
    v8[30] = v12;
    v14 = IopCaptureObjectName(v13);
    v15 = (void *)v8[28];
    v8[29] = v14;
    ObfReferenceObject(v15);
    *((_BYTE *)v8 + 216) = 0;
    if( IopCheckDeviceFlags((__int64)(v8 + 20), 0x2000) )
      *((_BYTE *)v8 + 216) |= 2u;
    v16 = (_QWORD **)(v8 + 2);
    if( (PVOID)v8[2] == IopRootDeviceNode && *((_DWORD *)v8 + 112) && (*((_DWORD *)v8 + 99) & 4) == 0 )
    {
      v18 = v71;
      if( *v71 != (__int64 *)&v70 )
LABEL_136:
        __fastfail(3u);
      v8[21] = v71;
      *v10 = &v70;
      *v18 = (__int64 *)v10;
      v71 = (__int64 **)(v8 + 20);
    }
    v8 = (_QWORD *)*v8;
    if( v8 )
    {
      for( j = (_QWORD *)v8[1]; j; j = (_QWORD *)j[1] )
        v8 = j;
    }
    else
    {
      v8 = *v16;
    }
  }
  while( v8 != IopRootDeviceNode );
  while( 1 )
  {
    v3 = (__int64 **)v70;
LABEL_27:
    if( v3 == &v70 )
      break;
    if( v3[1] != (__int64 *)&v70 )
      goto LABEL_136;
    v21 = (__int64)*v3;
    if( (__int64 **)(*v3)[1] != v3 )
      goto LABEL_136;
    v70 = *v3;
    *(_QWORD *)(v21 + 8) = &v70;
    *((_BYTE *)v3 + 56) |= 1u;
    v22 = v3 - 20;
    v20 = v22;
    for( k = v22[1]; k; k = (__int64 *)k[1] )
      v20 = (__int64 **)k;
    while( v20 != v22 )
    {
      *((_BYTE *)v20 + 216) |= 1u;
      v19 = *v20;
      if( *v20 )
      {
        do
        {
          v20 = (__int64 **)v19;
          v19 = (__int64 *)v19[1];
        }
        while( v19 );
      }
      else
      {
        v20 = (__int64 **)v20[2];
      }
    }
  }
  do
  {
    v24 = IopRootDeviceNode;
    v25 = 0;
    for( m = (_QWORD *)*((_QWORD *)IopRootDeviceNode + 1); m; m = (_QWORD *)m[1] )
      v24 = m;
    while( 1 )
    {
      v27 = IopRootDeviceNode;
      if( v24 == IopRootDeviceNode )
        break;
      if( (v24[27] & 2) != 0 )
      {
        v29 = (_QWORD *)v24[1];
        v30 = v24;
        while( v29 )
        {
          v30 = v29;
          v29 = (_QWORD *)v29[1];
        }
        while( v30 != v24 )
        {
          *((_BYTE *)v30 + 216) |= 2u;
          v31 = (_QWORD *)*v30;
          if( *v30 )
          {
            do
            {
              v30 = v31;
              v31 = (_QWORD *)v31[1];
            }
            while( v31 );
          }
          else
          {
            v30 = (_QWORD *)v30[2];
          }
        }
      }
      v28 = (_QWORD *)*v24;
      if( *v24 )
      {
        do
        {
          v24 = v28;
          v28 = (_QWORD *)v28[1];
        }
        while( v28 );
      }
      else
      {
        v24 = (_QWORD *)v24[2];
      }
    }
    for( n = (_QWORD *)*((_QWORD *)IopRootDeviceNode + 1); n; n = (_QWORD *)n[1] )
      v27 = n;
    v33 = IopRootDeviceNode;
    if( v27 == IopRootDeviceNode )
      break;
    do
    {
      if( (v27[27] & 2) != 0 )
      {
        for( ii = (_QWORD *)v27[22]; ii != v27 + 22; ii = (_QWORD *)*ii )
        {
          v67 = *(ii - 1);
          v68 = *(_BYTE *)(v67 + 56);
          if( (v68 & 2) == 0 )
          {
            v25 = 1;
            *(_BYTE *)(v67 + 56) = v68 | 2;
          }
        }
      }
      v35 = (_QWORD *)*v27;
      if( *v27 )
      {
        do
        {
          v27 = v35;
          v35 = (_QWORD *)v35[1];
        }
        while( v35 );
      }
      else
      {
        v27 = (_QWORD *)v27[2];
      }
      v33 = IopRootDeviceNode;
    }
    while( v27 != IopRootDeviceNode );
  }
  while( v25 );
  for( jj = (_QWORD *)v33[1]; jj; jj = (_QWORD *)jj[1] )
    v33 = jj;
  while( 1 )
  {
    v38 = IopRootDeviceNode;
    if( v33 == IopRootDeviceNode )
      break;
    v39 = *((_BYTE *)v33 + 216);
    if( (v39 & 2) != 0 )
    {
      v40 = (_DWORD *)v33[26];
      *((_BYTE *)v33 + 216) = v39 + 1;
      ObfReferenceObjectWithTag(v40, 0x70506F50u);
      if( v40 )
      {
        while( v40[18] != 7 )
        {
          LowerDeviceObjectWithTag = IoGetLowerDeviceObjectWithTag((INT64)v40, 0x70506F50ui64);
          ObfDereferenceObjectWithTag(v40, 0x70506F50ui64);
          v40 = LowerDeviceObjectWithTag;
          if( !LowerDeviceObjectWithTag )
            goto LABEL_70;
        }
        ObfDereferenceObjectWithTag(v40, 0x70506F50ui64);
        if( IopCheckDeviceFlags((__int64)(v33 + 20), 256) )
          *((_BYTE *)v33 + 216) = 2;
      }
    }
LABEL_70:
    v37 = (_QWORD *)*v33;
    if( *v33 )
    {
      do
      {
        v33 = v37;
        v37 = (_QWORD *)v37[1];
      }
      while( v37 );
    }
    else
    {
      v33 = (_QWORD *)v33[2];
    }
  }
  do
  {
    v42 = (_QWORD *)v38[1];
    v43 = 0;
    while( v42 )
    {
      v38 = v42;
      v42 = (_QWORD *)v42[1];
    }
    while( 1 )
    {
      v44 = IopRootDeviceNode;
      if( v38 == IopRootDeviceNode )
        break;
      v45 = (_QWORD **)(v38 + 2);
      v46 = (_BYTE *)v38[2];
      if( v46 != IopRootDeviceNode )
      {
        v47 = *((_BYTE *)v38 + 216);
        if( v46[216] > v47 )
          v46[216] = v47;
      }
      v38 = (_QWORD *)*v38;
      if( v38 )
      {
        for( kk = (_QWORD *)v38[1]; kk; kk = (_QWORD *)kk[1] )
          v38 = kk;
      }
      else
      {
        v38 = *v45;
      }
    }
    for( mm = (_QWORD *)*((_QWORD *)IopRootDeviceNode + 1); mm; mm = (_QWORD *)mm[1] )
      v44 = mm;
    v38 = IopRootDeviceNode;
    if( v44 == IopRootDeviceNode )
      break;
    do
    {
      for( nn = (_QWORD *)v44[24]; nn != v44 + 24; nn = (_QWORD *)*nn )
      {
        v53 = nn[5];
        v54 = *((_BYTE *)v44 + 216);
        if( *(_BYTE *)(v53 + 56) > v54 )
        {
          v43 = 1;
          *(_BYTE *)(v53 + 56) = v54;
        }
      }
      v51 = (_QWORD *)*v44;
      if( *v44 )
      {
        do
        {
          v44 = v51;
          v51 = (_QWORD *)v51[1];
        }
        while( v51 );
      }
      else
      {
        v44 = (_QWORD *)v44[2];
      }
      v38 = IopRootDeviceNode;
    }
    while( v44 != IopRootDeviceNode );
  }
  while( v43 );
  for( i1 = (_QWORD *)v38[1]; i1; i1 = (_QWORD *)i1[1] )
    v38 = i1;
  while( v38 != IopRootDeviceNode )
  {
    if( IopIsNotifyInBroadcast(Order->Flags, (INT64)(v38 + 20)) )
    {
      ++Order->OrderLevel[*(unsigned __int8 *)(v56 + 56)].DeviceCount;
      v64 = (PVOID)v55[2];
      if( v64 != IopRootDeviceNode && IopIsNotifyInBroadcast(Order->Flags, (INT64)v64 + 160) )
      {
        ++*(_DWORD *)(v56 + 96);
        ++*(_DWORD *)(v55[2] + 248i64);
      }
      v65 = v56 + 32;
      for( i2 = *(_QWORD *)(v56 + 32); i2 != v65; i2 = *v57 )
      {
        if( IopIsNotifyInBroadcast(Order->Flags, *(_QWORD *)(i2 + 40)) )
          ++*(_DWORD *)(v56 + 96);
      }
      v59 = v56 + 16;
      for( i3 = *(_QWORD *)(v56 + 16); i3 != v59; i3 = *v66 )
      {
        if( IopIsNotifyInBroadcast(Order->Flags, *(_QWORD *)(i3 - 8)) )
          ++*(_DWORD *)(v56 + 88);
      }
      v61 = (char *)&Order->OrderLevel[0].WaitSleep
          + 64 * *(unsigned __int8 *)(v56 + 56)
          + 8 * *(unsigned __int8 *)(v56 + 56);
      v62 = (char **)*((_QWORD *)v61 + 1);
      if( *v62 != v61 )
        goto LABEL_136;
      *(_QWORD *)v56 = v61;
      *(_QWORD *)(v56 + 8) = v62;
      *v62 = (char *)v56;
      *((_QWORD *)v61 + 1) = v56;
    }
    else
    {
      Blink = ListHead.Blink;
      if( ListHead.Blink->Flink != &ListHead )
        goto LABEL_136;
      *(_QWORD *)(v56 + 8) = ListHead.Blink;
      *(_QWORD *)v56 = &ListHead;
      Blink->Flink = (_LIST_ENTRY *)v56;
      ListHead.Blink = (_LIST_ENTRY *)v56;
    }
    v63 = (_QWORD *)*v55;
    if( *v55 )
    {
      do
      {
        v38 = v63;
        v63 = (_QWORD *)v63[1];
      }
      while( v63 );
    }
    else
    {
      v38 = (_QWORD *)v55[2];
    }
  }
  IopFreePoDeviceNotifyListHead(&ListHead);
  Order->WarmEjectPdoPointer = (_DEVICE_OBJECT **)&IopWarmEjectPdo;
  Order->Locked = 1;
}

Referenced by:

PopBuildDeviceNotifyList