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