ViDeadlockMergeNodes

VOID __stdcall ViDeadlockMergeNodes(_VI_DEADLOCK_NODE *NodeTo, _VI_DEADLOCK_NODE *NodeFrom, VOID **NodesToFree){
  _VI_DEADLOCK_THREAD *ThreadEntry; 
  _VI_DEADLOCK_NODE *v5; 
  _LIST_ENTRY *p_ChildrenList; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v8; 
  _LIST_ENTRY **p_Blink; 
  _LIST_ENTRY *v10; 
  _LIST_ENTRY *Blink; 
  _VI_DEADLOCK_NODE *v12; 
  _LIST_ENTRY *v13; 
  _LIST_ENTRY *v14; 
  _LIST_ENTRY *v15; 
  _LIST_ENTRY *v16; 
  _LIST_ENTRY *v17; 
  _VI_DEADLOCK_NODE *v18; 

  ThreadEntry = NodeFrom->ThreadEntry;
  v5 = NodeFrom;
  if( ThreadEntry )
  {
    NodeTo->ThreadEntry = ThreadEntry;
    *(_OWORD *)NodeTo->StackTrace = *(_OWORD *)NodeFrom->StackTrace;
    *(_OWORD *)&NodeTo->StackTrace[2] = *(_OWORD *)&NodeFrom->StackTrace[2];
    *(_OWORD *)&NodeTo->StackTrace[4] = *(_OWORD *)&NodeFrom->StackTrace[4];
    *(_OWORD *)&NodeTo->StackTrace[6] = *(_OWORD *)&NodeFrom->StackTrace[6];
    *(_OWORD *)NodeTo->ParentStackTrace = *(_OWORD *)NodeFrom->ParentStackTrace;
    *(_OWORD *)&NodeTo->ParentStackTrace[2] = *(_OWORD *)&NodeFrom->ParentStackTrace[2];
    *(_OWORD *)&NodeTo->ParentStackTrace[4] = *(_OWORD *)&NodeFrom->ParentStackTrace[4];
    *(_OWORD *)&NodeTo->ParentStackTrace[6] = *(_OWORD *)&NodeFrom->ParentStackTrace[6];
  }
  if( (NodeFrom->u1.Whole & 1) != 0 )
    NodeTo->u1.Whole = NodeFrom->u1.Whole & 1 | NodeTo->u1.Whole & 0xFFFFFFFE;
  p_ChildrenList = &NodeFrom->ChildrenList;
  Flink = NodeFrom->ChildrenList.Flink;
  while( Flink != p_ChildrenList )
  {
    v8 = Flink->Flink;
    p_Blink = &Flink[-2].Blink;
    v10 = Flink;
    if( Flink->Flink->Blink != Flink )
      goto LABEL_18;
    Blink = Flink->Blink;
    if( Blink->Flink != Flink )
      goto LABEL_18;
    Blink->Flink = v8;
    v8->Blink = Blink;
    ViDeadlockUpdateChildrenCount(v5, (unsigned int)~*((_DWORD *)p_Blink + 19));
    *p_Blink = (_LIST_ENTRY *)v12;
    v13 = v12->ChildrenList.Blink;
    if( v13->Flink != &v12->ChildrenList )
      goto LABEL_18;
    v10->Blink = v13;
    v10->Flink = &v12->ChildrenList;
    v13->Flink = v10;
    v12->ChildrenList.Blink = v10;
    ViDeadlockUpdateChildrenCount(v12, (unsigned int)(*((_DWORD *)p_Blink + 19) + 1));
  }
  if( v5->Parent )
  {
    v14 = v5->SiblingsList.Flink;
    if( v14->Blink != &v5->SiblingsList || (v15 = v5->SiblingsList.Blink, v15->Flink != &v5->SiblingsList) )
LABEL_18:
      __fastfail(3u);
    v15->Flink = v14;
    v14->Blink = v15;
    ViDeadlockUpdateChildrenCount(v5->Parent, 0xFFFFFFFFi64);
  }
  --*((_WORD *)v5->Root + 2);
  v16 = v5->ResourceList.Flink;
  if( ($40597CAD8088CB40007EECA86A191ECD *)v16->Blink != &v5->40 )
    goto LABEL_18;
  v17 = v5->ResourceList.Blink;
  if( ($40597CAD8088CB40007EECA86A191ECD *)v17->Flink != &v5->40 )
    goto LABEL_18;
  v18 = (_VI_DEADLOCK_NODE *)*NodesToFree;
  v17->Flink = v16;
  v16->Blink = v17;
  *NodesToFree = v5;
  v5->Parent = v18;
}

Referenced by:

ViDeadlockCheckDuplicatesAmongChildren
ViDeadlockCheckDuplicatesAmongRoots