Windows System Software -- Consulting, Training, Development -- Unique Expertise, Guaranteed Results

Before Posting...
Please check out the Community Guidelines in the Announcements and Administration Category.

More Info on Driver Writing and Debugging

The free OSR Learning Library has more than 50 articles on a wide variety of topics about writing and debugging device drivers and Minifilters. From introductory level to advanced. All the articles have been recently reviewed and updated, and are written using the clear and definitive style you've come to expect from OSR over the years.

Check out The OSR Learning Library at:

[Minifilter] Uniquely identify usb

qwnqwn Member - All Emails Posts: 18
Hello everyone, hope you are having a nice day.

This is an issue I need help with, I need to uniquely identify the usbs which get plugged in to the system.

What I have tried:
I send IOCTL_STORAGE_QUERY_PROPERTY down to the device which returns me a STORAGE_ADAPTER_DESCRIPTOR structure from which I can get vendorId(ASCII), productID(ASCII) but the serial number is not of the physical device as seen from the thread here :

Since it would be easier to get the serial number from a user level application, I created a communication port from which I send the vendorId, productID to the user level service.

In the user level service I get the output of
wmic diskdrive get pnpdeviceid

which gives me an output like so,


Here I match the vendorID and the productID to get the serial number, but the issue is that if two USBs have the same vendor & productID I would not be able to distinguish between them.

I also wanted the true vendorID and productID ie aplhanumeric, so in the serivice after I get the serialnumber of the said device I use SetupApi to get the devicepath, which gives me an output like so.

I compare the serial number and send back the VID,PID(alphanumeric) and serial number to the driver.

Again the major problem here is that I filter based on the vendorID and productID which can be common across devices.

Is there any other parameter that can be obtained through the minifilter and the user level which would uniquely identify USB.

I thought of using VolumeGUID but then at the userlevel how would I map the volumeGuid to a VID/PID/SerialNumber.


  • Scott_Noone_(OSR)Scott_Noone_(OSR) Administrator Posts: 3,362
    How unique are you expecting this unique identifier to be? USB devices are supposed to have unique serial numbers, but they can be missing or not actually unique.

    What are you trying to achieve?



  • qwnqwn Member - All Emails Posts: 18
    > What are you trying to achieve?

    The user should be able to set permissions from user level, I would have a file which would specify if the device would be blocked.
    The user would basically add the VID + PID + Serial number and the minifilter would block read write calls to said devices.

    > How unique are you expecting this unique identifier to be?

    Any value which can be retrieved from both user level and my driver which I could compare and map to VID/PID/Serial Number in user level.

    > USB devices are supposed to have unique serial numbers

    The thing is I cant get the serial number from my minifilter

    so I delegated the functionality to user level service, but getting a unique serial number is a problem.
    I can retrieve vendorId and productID from my driver which I pass to the service which gives me a serial number but the vendor ID and product ID could be same across multiple devices

  • Slava_ImameevSlava_Imameev Member Posts: 480
    Not all USB devices have a unique ID. If a device doesn't have a unique ID it is being generated by the system, such IDs contain & , e.g. 1234&45ABC .

    Some devices report the same unique ID.
  • qwnqwn Member - All Emails Posts: 18
    Thank you Mr Slava,

    Can I get this unique ID from usermode? I would like to map it to VID,PID,Serialnum.
  • Slava_ImameevSlava_Imameev Member Posts: 480
    You can fetch all information with SetupAPI ( ) or by directly querying the register, for example a path for a device registry entry


    contains and ID 6&1c88b9a2&0&0000 which is an ID generated by the system ( it has & ) for a device that doesn't report a unique ID.

    While a path

    is for a device that reports a unique ID 575845393037343633363435 .

    A generated ID is not unique even on the same PC. It can change if a device is replugged to another USB hub.
  • qwnqwn Member - All Emails Posts: 18
    Ok so with SetupAPI I can get the Uniqie ID, the issue that remains is getting the same unique ID through the minfilter.

    IOCTL_STORAGE_QUERY_PROPERTY with StorageDeviceProperty and PropertyStandardQuery does not seem to return the same unique ID.
  • Slava_ImameevSlava_Imameev Member Posts: 480
    Using SetupAPI you can build a PnP tree and find a USB device related to a volume. It is possible to do this in the kernel with IRP_MJ_PNP ( IRP_MN_QUERY_DEVICE_RELATIONS for BusRelations, EjectionRelations and RemovalRelations ) but this is not considered as a standard technique.
  • Scott_Noone_(OSR)Scott_Noone_(OSR) Administrator Posts: 3,362
    Sending a BusRelations is bad business, the PnP Manager is the only one who should ever send it. If the bus driver detects a bus change as a result of your query (e.g. device added/removed) the PnP Manager may never be notified of it.

    I'm still not sure what you're actually going to be able to DO with this "unique" ID as, as Slava mentioned, it's not even really unique. But you'll probably end up in a situation where you need to get the ID in user mode and then have user mode tell the driver what the ID is.



Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Upcoming OSR Seminars
OSR has suspended in-person seminars due to the Covid-19 outbreak. But, don't miss your training! Attend via the internet instead!
Writing WDF Drivers 7 Dec 2020 LIVE ONLINE
Internals & Software Drivers 25 Jan 2021 LIVE ONLINE
Developing Minifilters 8 March 2021 LIVE ONLINE