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