PipProcessRebuildPowerRelationsQueue
VOID __stdcall PipProcessRebuildPowerRelationsQueue(){
_PNP_DEPENDENCY_NODE *v0;
_QWORD *v1;
_DEVICE_OBJECT *v2;
__int64 *v3;
__int64 v4;
_QWORD *v5;
_QWORD *v6;
ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6528));
PnpAcquireDependencyRelationsLock(1);
LABEL_8:
v3 = (__int64 *)*(&stru_140C452E0 + 42);
while( 1 )
{
if( v3 == (__int64 *)((char *)&stru_140C452E0 + 336) )
goto LABEL_10;
v0 = (_PNP_DEPENDENCY_NODE *)(v3 - 9);
v1 = v3;
v2 = (_DEVICE_OBJECT *)*(v3 - 3);
v3 = (__int64 *)*v3;
if( !v2 )
break;
if( PipIsDeviceReadyForPowerRelations(v2) && PipCheckIfAllProvidersHaveDevnodes((INT64)v0) )
{
v4 = *v1;
if( *(_QWORD **)(*v1 + 8i64) == v1 )
{
v5 = (_QWORD *)v1[1];
if( (_QWORD *)*v5 == v1 )
{
*v5 = v4;
*(_QWORD *)(v4 + 8) = v5;
v1[1] = v1;
*v1 = v1;
PipDereferenceDependencyNode(v0);
PnpReleaseDependencyRelationsLock();
PiQueryPowerRelations((_DEVICE_NODE *)v2->DeviceObjectExtension->DeviceNode, 1u);
ObfDereferenceObjectWithTag(v2, 0x44706E50ui64);
PnpAcquireDependencyRelationsLock(1);
goto LABEL_8;
}
}
LABEL_14:
__fastfail(3u);
}
}
if( (_QWORD *)v3[1] != v1 )
goto LABEL_14;
v6 = (_QWORD *)v1[1];
if( (_QWORD *)*v6 != v1 )
goto LABEL_14;
*v6 = v3;
v3[1] = (__int64)v6;
v1[1] = v1;
*v1 = v1;
PipDereferenceDependencyNode(v0);
LABEL_10:
PnpReleaseDependencyRelationsLock();
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6528));
}Referenced by:
IoDuplicateDependency
IoResolveDependency
IoSetDependency
PnpDeleteAllDependencyRelations
PnpNewDeviceNodeDependencyCheck
PnpSurpriseRemoveLockedDeviceNode