Possible to use WinUSB as parent driver for a composite device?

Hi, this is my first time posting here. After googling a lot to try and get an answer, i found this list.

I am making a custom usb device that is currently using usbccgp.sys parent driver. It has 2 interfaces, one for audio using the generic audio driver and one for serial using usbser. Currently both interfaces work as intended. But I would like to use WinUSB because I am programming a companion chrome app which only works with WinUSB. Currently, with the usbccgp.sys driver, I cannot even see my device listed when i have chrome search for available/usable devices.I would like to use the WinUSB driver for the main device (control endpoint i think would be the right term) but when i assign that driver (using zadig) i lose my interfaces in device manager. So i had a couple of questions:

  1. Do i have to make a custom INF file that states WinUSB for the main device, then generic audio for the audio interface and usbser for the serial interface?

  2. Can a device even have WinUSB as the parent driver with 2 other drivers for its interfaces?

  3. I have never written an INF file for drivers before but i have found a few that i can use as resources. Any suggestions where i can look up keywords used in an INF and find their meanings?

I hope these questions are on topic. Any help would be greatly appreciated!

Regards.

Hi,

It is tricky but I’ll try.

There are three types of device objects

  • PDO(Physical device object)
  • FDO(Functional Device Object)
  • FiDO(Filter Device Object)

PDOs are created by a bus driver that acts as functional driver for a bus. In your case the device has a “virtual bus” to which two devices are connected - audio and serial.

USBCCGP creates FDO for a whole device(main device) and creates PDOs for each interface, they are related by BusRelation property. If you query FDO by IRP_MN_QUERY_DEVICE_RELATIONS request an array of PDOs is returned (two PDOs for your device).

Each interface driver(audio,serial) creates FDO and attaches it to PDO created by USBCCGP ( by DEVICE_OBJECT’s AttachedDevice field).

WinUSB as I know can act only as FDO driver. That means it can’t create PDOs and act as a bus driver.

I can only envision the following configuration - WinUSB is registered as functional driver for audio and serial interfaces and USBCCGP continues to support “virtual bus”. If you need to communicate with the “main device” you can create the third communication interface and register WinUSB for it as a functional driver, this requires changing the device hardware(or software if it is reprogrammable), if it is some sort of FPGA this should not be a problem. That means your device will support three interfaces instead of the current two interfaces.

There is also a possibility of adding some proprietary requests to any interface and using this interface as a proxy for the control interface.

In addition. If you want to use the existing functional drivers ( i.e. usbser and usbaudio) and communicate with the main device by WinUSB you have to add the third interfaces. In that case there will be three interfaces - serial, audio and proprietary communication interface. USBCCGP will create three PDOs and PnP Manager will attach WinUSB to the communication interface.

Hmmmm… You can with we have USBCCGP’s behavior (acting as a bus driver an enumerating a child device for each interface) or you can control the device directly via WinUsb. You can’t have both.

Hope that helps,

Peter
OSR
@OSRDrivers

Try to use UsbDk. It was developed to overcome the shortcoming of WinUSB.

https://github.com/daynix/UsbDk

xxxxx@live.com wrote:

I am making a custom usb device that is currently using usbccgp.sys parent driver. It has 2 interfaces, one for audio using the generic audio driver and one for serial using usbser. Currently both interfaces work as intended. But I would like to use WinUSB because I am programming a companion chrome app which only works with WinUSB.

What does the Chrome app need to do (generally speaking)? It is quite
unusual to have a device with nothing but standard interfaces that needs
custom back-door access. Does the Chrome app talk to the serial interface?

Currently, with the usbccgp.sys driver, I cannot even see my device listed when i have chrome search for available/usable devices.I would like to use the WinUSB driver for the main device (control endpoint i think would be the right term) but when i assign that driver (using zadig) i lose my interfaces in device manager.

ALL interfaces have access to the control endpoint.

So i had a couple of questions:

  1. Do i have to make a custom INF file that states WinUSB for the main device, then generic audio for the audio interface and usbser for the serial interface?

Why do you need WinUSB? If you want the audio interface and the serial
interface, then you need to have usbccgp own the composite device. So,
which interface do you want WinUSB to own?

  1. Can a device even have WinUSB as the parent driver with 2 other drivers for its interfaces?

No.

  1. I have never written an INF file for drivers before but i have found a few that i can use as resources. Any suggestions where i can look up keywords used in an INF and find their meanings?

Before we go there, we need to figure out what you’re planning to do.
If you need to send custom non-standard vendor commands to the control
endpoint of an otherwise class-standard device, then you need to use a
filter driver. You can’t use WinUSB.


Tim Roberts, xxxxx@probo.com
Providenza & Boekelheide, Inc.