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