PipDeleteAllDependencyRelations

VOID __stdcall PipDeleteAllDependencyRelations(_DEVICE_OBJECT *DeviceObject){
  char *DependencyNode; 
  _LIST_ENTRY *v3; 
  _LIST_ENTRY *v4; 
  bool v5; 
  int v6; 
  int v7; 
  _PNP_DEPENDENCY_EDGE *v8; 
  _PNP_DEPENDENCY_EDGE *v9; 
  _PNP_DEPENDENCY_EDGE *v10; 
  __int64 v11; 
  _DEVICE_OBJECT *v12; 

  if( DeviceObject )
    DependencyNode = (char *)DeviceObject->DeviceObjectExtension->DependencyNode;
  else
    DependencyNode = 0i64;
  if( DependencyNode )
  {
    ++*((_DWORD *)DependencyNode + 22);
    PipConvertResolutionsToReservations((PNP_DEPENDENCY_NODE *)DependencyNode);
    v3 = (_LIST_ENTRY *)*((_QWORD *)DependencyNode + 2);
    while( v3 != (_LIST_ENTRY *)(DependencyNode + 16) )
    {
      v8 = PiListEntryToDependencyEdge(v3, ProviderList);
      v3 = v3->Flink;
      PipFreeDependencyEdge(v8, v9);
    }
    v4 = (_LIST_ENTRY *)*((_QWORD *)DependencyNode + 4);
    while( v4 != (_LIST_ENTRY *)(DependencyNode + 32) )
    {
      v10 = PiListEntryToDependencyEdge(v4, DependentList);
      v4 = v4->Flink;
      v11 = *((_QWORD *)v10 + 5);
      ++*(_DWORD *)(v11 + 88);
      PipFreeDependencyEdge(v10, 0i64);
      v12 = *(_DEVICE_OBJECT **)(v11 + 48);
      if( v12 && *(_QWORD *)(v11 + 16) != v11 + 16 )
        PipAttemptDependentStart(v12);
      v5 = (*(_DWORD *)(v11 + 88))-- == 1;
      if( v5 )
        PipDeleteDependencyNode((_PNP_DEPENDENCY_NODE *)v11);
    }
    DeviceObject->DeviceObjectExtension->DependencyNode = 0i64;
    *((_QWORD *)DependencyNode + 6) = 0i64;
    v5 = (*((_DWORD *)DependencyNode + 22))-- == 1;
    v6 = *((_DWORD *)DependencyNode + 22);
    if( v5 )
    {
      PipDeleteDependencyNode((_PNP_DEPENDENCY_NODE *)DependencyNode);
      v6 = *((_DWORD *)DependencyNode + 22);
    }
    v7 = v6 - 1;
    *((_DWORD *)DependencyNode + 22) = v7;
    if( !v7 )
      PipDeleteDependencyNode((_PNP_DEPENDENCY_NODE *)DependencyNode);
  }
}

Referenced by:

PnpDeleteAllDependencyRelations