首先通过指定GUID,用SetupDiGetClassDevs,得到Harddisk类和Volume两大类设备的所有设备信息。
DEFINE_GUID /
(HARDDISK_GUID, 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID /
VOLUME_GUID, 0x53f5630d, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
hDevInfoSet = SetupDiGetClassDevsW(lpGuid, NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
接着用SetupDiEnumDeviceInterfaces依次枚举设备信息集中各个设备的接口信息。
如果成功,进一步调用SetupDiGetDeviceInterfaceDetail得到每个设备的详细信息。
然后依次用CM_Get_Parent、CM_Get_Device_ID取得该设备实例的device instance ID 这个东西是类似下面这样的串:PCIIDE/IDECHANNEL/4&E3EC092&0&0、USB/VID_0D7D&PID_0150/4D3B190303C0。
想必你已经注意到USB设备都以USB开头,同时包含了该设备的PID和VID,这样就可以判断是否是特定厂商的设备。接着要取得该USB设备对应的盘符,因为每个设备可能包含多个卷,所以用上面类似的方法取得所有卷的信息,通过比对设备号可以判断多个卷是否属于同一个设备,接着用卷设备的物理设备名称反查符号连接(QueryDosDevice)就能得到该卷对应的盘符,进一步可以得到,一个物理磁盘所有卷的盘符。
DEFINE_GUID /
(HARDDISK_GUID, 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID /
VOLUME_GUID, 0x53f5630d, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
hDevInfoSet = SetupDiGetClassDevsW(lpGuid, NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
接着用SetupDiEnumDeviceInterfaces依次枚举设备信息集中各个设备的接口信息。
如果成功,进一步调用SetupDiGetDeviceInterfaceDetail得到每个设备的详细信息。
然后依次用CM_Get_Parent、CM_Get_Device_ID取得该设备实例的device instance ID 这个东西是类似下面这样的串:PCIIDE/IDECHANNEL/4&E3EC092&0&0、USB/VID_0D7D&PID_0150/4D3B190303C0。
想必你已经注意到USB设备都以USB开头,同时包含了该设备的PID和VID,这样就可以判断是否是特定厂商的设备。接着要取得该USB设备对应的盘符,因为每个设备可能包含多个卷,所以用上面类似的方法取得所有卷的信息,通过比对设备号可以判断多个卷是否属于同一个设备,接着用卷设备的物理设备名称反查符号连接(QueryDosDevice)就能得到该卷对应的盘符,进一步可以得到,一个物理磁盘所有卷的盘符。
1262

被折叠的 条评论
为什么被折叠?



