PipProcessRebuildPowerRelationsQueue
VOID __stdcall PipProcessRebuildPowerRelationsQueue(){
INT64 v0;
__int64 *v1;
__int64 v2;
__int64 *v3;
__int64 v4;
__int64 **v5;
__int64 **v6;
ExAcquireFastMutex(&PnpRebuildPowerRelationsQueueLock);
PnpAcquireDependencyRelationsLock(1u);
LABEL_8:
v3 = (__int64 *)PiRebuildPowerRelationsQueue;
while( 1 )
{
if( v3 == &PiRebuildPowerRelationsQueue )
goto LABEL_10;
v0 = (INT64)(v3 - 9);
v1 = v3;
v2 = *(v3 - 3);
v3 = (__int64 *)*v3;
if( !v2 )
break;
if( PipIsDeviceReadyForPowerRelations((DEVICE_OBJECT *)v2) && PipCheckIfAllProvidersHaveDevnodes(v0) )
{
v4 = *v1;
if( *(__int64 **)(*v1 + 8) == v1 )
{
v5 = (__int64 **)v1[1];
if( *v5 == v1 )
{
*v5 = (__int64 *)v4;
*(_QWORD *)(v4 + 8) = v5;
v1[1] = (__int64)v1;
*v1 = (__int64)v1;
PipDereferenceDependencyNode(v0);
PnpReleaseDependencyRelationsLock();
PiQueryPowerRelations(*(_DEVICE_NODE **)(*(_QWORD *)(v2 + 312) + 40i64), 1u);
ObfDereferenceObjectWithTag((PVOID)v2, 0x44706E50ui64);
PnpAcquireDependencyRelationsLock(1u);
goto LABEL_8;
}
}
LABEL_14:
__fastfail(3u);
}
}
if( (__int64 *)v3[1] != v1 )
goto LABEL_14;
v6 = (__int64 **)v1[1];
if( *v6 != v1 )
goto LABEL_14;
*v6 = v3;
v3[1] = (__int64)v6;
v1[1] = (__int64)v1;
*v1 = (__int64)v1;
PipDereferenceDependencyNode(v0);
LABEL_10:
PnpReleaseDependencyRelationsLock();
KeReleaseGuardedMutex(&PnpRebuildPowerRelationsQueueLock);
}Referenced by:
IoDuplicateDependency
IoResolveDependency
IoSetDependency
PnpDeleteAllDependencyRelations
PnpNewDeviceNodeDependencyCheck
PnpSurpriseRemoveLockedDeviceNode