[PATCH 1/2] ntoskrnl: Update the interface if it is already in the device_interfaces tree
Rémi Bernon
rbernon at codeweavers.com
Thu Jul 25 09:23:51 CDT 2019
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 at codeweavers.com>
---
dlls/ntoskrnl.exe/pnp.c | 25 ++++++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c
index 30865a05dcb..79aa343c1b2 100644
--- a/dlls/ntoskrnl.exe/pnp.c
+++ b/dlls/ntoskrnl.exe/pnp.c
@@ -622,7 +622,9 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla
WCHAR device_instance_id[MAX_DEVICE_ID_LEN];
SP_DEVICE_INTERFACE_DETAIL_DATA_W *data;
NTSTATUS status = STATUS_SUCCESS;
+ UNICODE_STRING device_path;
struct device_interface *iface;
+ struct wine_rb_entry *entry;
DWORD required;
HDEVINFO set;
@@ -660,19 +662,32 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla
data->DevicePath[1] = '?';
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) );
+ 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 = heap_alloc_zero( sizeof(struct device_interface) );
iface->device = device;
iface->interface_class = *class_guid;
- RtlCreateUnicodeString(&iface->symbolic_link, data->DevicePath);
if (symbolic_link)
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 );
+ RtlFreeUnicodeString( &device_path );
+
return status;
}
--
2.20.1
More information about the wine-devel
mailing list