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:
Rémi Bernon 2019-09-20 10:31:40 +02:00 committed by Alexandre Julliard
parent 5de712b5d8
commit 8db70e92a8
1 changed files with 20 additions and 5 deletions

View File

@ -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;
} }