PipCreateNewDependencyEdge
_PNP_DEPENDENCY_EDGE *__stdcall PipCreateNewDependencyEdge(
_PNP_DEPENDENCY_NODE *Dependent,
_PNP_DEPENDENCY_NODE *Provider,
_PNP_BINDING_REQUEST *Request){
VOID **PoolWithTag;
VOID **v7;
__int64 v8;
unsigned __int64 v10;
_PNP_DEPENDENCY_NODE *v11;
_PNP_DEPENDENCY_NODE **v12;
_PNP_DEPENDENCY_NODE **v13;
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x50ui64, 1399877200i64);
v7 = PoolWithTag;
if( PoolWithTag )
{
*((_DWORD *)PoolWithTag + 12) = 0;
PoolWithTag[8] = PoolWithTag + 7;
PoolWithTag[7] = PoolWithTag + 7;
PoolWithTag[5] = Dependent;
PoolWithTag[4] = Provider;
*((_BYTE *)PoolWithTag + 72) = 0;
LODWORD(v8) = PipAddRequestToEdge((_PNP_DEPENDENCY_EDGE *)PoolWithTag, (_UNICODE_STRING **)Request);
if( v8 )
{
PipReferenceDependencyNode(Dependent);
PipReferenceDependencyNode(Provider);
v10 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&stru_140C452E0 + 44);
v11 = (_PNP_DEPENDENCY_NODE *)(v7 + 2);
v12 = (_PNP_DEPENDENCY_NODE **)*((_QWORD *)Provider + 5);
if( *v12 != Provider + 8
|| (*(_QWORD *)v11 = Provider + 8,
v7[3] = v12,
*v12 = v11,
*((_QWORD *)Provider + 5) = v11,
v13 = (_PNP_DEPENDENCY_NODE **)*((_QWORD *)Dependent + 3),
*v13 != Dependent + 4) )
{
__fastfail(3u);
}
*v7 = Dependent + 4;
v7[1] = v13;
*v13 = (_PNP_DEPENDENCY_NODE *)v7;
*((_QWORD *)Dependent + 3) = v7;
KxReleaseSpinLock((UINT64 *)&stru_140C452E0 + 44);
__writecr8(v10);
PipNotifyDependenciesChanged(Dependent, Provider);
}
else
{
ExFreePoolWithTag(v7, 0x53706E50u);
return 0i64;
}
}
return(_PNP_DEPENDENCY_EDGE *)v7;
}Referenced by:
PipAddDependencyEdgeBetweenNodes