我需要获取有关所有连接的USB大容量存储设备的信息。现在我正在使用这段代码来完成这项工作
HDEVINFO deviceInfoList;
deviceInfoList = SetupDiGetClassDevs(NULL, _T("USBSTOR"), NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
if (deviceInfoList != INVALID_HANDLE_VALUE)
{
SP_DEVINFO_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++)
{
LPTSTR buffer = NULL;
DWORD buffersize = 0;
while (!SetupDiGetDeviceInstanceId(deviceInfoList, &deviceInfoData, buffer, buffersize, &buffersize))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
if (buffer) delete buffer;
buffer = new TCHAR[buffersize];
}
else
{
_tprintf(_T("%ls\n"), _T("error"));
break;
}
}
_tprintf(_T("%ls\n"), buffer);
if (buffer) { delete buffer; buffer = NULL; }
etc...
因此,您可以看到我正在使用带有“USBSTOR”枚举器的SetupDiGetClassDevs创建设备列表,然后使用SetupDiEnumDeviceInfo枚举它。问题是我可以在枚举中以某种方式获取CreateFile调用的设备路径吗?正如我所看到的,您可以使用SetupDiGetDeviceInterfaceDetail获取正确的路径,但为此我应该使用SetupDiEnumDeviceInterfaces函数枚举设备。我试图以这种方式枚举设备,但没有任何成功。在我看来,当您使用SetupDiEnumDeviceInterfaces枚举设备时,您应该将设备接口GUID传递给SetupDiGetClassDevs,但我找不到USB大容量存储设备的特定设备接口。我读过有关Device Information Sets的msdn文档,但实际上并没有得到“设备接口”。
最后一个问题是:我可以在使用SetupDiEnumDeviceInfo枚举设备时获取设备路径吗?如果不是,如何使用SetupDiEnumDeviceInterfaces枚举所有连接的USB大容量存储设备?
答案 0 :(得分:1)
您可以使用GUID_DEVINTERFACE_DISK枚举物理磁盘设备。使用:
SetupDiGetClassDevs
(
&GUID_DEVINTERFACE_DISK,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE
)
然后,查询存储适配器描述符。
STORAGE_PROPERTY_QUERY storageProperty;
//...setup
PSTORAGE_ADAPTER_DESCRIPTOR pstorageAdapterDesc;
pstorageAdapterDesc = (PSTORAGE_ADAPTER_DESCRIPTOR)LocallAlloc( LPTR, storageDescHeader.Size );
DeviceIoControl
(
handle,
IOCTL_STORAGE_QUERY_PROPERTY,
&storageProperty,
sizeof( STORAGE_PROPERTY_QUERY ),
pstorageAdapterDesc,
storageDescHeader.Size,
bytesReturned,
NULL
)
在描述符中,您可以使用“BusType”并检查USB。