PipAddRequestToEdge

INT64 __fastcall PipAddRequestToEdge(INT64 a1, const UNICODE_STRING **a2){
  INT64 *v2; 
  INT64 v3; 
  _QWORD *v4; 
  __int64 v5; 
  unsigned __int64 v8; 
  _QWORD *v9; 
  int v10; 
  INT64 *PoolWithTag; 
  int v12; 
  UNICODE_STRING *v13; 
  INT64 **v14; 
  v2 = 0i64;
  v3 = a1 + 56;
  v4 = *(_QWORD **)(a1 + 56);
  v5 = 0i64;
  while( v4 != (_QWORD *)v3 )
  {
    v8 = (unsigned __int64)v4;
    if( v5 )
      goto LABEL_11;
    v9 = v4;
    v4 = (_QWORD *)*v4;
    v10 = *((_DWORD *)v9 + 4);
    if( v10 == *(_DWORD *)a2 )
    {
      if( v10 )
      {
        if( v10 == 1 )
          v5 = v8 & -(__int64)(RtlEqualUnicodeString((UNICODE_STRING *)v9[3], (UNICODE_STRING *)a2[1], 0) != 0);
      }
      else if( (const UNICODE_STRING *)v9[3] == a2[1] )
      {
        v5 = (__int64)v9;
      }
    }
  }
  if( v5 )
  {
LABEL_11:
    *(_DWORD *)(v5 + 32) |= *((_DWORD *)a2 + 4);
    goto LABEL_21;
  }
  PoolWithTag = (INT64 *)ExAllocatePoolWithTag(PagedPool, 0x28ui64, 0x53706E50ui64);
  v2 = PoolWithTag;
  if( PoolWithTag )
  {
    *((_DWORD *)PoolWithTag + 8) = *((_DWORD *)a2 + 4);
    v12 = *(_DWORD *)a2;
    *((_DWORD *)v2 + 4) = *(_DWORD *)a2;
    if( v12 )
    {
      if( v12 == 1 )
      {
        v13 = (UNICODE_STRING *)ExAllocatePoolWithTag(PagedPool, 0x10ui64, 0x53706E50ui64);
        v2[3] = (INT64)v13;
        if( RtlDuplicateUnicodeString(0i64, (UNICODE_STRING *)a2[1], v13) < 0 )
        {
          PipFreeBindingRequestEntry(v2);
          v2 = 0i64;
          goto LABEL_21;
        }
      }
    }
    else
    {
      v2[3] = (INT64)a2[1];
    }
    v14 = *(INT64 ***)(v3 + 8);
    if( *v14 != (INT64 *)v3 )
      __fastfail(3u);
    *v2 = v3;
    v2[1] = (INT64)v14;
    *v14 = v2;
    *(_QWORD *)(v3 + 8) = v2;
  }
LABEL_21:
  if( !v5 )
    v5 = (__int64)v2;
  if( v5 )
    PipMergeDependencyTypes(a1, *((unsigned int *)a2 + 4));
  return v5;
}

Referenced by:

PipAddDependencyEdgeBetweenNodes
PipCreateNewDependencyEdge
PipMergeDependencyEdgeList