环境
win 10客户端
USB转串口
现象
重定向失败,重定向线程直接卡住
测试
已经尝试,纯净版PC 设备没有任何驱动,依然有这个问题存在
代码
USBDK
分析
报错日志问题点
1 | static void connect_cb(GObject *gobject, GAsyncResult *res, gpointer user_data) |
- 调用入口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27static void checkbox_clicked_cb(GtkWidget *check, gpointer user_data)
{
SpiceUsbDeviceWidget *self = SPICE_USB_DEVICE_WIDGET(user_data);
SpiceUsbDeviceWidgetPrivate *priv = self->priv;
SpiceUsbDevice *device;
device = g_object_get_data(G_OBJECT(check), "usb-device");
connect_cb_data *data = g_new(connect_cb_data, 1);
data->check = g_object_ref(check);
data->self = g_object_ref(self);
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check))) {
spice_usb_device_manager_connect_device_async(priv->manager,
device,
NULL,
connect_cb,
data);
} else {
spice_usb_device_manager_disconnect_device_async(priv->manager,
device,
NULL,
_disconnect_cb,
data);
}
spice_usb_device_widget_update_status(self);
}
spice_usb_device_manager_connect_device_async
- spice_usb_backend_device_get_libdev
- spice_usbredir_channel_connect_device_async
- spice_usbredir_channel_open_acl_cb
- spice_usbredir_channel_open_device
- spice_usb_backend_channel_attach
- libusb_open
- spice_usb_backend_channel_attach
- spice_usbredir_channel_open_device
- spice_usbredir_channel_open_acl_cb
libusb_open
- UsbDk_StartRedirect
- UsbDkDriverAccess::AddRedirect
- SendIoctlWithDeviceId(IOCTL_USBDK_ADD_REDIRECT, DeviceID, &RedirectorHandle);
- UsbDkDriverAccess::AddRedirect
- UsbDk_StartRedirect
驱动层
IOCTL_USBDK_ADD_REDIRECT
1 | #CUsbDkControlDeviceQueue::DeviceControl |
- AddRedirect
- CUsbDkControlDeviceQueue::AddRedirect
- devExt->UsbDkControl->AddRedirect
- CUsbDkControlDeviceQueue::AddRedirect
1 | void CUsbDkControlDeviceQueue::AddRedirect(CControlRequest &Request, WDFQUEUE Queue) |
使用命令调试
直接用UsbDkController 操控设备,也是一样第二次重定向直接失败
1 | static int Controller_RedirectDevice(TCHAR *DeviceID, TCHAR *InstanceID) |
- 日志
1
2
3
4
5
6
7
8
900000138 UsbDk 540 1524 0 138 02\10\2023-10:24:11:454 Do IoControlCode 0xC350E150
00000139 UsbDk 540 1524 0 139 02\10\2023-10:24:11:454 CUsbDkControlDevice::AddRedirectionToSet Adding new redirection
00000140 UsbDk 540 1524 0 140 02\10\2023-10:24:11:454 CUsbDkRedirection::Dump DevID: USB\VID_067B&PID_23C3, InstanceID: BDEHf103Y23
00000141 UsbDk 540 1524 0 141 02\10\2023-10:24:11:454 CUsbDkControlDevice::AddRedirect Success. New redirections list:
00000142 UsbDk 540 1524 0 142 02\10\2023-10:24:11:454 CUsbDkRedirection::Dump DevID: USB\VID_067B&PID_23C3, InstanceID: BDEHf103Y23
00000143 UsbDk 540 1524 0 143 02\10\2023-10:24:11:455 CWdmUsbDeviceAccess::Reset device power state D3
00000144 UsbDk 4 200 0 144 02\10\2023-10:24:11:455 PowerRequestCompletion -> D0
00000145 UsbDk 540 1524 0 145 02\10\2023-10:26:11:453 CUsbDkControlDevice::AddRedirect Wait for redirector attachment failed. 0x00000102(STATUS_TIMEOUT)
00000146 UsbDk 540 1524 0 146 02\10\2023-10:26:11:453 CUsbDkRedirection::Dump Deleting DevID: USB\VID_067B&PID_23C3, InstanceID: BDEHf103Y23
1 | NTSTATUS CUsbDkControlDevice::AddRedirect(const USB_DK_DEVICE_ID &DeviceId, HANDLE RequestorProcess, PHANDLE RedirectorDevice) |
经过调试,已经确认是执行ResetUsbDevice操作后 WaitForAttachment等不到相应事件导致卡死
经过最后一次bushound抓包分析,目前确定,问题设备,在终止重定向后,hub驱动约10s左右,有一个IRP触发。如果在该IRP触发前插入设备,就回重定向失败
- 本文作者: crazyboy
- 本文链接: http://crazyboy.www.crazyboy.info/blog/blog/2023/02/01/kylin/debug/usbcomdebug/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!