You have to understand how stupid the USB bus is.
When you have multiple devices connected to any given USB hub (multiple ports per hub), each time a byte of data comes across that hub, then Windows calls every interrupt service routine, for each device, connected to that hub. Basically, Windows is asking, "Is this yours?".
The interrupt service routines all have to check to see if it is for them. If it is, they take action and clear the interrupt. If not, then they pass it on to the next device, via Windows. It is always quite possible for any given ISR (interrupt service routine) to muck it up and cause things to get lost by clearing the interrupt, when it is not for them. That causes all manner of hang conditions and/or crashes.