Использование WinUSB - это, вероятно, правильный путь. Вы можете определенно использовать WinUSB в DLL. В общем, вы можете написать DLL, которая вызывает функции в другой DLL, и нет ничего особенного в winusb.dll, которая мешает вам это делать. Кроме того, это уже сделано в других проектах, таких как libusb и libusbp, которые компилируются в DLL, использующую winusb.dll.
Я также хотел бы предложить вам сделать свой кросс-платформенный код: не вызывайте WinUSB непосредственно из своей библиотеки DLL, а вместо этого используйте библиотеку абстракции USB, такую как libusb или libusbp. Даже если вы только хотите поддерживать Windows, эти библиотеки намного проще в использовании, чем SetupAPI и WinUSB, поэтому они должны экономить время разработки. Они также сэкономят много времени, если вы когда-нибудь захотите, чтобы ваш код работал в разных операционных системах.
Я думаю, что единственная причина для написания собственного драйвера UMDF или KMDF в такой ситуации, если вам нужны расширенные функции стека Windows USB, которые не поддерживаются WinUSB. Например, если вам нужно переключить устройство на другую конфигурацию USB или выполнить сложную работу с управлением питанием или разрешить сразу нескольким приложениям использовать устройство. Если вы просто хотите отправить некоторые данные взад и вперед, WinUSB - прекрасный выбор.