ViDeadlockMergeNodes

INT64 *__fastcall ViDeadlockMergeNodes(INT64 a1, INT64 a2, INT64 **a3){
  __int64 v3; 
  INT64 v5; 
  INT64 v6; 
  _QWORD *v7; 
  __int64 v8; 
  _QWORD *v9; 
  _QWORD *v10; 
  _QWORD *v11; 
  __int64 v12; 
  _QWORD *v13; 
  __int64 v14; 
  _QWORD *v15; 
  __int64 v16; 
  _QWORD *v17; 
  INT64 *result; 
  v3 = *(_QWORD *)(a2 + 64);
  v5 = a2;
  if( v3 )
  {
    *(_QWORD *)(a1 + 64) = v3;
    *(_OWORD *)(a1 + 80) = *(_OWORD *)(a2 + 80);
    *(_OWORD *)(a1 + 96) = *(_OWORD *)(a2 + 96);
    *(_OWORD *)(a1 + 112) = *(_OWORD *)(a2 + 112);
    *(_OWORD *)(a1 + 128) = *(_OWORD *)(a2 + 128);
    *(_OWORD *)(a1 + 144) = *(_OWORD *)(a2 + 144);
    *(_OWORD *)(a1 + 160) = *(_OWORD *)(a2 + 160);
    *(_OWORD *)(a1 + 176) = *(_OWORD *)(a2 + 176);
    *(_OWORD *)(a1 + 192) = *(_OWORD *)(a2 + 192);
  }
  if( (*(_DWORD *)(a2 + 72) & 1) != 0 )
    *(_DWORD *)(a1 + 72) = *(_DWORD *)(a2 + 72) & 1 | *(_DWORD *)(a1 + 72) & 0xFFFFFFFE;
  v6 = a2 + 8;
  v7 = *(_QWORD **)(a2 + 8);
  while( v7 != (_QWORD *)v6 )
  {
    v8 = *v7;
    v9 = v7 - 3;
    v10 = v7;
    if( *(_QWORD **)(*v7 + 8i64) != v7 )
      goto LABEL_18;
    v11 = (_QWORD *)v7[1];
    if( (_QWORD *)*v11 != v7 )
      goto LABEL_18;
    *v11 = v8;
    *(_QWORD *)(v8 + 8) = v11;
    ViDeadlockUpdateChildrenCount((_VI_DEADLOCK_NODE *)v5, (unsigned int)~*((_DWORD *)v9 + 19));
    *v9 = v12;
    v13 = *(_QWORD **)(v12 + 16);
    if( *v13 != v12 + 8 )
      goto LABEL_18;
    v10[1] = v13;
    *v10 = v12 + 8;
    *v13 = v10;
    *(_QWORD *)(v12 + 16) = v10;
    ViDeadlockUpdateChildrenCount((_VI_DEADLOCK_NODE *)v12, (unsigned int)(*((_DWORD *)v9 + 19) + 1));
  }
  if( *(_QWORD *)v5 )
  {
    v14 = *(_QWORD *)(v5 + 24);
    if( *(_QWORD *)(v14 + 8) != v5 + 24 || (v15 = *(_QWORD **)(v5 + 32), *v15 != v5 + 24) )
LABEL_18:
      __fastfail(3u);
    *v15 = v14;
    *(_QWORD *)(v14 + 8) = v15;
    ViDeadlockUpdateChildrenCount(*(_VI_DEADLOCK_NODE **)v5, 0xFFFFFFFFi64);
  }
  --*(_WORD *)(*(_QWORD *)(v5 + 56) + 4i64);
  v16 = *(_QWORD *)(v5 + 40);
  if( *(_QWORD *)(v16 + 8) != v5 + 40 )
    goto LABEL_18;
  v17 = *(_QWORD **)(v5 + 48);
  if( *v17 != v5 + 40 )
    goto LABEL_18;
  result = *a3;
  *v17 = v16;
  *(_QWORD *)(v16 + 8) = v17;
  *a3 = (INT64 *)v5;
  *(_QWORD *)v5 = result;
  return result;
}

Referenced by:

ViDeadlockCheckDuplicatesAmongChildren
ViDeadlockCheckDuplicatesAmongRoots