ntoskrnl.exe: Update the interface if it is already in the tree.
As we are going to reuse the same device id when re-plugging a previously plugged SDL controller, the device interfaces are still present in the tree and IoRegisterDeviceInterface was not updating the device pointer. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
5de712b5d8
commit
8db70e92a8
|
@ -622,7 +622,9 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla
|
||||||
WCHAR device_instance_id[MAX_DEVICE_ID_LEN];
|
WCHAR device_instance_id[MAX_DEVICE_ID_LEN];
|
||||||
SP_DEVICE_INTERFACE_DETAIL_DATA_W *data;
|
SP_DEVICE_INTERFACE_DETAIL_DATA_W *data;
|
||||||
NTSTATUS status = STATUS_SUCCESS;
|
NTSTATUS status = STATUS_SUCCESS;
|
||||||
|
UNICODE_STRING device_path;
|
||||||
struct device_interface *iface;
|
struct device_interface *iface;
|
||||||
|
struct wine_rb_entry *entry;
|
||||||
DWORD required;
|
DWORD required;
|
||||||
HDEVINFO set;
|
HDEVINFO set;
|
||||||
|
|
||||||
|
@ -660,19 +662,32 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla
|
||||||
|
|
||||||
data->DevicePath[1] = '?';
|
data->DevicePath[1] = '?';
|
||||||
TRACE("Returning path %s.\n", debugstr_w(data->DevicePath));
|
TRACE("Returning path %s.\n", debugstr_w(data->DevicePath));
|
||||||
|
RtlCreateUnicodeString( &device_path, data->DevicePath);
|
||||||
|
|
||||||
|
entry = wine_rb_get( &device_interfaces, &device_path );
|
||||||
|
if (entry)
|
||||||
|
{
|
||||||
|
iface = WINE_RB_ENTRY_VALUE( entry, struct device_interface, entry );
|
||||||
|
if (iface->enabled)
|
||||||
|
ERR("Device interface %s is still enabled.\n", debugstr_us(&iface->symbolic_link));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
iface = heap_alloc_zero( sizeof(struct device_interface) );
|
iface = heap_alloc_zero( sizeof(struct device_interface) );
|
||||||
|
RtlCreateUnicodeString(&iface->symbolic_link, data->DevicePath);
|
||||||
|
if (wine_rb_put( &device_interfaces, &iface->symbolic_link, &iface->entry ))
|
||||||
|
ERR("Failed to insert interface %s into tree.\n", debugstr_us(&iface->symbolic_link));
|
||||||
|
}
|
||||||
|
|
||||||
iface->device = device;
|
iface->device = device;
|
||||||
iface->interface_class = *class_guid;
|
iface->interface_class = *class_guid;
|
||||||
RtlCreateUnicodeString(&iface->symbolic_link, data->DevicePath);
|
|
||||||
if (symbolic_link)
|
if (symbolic_link)
|
||||||
RtlCreateUnicodeString( symbolic_link, data->DevicePath);
|
RtlCreateUnicodeString( symbolic_link, data->DevicePath);
|
||||||
|
|
||||||
if (wine_rb_put( &device_interfaces, &iface->symbolic_link, &iface->entry ))
|
|
||||||
ERR("Failed to insert interface %s into tree.\n", debugstr_us(&iface->symbolic_link));
|
|
||||||
|
|
||||||
HeapFree( GetProcessHeap(), 0, data );
|
HeapFree( GetProcessHeap(), 0, data );
|
||||||
|
|
||||||
|
RtlFreeUnicodeString( &device_path );
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue