Winapi 使用SetupDiEnumDeviceInfo枚举设备时获取CreateFile的设备路径

Winapi 使用SetupDiEnumDeviceInfo枚举设备时获取CreateFile的设备路径,winapi,setupapi,Winapi,Setupapi,我需要获取所有连接的usb大容量存储设备的信息。现在我正在使用这个代码来完成这项工作 HDEVINFO deviceInfoList; deviceInfoList = SetupDiGetClassDevs(NULL, _T("USBSTOR"), NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT); if (deviceInfoList != INVALID_HANDLE_VALUE) { SP_DEVINFO_DATA deviceInfoData;

我需要获取所有连接的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函数枚举设备。我曾试图以这种方式列举设备,但没有成功。在我看来,当使用SetupDienumDeviceInterface枚举设备时,应该将设备接口GUID传递给SetupDiGetClassDevs,但我找不到usb大容量存储设备的特定设备接口。我读了msdn文档,真的不明白“设备接口”是什么


最后一个问题是:在使用SetupDiEnumDeviceInfo枚举设备时,是否可以获取设备路径?如果否,如何使用SetupDienumDeviceInterface枚举所有连接的usb大容量存储设备?

您可以使用GUID\u DeviceInterface\u磁盘枚举物理磁盘设备。使用:

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。

我们正在开发此API,它最终将允许您与存储设备通信。它是开源的,您可以查看当前代码以获取一些信息。请返回查看更多功能: