IoDuplicateDependency
INT64 __fastcall IoDuplicateDependency(_DEVICE_OBJECT *ProviderPdo, _DEVICE_OBJECT *NewProviderPdo){
unsigned int v2;
INT64 *BindingResolution;
INT64 *v6;
INT64 v7;
UINT64 v8;
LIST_ENTRY *DependentList;
LIST_ENTRY *Flink;
INT64 v11;
int v12;
INT64 a1;
_DEVICE_OBJECT *v16;
v2 = 0;
HIDWORD(a1) = 0;
if( ProviderPdo && NewProviderPdo )
{
PnpAcquireDependencyRelationsLock(1u);
if( !*(_QWORD *)(*((_QWORD *)ProviderPdo + 39) + 80i64) )
{
LABEL_4:
ExReleaseResourceLite(&PiDependencyRelationsLock);
PpDevNodeUnlockTree(0);
return v2;
}
LODWORD(a1) = 0;
v16 = NewProviderPdo;
BindingResolution = PipQueryBindingResolution((INT64)&a1);
v6 = BindingResolution;
if( BindingResolution )
{
++*((_DWORD *)BindingResolution + 22);
}
else
{
v6 = (INT64 *)PipCreateDependencyNode(&a1);
if( !v6 )
{
v2 = -1073741670;
goto LABEL_4;
}
}
DependentList = PiGetDependentList(ProviderPdo);
Flink = DependentList->Flink;
if( DependentList->Flink != DependentList )
{
while( 1 )
{
v11 = PiListEntryToDependencyEdge((INT64)Flink, 1i64);
Flink = Flink->Flink;
v12 = PipDependencyCopyEdge(v11, (INT64)v6);
if( v12 < 0 )
break;
if( Flink == DependentList )
goto LABEL_14;
}
v2 = v12;
}
LABEL_14:
if( (*((_DWORD *)v6 + 22))-- == 1 )
PipDeleteDependencyNode(v6, v7, v8);
PipAddDependentsToRebuildPowerRelationsQueue(NewProviderPdo);
ExReleaseResourceLite(&PiDependencyRelationsLock);
PpDevNodeUnlockTree(0);
PipProcessRebuildPowerRelationsQueue();
return v2;
}
return 3221225485i64;
}Referenced by:
No references.