Changing USB device behavior when resuming from S3/S4

Since Windows Vista was released, there have been a handful of fixes that have come out to address various USB bus and device issues.  In some cases, only one or two files were affected and updated.  In other cases, it involved updates to all of the core USB files.  Along the way, a change was made to Windows Vista that affected how all USB devices behaved when the computer resumes from Sleep (S3) or Hibernation (S4).  The first USB hotfix that implemented this change was KB928631.

When Windows Vista was first released (i.e. RTM), the default behavior when the PC was resumed from S3/S4 was to force a reset to all USB Host Controllers.  This reset resulted in all USB devices being re-enumerated.  In theory, this *should* not have been needed as USB devices should know how to respond properly upon wake from Sleep without needing to be re-enumerated.  While this default behavior did indeed help some USB devices, it also caused problems for other USB devices.

As a result, starting with KB928631 and all future Windows Vista USB hotfixes and Service Packs, a change was made where Windows Vista no longer by default issued a reset across all USB Host Controllers on resume from S3 and S4 (per the USB 2.0 spec).  So while this fixed a number of USB device issues, it also caused some new issues for USB devices that depended on the re-enumeration to get back into a "good" state.  As a result, Microsoft provided a registry entry (ForceHCResetOnResume) that could be added on a per USB Host Controller basis to go back to the old behavior of issuing a Host Controller reset upon resume from S3 and S4.  This allows OEMs and end users to revert to the old behavior for specific Host Controllers that have USB devices attached that require re-enumeration on resume from S3/S4.

Windows Vista Service Pack 1 keeps the same behavior of not issuing USB Host Controller resets on resume from Sleep.  However, if you upgrade a system that has an existing ForceHCResetOnResume registry setting for a Host Controller, it will respect it and preserve whatever value was present.  This also applies to all USB hotfixes that are applied to the system post-Vista SP1.  One important note is that if for any reason you need to remove and reinstall a USB Host Controller in Device Manager, it will remove the ForceHCResetOnResume registry setting (if present) and revert to the "no reset" behavior.  You will need to go back in to the registry and manually add this setting again for that particular USB Host Controller.

For more information on the ForceHCResetOnResume registry entry and how to enable it on a per USB Host Controller basis, please review the following Knowledge Base and TechNet articles:

https://support.microsoft.com/kb/928631
https://support.microsoft.com/kb/945577
https://technet.microsoft.com/en-us/library/cc947756.aspx