5

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

如果驱动器是可移动的, GetDriveType()函数将返回 DRIVE_REMOVABLE,USB 闪存驱动器当然是可移动的。但我认为 Windows 可能也认为 USB 硬盘驱动器是可移动的(不幸的是,我无法访问 USB 硬盘驱动器来测试它)。

提前致谢。

4

7 回答 7

2
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  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;
}
于 2014-10-06T15:06:01.477 回答
2

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

EnumUsbDrivesLetters - 帖子是俄文的,但它包含 C++ 源代码,因此很容易理解。

干杯,安德烈

于 2011-06-10T07:28:30.340 回答
1

Windows 为外部 USB 硬盘返回 DRIVE_FIXED,通常为 USB 闪存棒返回 DRIVE_REMOVABLE。出于这个原因,如果您想访问闪存上的多个分区,您必须安装过滤器驱动程序来告诉 Windows 它不是 DRIVE_REMOVABLE 而是 DRIVE_FIXED。Windows 只能“看到”闪存棒上的第一个分区,这给 ESXi 引导 USB 棒用户带来了很多麻烦;-)

于 2010-11-22T17:21:15.200 回答
1

实际上 windows 没有,GetDriveType 为我的两个 USB 硬盘返回 3 (DRIVE_FIXED)。

于 2010-08-02T19:04:46.953 回答
1

我认为关键是驱动属性,例如气缸数。您可以使用 WMI 接口来确定此类信息。这是一个示例http://www.computerperformance.co.uk/vbscript/wmi_disks_physical.htm

于 2011-06-10T07:57:54.240 回答
0

驱动类型最终由驱动决定;没有万无一失的方法来做出您正在寻找的那种决心。

然而,我可以说,虽然我见过U 盘归还DRIVE_FIXED,但我从未见过正常的硬盘归还DRIVE_REMOVEABLE。这并不是说完全不可能发生这种情况,但我从未见过。

我想说依靠这两个值可能是您将获得的最接近的值。

于 2010-08-02T19:12:30.447 回答
0

http://en.wikipedia.org/wiki/SCSI_Pass_Through_Interface将允许您向设备发送原始 SCSI 命令 - 您想要发送 INQUIRY 或 MODE SENSE 以找出您要查找的内容。但是,一个更好的选择可能是 VDS API,如果它可以为您提供正确的信息(我不确定在这种情况下是否会)

于 2010-11-22T17:57:24.493 回答