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