PiQueryPowerDependencyRelations
NTSTATUS __stdcall PiQueryPowerDependencyRelations(_DEVICE_NODE *DevNode){
NTSTATUS v2;
_PO_DEVICE_NOTIFY *p_Notify;
_LIST_ENTRY *ProviderList;
_LIST_ENTRY *p_PowerParents;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v7;
_LIST_ENTRY *v9;
_LIST_ENTRY *v10;
char *DeviceNode;
_LIST_ENTRY *v12;
_LIST_ENTRY *Blink;
_LIST_ENTRY *v14;
_LIST_ENTRY *v15;
_QWORD *v16;
_LIST_ENTRY *v17;
VOID **PoolWithTag;
_LIST_ENTRY *v19;
_LIST_ENTRY *v20;
char *v21;
_LIST_ENTRY **p_Blink;
char **v23;
_DEVICE_OBJECT *Provider;
v2 = 0;
Provider = 0i64;
PnpAcquireDependencyRelationsLock(0);
p_Notify = &DevNode->Notify;
ProviderList = PiGetProviderList(DevNode->PhysicalDeviceObject);
p_PowerParents = &DevNode->Notify.PowerParents;
Flink = DevNode->Notify.PowerParents.Flink;
while( Flink != p_PowerParents )
{
v9 = Flink;
Flink = Flink->Flink;
if( LOBYTE(v9[3].Flink) )
{
v10 = ProviderList->Flink;
if( ProviderList->Flink == ProviderList )
goto LABEL_13;
do
{
PiEnumerateProviderListEntry(v10, &Provider, 0i64);
if( Provider )
{
DeviceNode = (char *)Provider->DeviceObjectExtension->DeviceNode;
if( DeviceNode )
{
if( (char *)v9[2].Blink == DeviceNode + 160 )
break;
}
}
v10 = v10->Flink;
}
while( v10 != ProviderList );
if( v10 == ProviderList )
{
LABEL_13:
v12 = v9->Flink;
if( v9->Flink->Blink != v9
|| (Blink = v9->Blink, Blink->Flink != v9)
|| (Blink->Flink = v12, v12->Blink = Blink, v14 = v9[1].Blink, v14->Blink != (_LIST_ENTRY *)&v9[1].Blink)
|| (v15 = v9[2].Flink, v15->Flink != (_LIST_ENTRY *)&v9[1].Blink) )
{
LABEL_29:
__fastfail(3u);
}
v15->Flink = v14;
v14->Blink = v15;
ExFreePoolWithTag(v9, 0x72775044u);
}
}
}
v7 = ProviderList->Flink;
while( v7 != ProviderList )
{
PiEnumerateProviderListEntry(v7, &Provider, 0i64);
v7 = v7->Flink;
if( Provider )
{
v16 = Provider->DeviceObjectExtension->DeviceNode;
if( v16 )
{
if( v16[2] )
{
v17 = p_PowerParents->Flink;
if( p_PowerParents->Flink == p_PowerParents )
goto LABEL_25;
do
{
if( v17[2].Blink == (_LIST_ENTRY *)(v16 + 20) )
break;
v17 = v17->Flink;
}
while( v17 != p_PowerParents );
if( v17 == p_PowerParents )
{
LABEL_25:
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x38ui64, 1920421956i64);
v19 = (_LIST_ENTRY *)PoolWithTag;
if( !PoolWithTag )
{
v2 = -1073741670;
break;
}
*((_BYTE *)PoolWithTag + 48) = 1;
PoolWithTag[2] = p_Notify;
PoolWithTag[5] = v16 + 20;
v20 = p_PowerParents->Blink;
if( v20->Flink != p_PowerParents )
goto LABEL_29;
v19->Flink = p_PowerParents;
v21 = (char *)(v16 + 22);
v19->Blink = v20;
v20->Flink = v19;
p_PowerParents->Blink = v19;
p_Blink = &v19[1].Blink;
v23 = (char **)*((_QWORD *)v21 + 1);
if( *v23 != v21 )
goto LABEL_29;
*p_Blink = (_LIST_ENTRY *)v21;
p_Blink[1] = (_LIST_ENTRY *)v23;
*v23 = (char *)p_Blink;
*((_QWORD *)v21 + 1) = p_Blink;
}
}
}
}
}
ExReleaseResourceLite((PERESOURCE)((char *)&stru_140C452E0 + 384));
PpDevNodeUnlockTree(PPL_SIMPLE_READ);
return v2;
}Referenced by:
PiQueryPowerRelations