В моем случае это комбинация кода ядра и пользовательского режима, которые облегчают жизнь, но я уверен, что вы можете сделать все это только в пользовательском режиме, используя SetupDiXXX API.
Я думаю, что USBView приложение использует другой подход.
Вы можете увидеть пример реализации утилиты USBView (C #) здесь
В общем, Google для USBView, и вы найдете много соответствующей информации.