тип интерфейса для буквы диска - PullRequest
0 голосов
/ 01 июля 2010

Какие-либо предложения по получению типа интерфейса устройства для тома, учитывая его букву диска (например, G :)? В частности, я ищу решение, которое не зависит от WMI.

Спасибо.

1 Ответ

0 голосов
/ 01 июля 2010

Вы можете использовать GetDriveType , чтобы получить базовый тип интерфейса (то есть: съемное устройство, CDROM, RAMDisk) для буквы диска, также см. Окончательный комментарий внизу этой страницы для получения дополнительной информации.на съемных устройствах.Также проверьте SetupDiGetDeviceRegistryProperty и DeviceIoControl

Ее лучший пример, который я могу придумать (не проверено, поскольку у меня нет 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; 
}
...