IoResolveDependency
NTSTATUS __stdcall IoResolveDependency(_UNICODE_STRING *BindingId, _DEVICE_OBJECT *Device){
int v4;
_PNP_DEPENDENCY_NODE *BindingResolution;
_PNP_DEPENDENCY_NODE *v6;
void *v7;
PNP_DEPENDENCY_NODE *v8;
_PNP_DEPENDENCY_NODE *v9;
_DEVOBJ_EXTENSION *DeviceObjectExtension;
_DWORD *DeviceNode;
PNP_DEPENDENCY_NODE *v13;
_DEVICE_OBJECT *v14;
void *DependencyNode;
_PNP_DEPENDENCY_NODE *v16;
_DEVICE_NODE *v17;
_PNP_BINDING_RESOLUTION Query[2];
void *v19;
Query[1] = 0;
v4 = 0;
PnpAcquireDependencyRelationsLock(1);
Query[0] = 1;
v19 = BindingId;
BindingResolution = PipQueryBindingResolution(Query);
v6 = BindingResolution;
if( BindingResolution )
{
v14 = (_DEVICE_OBJECT *)*((_QWORD *)BindingResolution + 6);
if( v14 )
{
if( v14 == Device )
goto LABEL_15;
v4 = PipDeleteBindingId(v6, BindingId);
v6 = 0i64;
}
if( v6 )
{
if( !*((_QWORD *)v6 + 6) )
{
if( Device )
DependencyNode = Device->DeviceObjectExtension->DependencyNode;
else
DependencyNode = 0i64;
if( DependencyNode )
{
if( Device )
v16 = (_PNP_DEPENDENCY_NODE *)Device->DeviceObjectExtension->DependencyNode;
else
v16 = 0i64;
PipMergeDependencyNodes(v16, v6);
}
else
{
PipLinkDeviceObjectAndDependencyNode(Device, v6);
}
}
goto LABEL_8;
}
}
if( Device )
v7 = Device->DeviceObjectExtension->DependencyNode;
else
v7 = 0i64;
if( !v7 )
{
Query[0] = 0;
v19 = Device;
v8 = (PNP_DEPENDENCY_NODE *)PipCreateDependencyNode(Query);
v9 = v8;
if( v8 )
{
v4 = PipAddBindingId(v8, BindingId);
if( v4 >= 0 )
{
PipDereferenceDependencyNode(v9);
goto LABEL_8;
}
PipUnlinkDeviceObjectAndDependencyNode(Device, v9);
PipDereferenceDependencyNode(v9);
}
else
{
v4 = -1073741670;
}
LABEL_15:
PnpReleaseDependencyRelationsLock();
return v4;
}
if( Device )
v13 = (PNP_DEPENDENCY_NODE *)Device->DeviceObjectExtension->DependencyNode;
else
v13 = 0i64;
v4 = PipAddBindingId(v13, BindingId);
if( v4 < 0 )
goto LABEL_15;
LABEL_8:
if( Device )
{
DeviceObjectExtension = Device->DeviceObjectExtension;
DeviceNode = DeviceObjectExtension->DeviceNode;
if( DeviceNode )
{
if( (DeviceNode[99] & 0x20000) == 0 && PipIsProviderStarted((_DEVICE_NODE *)DeviceObjectExtension->DeviceNode) )
PipAttemptDependentsStart(v17);
}
}
PipAddtoRebuildPowerRelationsQueue(Device);
PipAddDependentsToRebuildPowerRelationsQueue(Device);
PnpReleaseDependencyRelationsLock();
PipProcessRebuildPowerRelationsQueue();
return v4;
}Referenced by:
No references.