2010-08-02 166 views
5

我试图在Windows上使用Win32 API区分USB闪存驱动器和USB硬盘驱动器。在Windows上区分USB闪存驱动器和USB硬盘驱动器

GetDriveType()函数将返回DRIVE_REMOVABLE如果驱动器是可移动的,和USB闪存驱动器当然可移动的。但我认为Windows可能会考虑USB硬盘驱动器(可惜我没有访问USB硬盘驱动器进行测试)。

在此先感谢。

+0

只是出于好奇,你为什么要这样做?你打算做一些不同的事情取决于它是什么类型的驱动器?正如其他人所说,DriveType不是很一致(尽管它可能“足够好”)。 – Luke 2010-08-03 13:47:09

回答

0

其实Windows不,GetDriveType返回3(DRIVE_FIXED)两个我的USB硬盘驱动器。

+0

没有开玩笑,谢谢。你的USB硬盘是普通硬盘,没有特殊的驱动设置或类似的东西,可能会导致Windows认为它们是DRIVE_FIXED而不是DRIVE_REMOVABLE? – user408962 2010-08-02 19:07:28

+0

它们只是标准的西部数字驱动器,而且我的Windows安装非常新,所以驱动程序前端的任何内容都不会改变默认设置。 – monoceres 2010-08-02 19:15:48

0

驱动器类型最终由驱动程序确定;没有安全的方法来做出你正在寻找的那种决心。

我能说的,但是,当我看到一个USB闪存盘回报DRIVE_FIXED,我也从来没有看到一个正常的硬盘驱动器的返回DRIVE_REMOVEABLE。这并不是说这完全不可能发生,但我从来没有见过。

我想说依靠这两个值可能是,你会得到最接近的一次。

+0

有趣的是,你说你看过一个闪存卡,并返回DRIVE_FIXED,正如我在阅读你的评论前几​​分钟发现的:http://social.msdn.microsoft。com/forums/zh-CN/embeddedwindowscomponents/thread/cfffc7b6-5679-46fc-a1c9-4c08228b7b47/ – user408962 2010-08-02 19:23:06

+0

它最终并不是由驱动程序决定的,因为驱动程序会根据设备报告的内容来确定它,但这并不总是一致的。 – 2010-11-22 17:59:14

1

Windows返回DRIVE_FIXED外接USB硬盘驱动器通常会返回DRIVE_REMOVABLE USB闪存棒。因为这个原因,如果你想访问闪存上的多个分区,你必须安装一个过滤驱动来告诉windows它不是DRIVE_REMOVABLE,而是DRIVE_FIXED。 Windows只会“看到”闪存盘上的第一个分区,从而给ESXi启动usb stick用户造成很多麻烦;-)

0

http://en.wikipedia.org/wiki/SCSI_Pass_Through_Interface将允许您将原始SCSI命令发送到设备 - 您想要发送INQUIRY或MODE SENSE找出你要找的东西。然而,一个更好的替代方案可能是VDS的API,它是否会为您提供正确的信息(我不知道它是否会在这种情况下)

1

如果要确定一个设备是USB设备,你可以打开其句柄并使用DeviceIoControl()发送IOCTL查询以获取设备连接的总线类型。

EnumUsbDrivesLetters - 后在俄罗斯,但它包含了C++源代码,所以这个问题可以很容易理解。

干杯, 舍甫琴科

+0

请不要复制粘贴多个问题的答案,链接到您自己的blogspot。这将被视为垃圾邮件。 – 2011-06-10 09:00:37

1
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// 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; 
} 
相关问题