Click here to Skip to main content
15,889,693 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I am detecting when our proprietary USB device is attached to a PC. When we detect this, we get the related 'Win32_PnPEntity'. We want to use this 'Win32_PnPEntity' as a source of the following information:
- USB Descriptor VID, PID, REV, Firmware Version.
- Logical Disk Drive Volume and Partition information to get Drive Letter information.

The problem I am having is trying to figure out how to use WMI and WMQ to get to the Logical Disk and partition information from the 'Win32_PnPEntity'.

The 'Win32_PnPEntity' is of Service type 'USBSTOR' (USB Storage I think?)


Following is a description of the process I currently go through:

I listen to the 'Win32_USBControllerDevice' with the event watcher so as to detect when the USB Device is attached or detached from the PC. I use the following query to constrain what comes through on the event:


"SELECT * 
         FROM __InstanceOperationEvent WITHIN 1 
         WHERE TargetInstance 
               ISA 'Win32_USBControllerDevice' 
               AND TargetInstance.__RELPATH LIKE '%DeviceId=%VID_XXXX%'"


When this event comes through I pull the 'Win32_USBControllerDevice.Dependent' property and pull out the 'DeviceId' value. I then use this 'DeviceId' value with the 'Win32_PNPEntity' class to get the associated instance.

This is where things get tricky for me...

I need to get to the 'Win32_DiskDrive' that the 'Win32_PnPEntity' instance relates to. I need this instance so as to get to the volume information, so I can get the drive letter each partition is assigned. But I have no idea on how to get to it.

I go through this process as 'the Win32_PnPEntity' provides the VID, PID for constraint on event listening and searching... but it also provides the Firmware Version which I need. So from this point I want to get the 'Win32_DiskDrive' for the 'Win32_PnPEntity'.

The steps I have got working so far are as follows:
- Listen to the '__InstanceModificaitionEvent' for the 'Win32_USBControllerDevice'
- Get the 'Win32_PnPEntity' from the 'TargetInstnace' of the '__InstanceModificaitionEvent'
- Get the 'DeviceId' from the 'Win32_PnPEntity' which contains the PID, VID information.

The issue I have now is trying to find the 'Win32_LogicalDisk' AND/OR 'Win32_DiskDrive' AND/OR 'Win32_DiskPartition' OR some other ASSOCIATOR or REFERENCES link to the drive letter the USB device attached has been assigned for the 'Mass Storge' instance.

The issue I have is that the USB Device is represented by 'Win32_DiskDrive' and by 'Win32_PnPEntity' but I do not know how to connect the two. Following are some more examples and detail on what I have done to try and connect the dots.

Following is a powershell script I run, while the device is attached. It gives me all the instances that belong to the USB Device. I know they belong to the one device as I have attached only one of the devices and with our custom editing of the USB DESCRIPTOR I know what to expect.

PS C:\Users\USER.DOMAIN> gwmi Win32_PNPEntity |? { ($_.DeviceId -match 'VEN_MYCOMPANY&') -or ($_.DeviceId -match 'VID_XXXX')}

