IoDuplicateDependency
NTSTATUS __stdcall IoDuplicateDependency(_DEVICE_OBJECT *ProviderPdo, _DEVICE_OBJECT *NewProviderPdo){
NTSTATUS v2;
_PNP_DEPENDENCY_NODE *BindingResolution;
PNP_DEPENDENCY_NODE *DependencyNode;
_LIST_ENTRY *DependentList;
_LIST_ENTRY *Flink;
PNP_DEPENDENCY_EDGE *v9;
NTSTATUS v10;
_PNP_BINDING_RESOLUTION Query[2];
_DEVICE_OBJECT *v14;
v2 = 0;
Query[1] = 0;
if( ProviderPdo && NewProviderPdo )
{
PnpAcquireDependencyRelationsLock(1);
if( !ProviderPdo->DeviceObjectExtension->DependencyNode )
{
LABEL_4:
ExReleaseResourceLite((PERESOURCE)((char *)&stru_140C452E0 + 384));
PpDevNodeUnlockTree(PPL_SIMPLE_READ);
return v2;
}
Query[0] = 0;
v14 = NewProviderPdo;
BindingResolution = PipQueryBindingResolution(Query);
DependencyNode = BindingResolution;
if( BindingResolution )
{
++BindingResolution[22];
}
else
{
DependencyNode = (PNP_DEPENDENCY_NODE *)PipCreateDependencyNode(Query);
if( !DependencyNode )
{
v2 = -1073741670;
goto LABEL_4;
}
}
DependentList = PiGetDependentList(ProviderPdo);
Flink = DependentList->Flink;
if( DependentList->Flink != DependentList )
{
while( 1 )
{
v9 = PiListEntryToDependencyEdge(Flink, DependentList);
Flink = Flink->Flink;
v10 = PipDependencyCopyEdge(v9, DependencyNode);
if( v10 < 0 )
break;
if( Flink == DependentList )
goto LABEL_14;
}
v2 = v10;
}
LABEL_14:
if( DependencyNode[22]-- == 1 )
PipDeleteDependencyNode(DependencyNode);
PipAddDependentsToRebuildPowerRelationsQueue(NewProviderPdo);
ExReleaseResourceLite((PERESOURCE)((char *)&stru_140C452E0 + 384));
PpDevNodeUnlockTree(PPL_SIMPLE_READ);
PipProcessRebuildPowerRelationsQueue();
return v2;
}
return -1073741811;
}Referenced by:
No references.