О борьбе с зависаниями. Проверено, что если после зависания из панели управления выключить устройство и снова включить, оно начинает работать. Физически при этом стеку драйверов, как я понимаю, передается irp IRP_MJ_PNP IRP_MN_START/STOP_DEVICE. Без своего драйвера непонятно, как это сделать. Но, похоже, есть вариант работы через setupapi.dll. С помощью SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces, SetupDiGetDeviceInterfaceDetail можно найти устройство, затем с помощью SetupDiChangeState сделать disable/enable. До получения списка устройств дошел, дальше пока некогда. Никто так не реанимировал зависшее USB-устройство?