Определить USB-накопитель

0

Контекст: мое приложение записывает данные на USB, CD и DVD. Я использую RegisterDeviceNotification для обнаружения изменений устройства. Чтобы убедиться, что подключенное устройство является USB-устройством хранения данных, я использую DeviceIoControl api.

Проблема: теперь мне нужно определить устройства хранения на USB-устройствах. Во время тестирования я обнаружил, что CD/DVD на основе USB также были обнаружены по логике в качестве запоминающего устройства USB. Я добавил проверку типа устройства. Но я не вижу никаких типов устройств в SCSI для массового хранения USB.

Пожалуйста, предложите мне хорошее решение для уникальной идентификации USB-накопителя.

 bool IsUsbStorageDevice( wchar_t letter )
    {
        wchar_t volumeAccessPath[] = L"\\\\.\\X:";
        volumeAccessPath[4] = letter;

        HANDLE deviceHandle = CreateFileW(
            volumeAccessPath,
            0,                // no access to the drive
            FILE_SHARE_READ | // share mode
            FILE_SHARE_WRITE,
            NULL,             // default security attributes
            OPEN_EXISTING,    // disposition
            0,                // file attributes
            NULL);            // do not copy file attributes

        // setup query
        STORAGE_PROPERTY_QUERY query;
        memset(&query, 0, sizeof(query));
        query.PropertyId = StorageDeviceProperty;
        query.QueryType = PropertyStandardQuery;

        // issue query
        DWORD bytes;
        STORAGE_DEVICE_DESCRIPTOR devd;
        STORAGE_BUS_TYPE busType = BusTypeUnknown;
        bool usbcdrom = false;

        if (DeviceIoControl(deviceHandle,
            IOCTL_STORAGE_QUERY_PROPERTY,
            &query, sizeof(query),
            &devd, sizeof(devd),
            &bytes, NULL))
        {
            busType = devd.BusType;
            usbcdrom = devd.DeviceType == 0x005;
        }
        CloseHandle(deviceHandle);
        return (BusTypeUsb == busType) && !usbcdrom;
    }
Теги:
winapi

2 ответа

0

GetDriveType (root) предоставляет тип диска, как съемный, фиксированный, cdrom и некоторые другие:

wchar_t rootPath[] = L"X:\\";
rootPath[0] = letter;

DWORD DriveType = GetDriveType( rootPath );

switch ( DriveType ) {
    case DRIVE_CDROM:
        // CD/DVD/BR drive
        break;
    case DRIVE_REMOVABLE:
        // most flash drives, card readers
        break;
    case DRIVE_FIXED:
        // some flash drives, hard drives
        break;
    default:
        // never seen for USB drives
        break;
}
0

Вы должны использовать L "\\\\.\\PhysicalDriveN" вместо L "\\\\.\\X:"

где вы меняете N от 0 до 29:

PhysicalDrive0

PhysicalDrive1

...

PhysicalDrive29

  • 0
    Ограничено ли 30 устройств (0-29)? Мы используем аналогичный подход и хотим в конечном итоге получить доступ к более чем 50 устройствам, но очень хотели бы знать, является ли 30 каким-то пределом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню