PiQueryPowerRelations
INT64 __stdcall PiQueryPowerRelations(_DEVICE_NODE *DevNode, UINT8 InternalRelations){
unsigned int v2;
NTSTATUS v4;
char *v6;
char *v7;
__int64 v8;
char *v9;
char **v10;
__int64 v11;
char **v12;
_DWORD *v13;
unsigned int v14;
__int64 v15;
__int64 v16;
char *PoolWithTag;
char **v18;
__int64 v19;
_QWORD *v20;
_QWORD *v21;
int v22;
PADAPTER_OBJECT *v23;
int v24;
unsigned __int16 *v25;
__int16 *v26;
_WORD *v27;
__int64 v28;
__int64 v29;
__int64 v30;
__int64 v31;
void *v32;
__int64 v33;
__int64 v34;
__int64 v35;
__int64 v36;
__int64 v37;
__int64 v38;
__int64 v39;
__int64 v40;
__int64 v41;
__int64 v42;
__int64 v43;
__int64 v44;
__int64 v45;
PVOID P;
v2 = 0;
v4 = 0;
P = 0i64;
if( !*((_QWORD *)DevNode + 2) )
return 3221225865i64;
if( !InternalRelations )
{
v4 = PnpQueryDeviceRelations(*((PDEVICE_OBJECT *)DevNode + 4), PowerRelations, 0i64, &P);
if( v4 >= 0 )
{
v6 = (char *)DevNode + 192;
v7 = (char *)*((_QWORD *)DevNode + 24);
while( v7 != v6 )
{
v8 = *(_QWORD *)v7;
v9 = v7;
v7 = (char *)v8;
if( *(char **)(v8 + 8) != v9
|| (v10 = (char **)*((_QWORD *)v9 + 1), *v10 != v9)
|| (*v10 = (char *)v8, *(_QWORD *)(v8 + 8) = v10, v11 = *((_QWORD *)v9 + 3), *(char **)(v11 + 8) != v9 + 24)
|| (v12 = (char **)*((_QWORD *)v9 + 4), *v12 != v9 + 24) )
{
LABEL_26:
__fastfail(3u);
}
*v12 = (char *)v11;
*(_QWORD *)(v11 + 8) = v12;
ExFreePoolWithTag(v9, 0x72775044u);
}
v13 = P;
if( !P || !*(_DWORD *)P )
{
v4 = 0;
goto LABEL_29;
}
v14 = 0;
while( 1 )
{
v15 = *(_QWORD *)&v13[2 * v14 + 2];
if( !v15 || (v16 = *(_QWORD *)(*(_QWORD *)(v15 + 312) + 40i64)) == 0 || (*(_DWORD *)(v16 + 396) & 0x20000) != 0 )
{
v25 = *(unsigned __int16 **)&v13[2 * v14 + 2];
if( v25 )
{
IoAddTriageDumpDataBlock(v25, v25[1]);
v13 = P;
v26 = *(__int16 **)(*((_QWORD *)P + v14 + 1) + 8i64);
if( v26 )
{
IoAddTriageDumpDataBlock(v26, (unsigned int)v26[1]);
v13 = P;
v27 = (_WORD *)(*(_QWORD *)(*((_QWORD *)P + v14 + 1) + 8i64) + 56i64);
if( *v27 )
{
IoAddTriageDumpDataBlock(v27, 2ui64);
v28 = *(_QWORD *)(*((_QWORD *)P + v14 + 1) + 8i64);
IoAddTriageDumpDataBlock(*(PVOID *)(v28 + 64), *(unsigned __int16 *)(v28 + 56));
v13 = P;
}
}
v29 = *(_QWORD *)&v13[2 * v14 + 2];
if( v29 )
v30 = *(_QWORD *)(*(_QWORD *)(v29 + 312) + 40i64);
else
v30 = 0i64;
if( v30 )
{
if( v29 )
v31 = *(_QWORD *)(*(_QWORD *)(v29 + 312) + 40i64);
else
v31 = 0i64;
if( v29 )
v32 = *(void **)(*(_QWORD *)(v29 + 312) + 40i64);
else
v32 = 0i64;
IoAddTriageDumpDataBlock(v32, 0x310ui64);
if( *(_WORD *)(v31 + 40) )
{
IoAddTriageDumpDataBlock((PVOID)(v31 + 40), 2ui64);
IoAddTriageDumpDataBlock(*(PVOID *)(v31 + 48), *(unsigned __int16 *)(v31 + 40));
}
v13 = P;
v33 = *((_QWORD *)P + v14 + 1);
if( v33 )
v34 = *(_QWORD *)(*(_QWORD *)(v33 + 312) + 40i64);
else
v34 = 0i64;
if( *(_WORD *)(v34 + 56) )
{
if( v33 )
v35 = *(_QWORD *)(*(_QWORD *)(v33 + 312) + 40i64);
else
v35 = 0i64;
IoAddTriageDumpDataBlock((PVOID)(v35 + 56), 2ui64);
v36 = *((_QWORD *)P + v14 + 1);
if( v36 )
v37 = *(_QWORD *)(*(_QWORD *)(v36 + 312) + 40i64);
else
v37 = 0i64;
if( v36 )
v38 = *(_QWORD *)(*(_QWORD *)(v36 + 312) + 40i64);
else
v38 = 0i64;
IoAddTriageDumpDataBlock(*(PVOID *)(v38 + 64), *(unsigned __int16 *)(v37 + 56));
v13 = P;
}
v39 = *(_QWORD *)&v13[2 * v14 + 2];
if( v39 )
v40 = *(_QWORD *)(*(_QWORD *)(v39 + 312) + 40i64);
else
v40 = 0i64;
if( *(_QWORD *)(v40 + 16) )
{
v41 = v39 ? *(_QWORD *)(*(_QWORD *)(v39 + 312) + 40i64) : 0i64;
if( *(_WORD *)(*(_QWORD *)(v41 + 16) + 56i64) )
{
if( v39 )
v42 = *(_QWORD *)(*(_QWORD *)(v39 + 312) + 40i64);
else
v42 = 0i64;
IoAddTriageDumpDataBlock((PVOID)(*(_QWORD *)(v42 + 16) + 56i64), 2ui64);
v43 = *((_QWORD *)P + v14 + 1);
if( v43 )
v44 = *(_QWORD *)(*(_QWORD *)(v43 + 312) + 40i64);
else
v44 = 0i64;
if( v43 )
v45 = *(_QWORD *)(*(_QWORD *)(v43 + 312) + 40i64);
else
v45 = 0i64;
IoAddTriageDumpDataBlock(
*(PVOID *)(*(_QWORD *)(v45 + 16) + 64i64),
*(unsigned __int16 *)(*(_QWORD *)(v44 + 16) + 56i64));
v13 = P;
}
}
}
}
KeBugCheckEx(0xCAu, 2ui64, *(_QWORD *)&v13[2 * v14 + 2], 0i64, 0i64);
}
if( *(_QWORD *)(v16 + 16) )
{
PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x38ui64, 0x72775044ui64);
if( !PoolWithTag )
{
v4 = -1073741670;
goto LABEL_29;
}
PoolWithTag[48] = 0;
*((_QWORD *)PoolWithTag + 2) = (char *)DevNode + 160;
*((_QWORD *)PoolWithTag + 5) = v16 + 160;
v18 = (char **)*((_QWORD *)DevNode + 25);
if( *v18 != v6 )
goto LABEL_26;
*(_QWORD *)PoolWithTag = v6;
v19 = v16 + 176;
*((_QWORD *)PoolWithTag + 1) = v18;
*v18 = PoolWithTag;
*((_QWORD *)DevNode + 25) = PoolWithTag;
v20 = PoolWithTag + 24;
v21 = *(_QWORD **)(v19 + 8);
if( *v21 != v19 )
goto LABEL_26;
*v20 = v19;
v20[1] = v21;
*v21 = v20;
*(_QWORD *)(v19 + 8) = v20;
v13 = P;
}
if( ++v14 >= *v13 )
goto LABEL_29;
}
}
P = 0i64;
}
LABEL_29:
PiQueryPowerDependencyRelations(DevNode);
if( v4 >= 0 && v22 < 0 )
v4 = v22;
PiValidatePowerRelations((__int64)DevNode);
v23 = (PADAPTER_OBJECT *)P;
if( P )
{
if( *(_DWORD *)P )
{
do
{
HalPutDmaAdapter(v23[v2 + 1]);
v23 = (PADAPTER_OBJECT *)P;
++v2;
}
while( v2 < *(_DWORD *)P );
}
ExFreePoolWithTag(v23, 0);
}
PpDevNodeLockTree(0);
v24 = *((_DWORD *)DevNode + 75);
if( (unsigned int)(v24 - 768) > 1 && (unsigned int)(v24 - 787) > 1 )
PiPnpRtlPdoRaiseNtPlugPlayPropertyChangeEvent(*((_QWORD *)DevNode + 4), 19i64);
PpDevNodeUnlockTree(0);
return(unsigned int)v4;
}Referenced by:
PipProcessRebuildPowerRelationsQueue
PnpDeviceActionWorker