The hardware that we are using does not have any IADs, nor do we have control over the USB descriptors (other than VID/PID and strings). As far as our INF goes, we are currently matching the hardware ID based on VID/PID. However, we could add models for VID/PID/bInterfaceNumber if you think that there may be something useful that we could do by making the INF match the interfaces (although we will ultimately need to control both interfaces in the same driver).
You noted that Windows Update can be used to update the parent. I’m supposing you meant that it will search Windows Update if you manually choose to update the driver after Windows has already assigned the USB Composite Device driver. What we’re looking to deal with right now is the driver installation during the initial attachment of the device.
This is my current understanding of what Windows will do the first time that our device is plugged in (assuming that our driver exists on Windows Update). Please let me know if I overlooked something or if I appear to be misunderstanding something.
1.) Windows detects that a new device has been connected and searches for a matching driver:
2.) Windows searches the local driver store for INFs with matching hardware IDs. Since our INF has not yet been introduced to the system, it will not find a match.
3.) Windows searches the local driver store for INFs with matching compatible IDs. Due to our hardware settings (class, subclass, number of interfaces, etc.) our device will match against the Composite USB Device driver.
4.) Windows installs the Composite USB Device driver for our device, which enumerates two child devices corresponding to the two USB interfaces.
5.) Windows detects these new devices, and searches for drivers for each one:
6.) Windows searches the local driver store for INFs with matching hardware IDs for a child interface. No INFs should already exist with this hardware ID, so there will be no match.
7.) Windows searches the local driver store for INFs with matching compatible IDs for a child interface. The child interfaces are not part of a standard USB class, so there will be no match.
8.) Because no suitable driver could be found, Windows pops up the found new hardware wizard prompt to allow the user to specify a driver file for the child interface.
9.) At the prompt, the user opts to search Windows Update.
10.a.) No suitable driver will be found on Windows Update, because our driver matches against VID/PID, whereas the device for which the wizard appeared is providing VID/PID/interface.
10.b.) Presumably, if our driver actually did match against VID/PID/interface, Windows Update would find a driver, but that driver would be installed for each interface individually, rather than for the whole device.
That said, is there any way that Windows Update could interject before step (3) such that my driver (again, assuming that it’s already up on Windows Update) will be found and selected before the USB Composite Device driver? Alternatively, if Windows searches Windows Update per step (10.b), is there some way that my driver can be applied to the parent device during this step, or can it only be applied to the child interfaces because those were the “devices” that actually invoked the wizard?
Also, I looked into DPInst, as per your suggestion. This is definitely a great solution for deploying the driver (with DPInst) directly to customers. However, because I cannot guarantee that our users will install the driver before plugging in any hardware, I’m wondering if DPInst packages can be distributed/run from Windows Update during the found new hardware wizard. If so, it seems like I could force my INFs to match also against VID/PID/interface so that when the child interfaces search Windows Update, they will download/run my DPInst package, which will then replace the parent driver with my intended driver. Is this possible? If so, is it an appropriate practice? (I’m still somewhat unclear on the correct procedure for deploying a custom composite device driver through Windows Update such that it will be retrieved when the device is first connected.)