Различение USB-накопителя и USB-накопителя в Windows - PullRequest
5 голосов
/ 02 августа 2010

Я пытаюсь провести различие между USB-накопителем и USB-накопителем в Windows с помощью Win32 API.

Функция GetDriveType () вернет DRIVE_REMOVABLE, если диск съемный, а USB-накопители, конечно, съемные. Но я думаю, что Windows, вероятно, также считает съемные жесткие диски USB (к сожалению, у меня нет доступа к жесткому диску USB, чтобы проверить его).

Заранее спасибо.

Ответы [ 7 ]

1 голос
/ 10 июня 2011

Я думаю, что ключ - это свойства привода, например, количество цилиндров. Вы можете использовать интерфейс WMI для определения такой информации. Вот пример http://www.computerperformance.co.uk/vbscript/wmi_disks_physical.htm

1 голос
/ 06 октября 2014
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Method      OpenVolume
//  Purpose:    Open volume for removal. Change to ::CreateFile(volumeName, 0, 0, 0, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
//              if you just want to inquire if it's removable. 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

HANDLE OpenVolume(const char& driveLetter)
{
    char volumeName[8] = "";
    char* volumeFormat = "\\\\.\\%c:";
    sprintf(volumeName, volumeFormat, driveLetter);

    HANDLE volume = ::CreateFile(volumeName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (volume == INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE;

    DWORD bytesReturned = 0;
    STORAGE_HOTPLUG_INFO Info = {0};
    if (::DeviceIoControl(volume, IOCTL_STORAGE_GET_HOTPLUG_INFO, 0, 0, &Info, sizeof(Info), &bytesReturned, NULL)) 
    {
        if (!(Info.MediaRemovable || Info.DeviceHotplug)) 
        {
            ::CloseHandle(volume);
            ::SetLastError(ERROR_INVALID_PARAMETER);
            return INVALID_HANDLE_VALUE;
        }
    }

    return volume;
}
1 голос
/ 10 июня 2011

Если вы хотите определить, что устройство является устройством USB, вы можете открыть его дескриптор и отправить запросы IOCTL с помощью DeviceIoControl (), чтобы определить тип шины, к которой подключено устройство.

EnumUsbDrivesLetters - пост написан на русском языке, но содержит исходный код на C ++, поэтому вопрос может быть легко понят.

Ура, Андрей

1 голос
/ 22 ноября 2010

Windows возвращает DRIVE_FIXED для внешних жестких дисков USB и обычно возвращает DRIVE_REMOVABLE для флеш-накопителей USB.По этой причине, если вы хотите получить доступ к нескольким разделам во флэш-памяти, вы должны установить драйвер фильтра, чтобы сообщить Windows, что это не DRIVE_REMOVABLE, а DRIVE_FIXED.Windows только «видит» первый раздел на флеш-накопителях, что создает много проблем для пользователей ESXi, использующих загрузочную USB-флешку; -)

1 голос
/ 02 августа 2010

На самом деле окна нет, GetDriveType возвращает 3 (DRIVE_FIXED) для обоих моих жестких дисков USB.

0 голосов
/ 22 ноября 2010

http://en.wikipedia.org/wiki/SCSI_Pass_Through_Interface позволит вам отправлять необработанные команды SCSI на устройство - вы хотите отправить запрос или запрос смысла, чтобы узнать, что вы ищете. Однако гораздо лучшей альтернативой могут быть API-интерфейсы VDS, если они предоставят вам правильную информацию (я не уверен, будет ли это в этом случае)

0 голосов
/ 02 августа 2010

Тип привода в конечном итоге определяется драйверами; Не существует надежного способа определения того, что вы ищете.

Однако я могу сказать, что хотя я видел , когда USB-флешка возвращалась DRIVE_FIXED, никогда не видел нормальный возврат жесткого диска DRIVE_REMOVEABLE. Нельзя сказать, что это совершенно невозможно, но я никогда не видел этого.

Я бы сказал, что полагаться на эти два значения - самое близкое, что вы собираетесь получить.

...