驱动器号的接口类型

时间:2010-07-01 11:51:19

标签: windows winapi msdn

有关获取卷的设备接口类型的任何建议,给定其驱动器号(例如G :)?具体来说,我正在寻找一种不依赖于WMI的解决方案。

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用GetDriveType获取驱动器盘符的基本接口类型(即:可移动设备,CDROM,RAMDisk),另请参阅该页面底部的最终注释以获取有关可移动设备的更多信息设备。另请查看SetupDiGetDeviceRegistryPropertyDeviceIoControl

她是我能想到的最好的例子(未经测试,因为我没有WDK / DDK)

bool IsUSBDevice(const char* szDrivePath, bool& bRemovable)
{
    if(GetDriveType(szDrivePath) != DRIVE_REMOVABLE)
        return false;

    HANDLE hDevice = CreateFile(szDrivePath,0,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
    if(hDevice == INVALID_HANDLE_VALUE)
        return false;

    STORAGE_PROPERTY_QUERY pQuery = {0};
    pQuery.PropertyId = StorageDeviceProperty;
    pQuery.QueryType = PropertyStandardQuery;

    STORAGE_DEVICE_DESCRIPTOR pDeviceDesc = {0};
    pDeviceDesc.Size = sizeof(pDeviceDesc);
    DWORD dwWritten = 0;
    if(DeviceIoControl(hDevice,IOCTL_STORAGE_QUERY_PROPERTY,&pQuery,sizeof(STORAGE_PROPERTY_QUERY),pDeviceDesc,sizeof(pDeviceDesc),&dwWritten,NULL))
    {
        CloseHandle(hDevice);
        return ((bRemovable = pDeviceDesc.RemovableMedia) && pDeviceDesc.BusType == BusTypeUsb);
    }
    else
        CloseHandle(hDevice);

    return false; 
}