__GENUS : 2
__CLASS : Win32_PnPEntity
__SUPERCLASS : CIM_LogicalDevice
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_PnPEntity.DeviceID="USB\\VID_XXXX&PID_0001\\YYYY"
__PROPERTY_COUNT : 24
__DERIVATION : {CIM_LogicalDevice, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : BYDEFAULT
__NAMESPACE : root\cimv2
__PATH : \\BYDEFAULT\root\cimv2:Win32_PnPEntity.DeviceID="USB\\VID_XXXX&PID_0001\\YYYY"
Availability : 
Caption : USB Mass Storage Device
ClassGuid : {36fc9e60-c465-11cf-8056-444553540000}
CompatibleID : {USB\Class_08&SubClass_06&Prot_50, USB\Class_08&SubClass_06, USB\Class_08}
ConfigManagerErrorCode : 0
ConfigManagerUserConfig : False
CreationClassName : Win32_PnPEntity
Description : USB Mass Storage Device
DeviceID : USB\VID_XXXX&PID_0001\YYYY
ErrorCleared : 
ErrorDescription : 
HardwareID : {USB\VID_XXXX&PID_0001&REV_0001, USB\VID_XXXX&PID_0001}
InstallDate : 
LastErrorCode : 
Manufacturer : Compatible USB storage device
Name : USB Mass Storage Device
PNPDeviceID : USB\VID_XXXX&PID_0001\YYYY
PowerManagementCapabilities : 
PowerManagementSupported : 
Service : USBSTOR
Status : OK
StatusInfo : 
SystemCreationClassName : Win32_ComputerSystem
SystemName : BYDEFAULT

__GENUS : 2
__CLASS : Win32_PnPEntity
__SUPERCLASS : CIM_LogicalDevice
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_PnPEntity.DeviceID="WPDBUSENUMROOT\\UMB\\2&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678#YYYY&0#"
__PROPERTY_COUNT : 24
__DERIVATION : {CIM_LogicalDevice, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : BYDEFAULT
__NAMESPACE : root\cimv2
__PATH : \\BYDEFAULT\root\cimv2:Win32_PnPEntity.DeviceID="WPDBUSENUMROOT\\UMB\\2&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_MYCOMPANYI&PROD_ZZZZ_-_STORAGE&REV_5678#YYYY&0#"
Availability : 
Caption : ZZZZ
ClassGuid : {eec5ad98-8080-425f-922a-dabf3de3f69a}
CompatibleID : {wpdbusenum\fs}
ConfigManagerErrorCode : 10
ConfigManagerUserConfig : False
CreationClassName : Win32_PnPEntity
  Description : ZZZZ - Storage
DeviceID : WPDBUSENUMROOT\UMB\2&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678#YYYY&0#
ErrorCleared : 
ErrorDescription : 
HardwareID : 
InstallDate : 
LastErrorCode : 
Manufacturer : MYCOMPANY 
Name : ZZZZ
PNPDeviceID : WPDBUSENUMROOT\UMB\2&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678#YYYY&0#
PowerManagementCapabilities : 
PowerManagementSupported : 
Service : WUDFRd
Status : Error
StatusInfo : 
SystemCreationClassName : Win32_ComputerSystem
SystemName : BYDEFAULT

__GENUS : 2
__CLASS : Win32_PnPEntity
__SUPERCLASS : CIM_LogicalDevice
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_PnPEntity.DeviceID="STORAGE\\VOLUME\\_??_USBSTOR#DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678#YYYY&0#{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}"
__PROPERTY_COUNT : 24
__DERIVATION : {CIM_LogicalDevice, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : BYDEFAULT
__NAMESPACE : root\cimv2
__PATH : \\BYDEFAULT\root\cimv2:Win32_PnPEntity.DeviceID="STORAGE\\VOLUME\\_??_USBSTOR#DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678#YYYY&0#{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}"
Availability : 
Caption : Generic volume
ClassGuid : {71a27cdd-812a-11d0-bec7-08002be2092f}
CompatibleID : 
ConfigManagerErrorCode : 0
ConfigManagerUserConfig : False
CreationClassName : Win32_PnPEntity
Description : Generic volume
DeviceID : STORAGE\VOLUME\_??_USBSTOR#DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678#YYYY&0#{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}
ErrorCleared : 
ErrorDescription : 
HardwareID : {STORAGE\Volume}
InstallDate : 
LastErrorCode : 
Manufacturer : Microsoft
Name : Generic volume
PNPDeviceID : STORAGE\VOLUME\_??_USBSTOR#DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678#YYYY&0#{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}
PowerManagementCapabilities : 
PowerManagementSupported : 
Service : volsnap
Status : OK
StatusInfo : 
SystemCreationClassName : Win32_ComputerSystem
SystemName : BYDEFAULT

__GENUS : 2
__CLASS : Win32_PnPEntity
__SUPERCLASS : CIM_LogicalDevice
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_PnPEntity.DeviceID="USBSTOR\\DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678\\YYYY&0"
__PROPERTY_COUNT : 24
__DERIVATION : {CIM_LogicalDevice, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : BYDEFAULT
__NAMESPACE : root\cimv2
__PATH : \\BYDEFAULT\root\cimv2:Win32_PnPEntity.DeviceID="USBSTOR\\DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678\\YYYY&0"
Availability : 
Caption : MYCOMPANY ZZZZ - Storage USB Device
ClassGuid : {4d36e967-e325-11ce-bfc1-08002be10318}
CompatibleID : {USBSTOR\Disk, USBSTOR\RAW}
ConfigManagerErrorCode : 0
ConfigManagerUserConfig : False
CreationClassName : Win32_PnPEntity
Description : Disk drive
DeviceID : USBSTOR\DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678\YYYY&0
ErrorCleared : 
ErrorDescription : 
HardwareID : {USBSTOR\DiskMYCOMPANY___ZZZZ_-_Storage5678, USBSTOR\DiskMYCOMPANY___ZZZZ_-_Storage, USBSTOR\DiskMYCOMPANY___, USBSTOR\MYCOMPANY___ZZZZ_-_Storage5...}
InstallDate : 
LastErrorCode : 
Manufacturer : (Standard disk drives)
Name : MYCOMPANY ZZZZ - Storage USB Device
PNPDeviceID : USBSTOR\DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678\YYYY&0
PowerManagementCapabilities : 
PowerManagementSupported : 
Service : disk
Status : OK
StatusInfo : 
SystemCreationClassName : Win32_ComputerSystem
SystemName : BYDEFAULT

The above result set shows a lot of information.

- Result 1: 'SERVICE TYPE' is 'USBSTOR'. This is the Win32_PnPEntity I want to use when listening to '__InstanceModificaitionEvent' as it gives me the VID and PID.
- Result 2: Is the Composite Device representation which I am not interested in.
- Result 3: 'SERVICE TYPE' is 'volsnap'. This is the volume entity and I am interested in this.
- Result 4: 'SERVICE TYPE' is 'disk'. This is the disk entity and I am interested in this.

How do I get the relationship between 'Result 1' and 'Result 3' AND/OR 'Result 4'?

I have tried using the 'Win32_PnPDevice' associating class but it does not seem to get me to the point I need. I am new to this powershell WMI and WMQ environment and so it is quite possible I am not using the 'Win32_PnPDevice' correctly.

I ran the following query to identify what was on the' SameElement' and 'SystemElement' properties of the relevant 'Win32_PnPDevice' entity:

gwmi Win32_PNPDevice |%{[wmi]($.SameElement)} | select {$.Name, $.Description, $.DeviceId, $_.Status}
gwmi Win32_PNPDevice |%{[wmi]($.SystemElement)} | select {$.Name, $.Description, $.DeviceId, $_.Status} 


The results can be read as follows:
- Win32_PNPDevice.SameElement - {PHYSICALDRIVE1, Disk drive, PHYSICALDRIVE1, OK}
- Win32_PNPDevice.SystemElement - {MYCOMPANY ZZZZ - Storage USB Device, Disk drive, USBSTOR_DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678_YYYY&0, OK}

- Win32_PNPDevice.SameElement - {USB Mass Storage Device, USB Mass Storage Device, USB_VID_XXXX&PID_0001_YYYY, OK}
- Win32_PNPDevice.SystemElement - {USB Mass Storage Device, USB Mass Storage Device, USB_VID_XXXX&PID_0001_YYYY, OK}

Maybe I am using the 'Win32_PnPDevice' class incorrectly but it would seem that I can not connect the 'Win32_PnPEntity' to the 'Win32_DiskDrive'...
Posted
Comments
E.F. Nijboer 3-Aug-10 15:24pm    
Just a thought... but it looks like path's kinda accumulate.

"USB\VID_XXXX&PID_0001\YYYY"
"USBSTOR\DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678\YYYY&0"
"WPDBUSENUMROOT\UMB\2&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678#YYYY&0#"
"STORAGE\VOLUME\_??_USBSTOR#DISK&VEN_MYCOMPANY&PROD_ZZZZ_-_STORAGE&REV_5678#YYYY&0#{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}"

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900