Windows-检测盘符是否为U盘

STORAGE_PROPERTY_QUERY结构体:

typedef  struct _STORAGE_PROPERTY_QUERY {
  STORAGE_PROPERTY_ID PropertyId;
  STORAGE_QUERY_TYPE QueryType;
  BYTE AdditionalParameters [1];
} STORAGE_PROPERTY_QUERY,* PSTORAGE_PROPERTY_QUERY;

用于保存将要查询的盘符设备的属性

STORAGE_DEVICE_DESCRIPTOR结构体:

typedef struct _STORAGE_DEVICE_DESCRIPTOR {
  DWORD            Version;
  DWORD            Size;
  BYTE             DeviceType;
  BYTE             DeviceTypeModifier;
  BOOLEAN          RemovableMedia;
  BOOLEAN          CommandQueueing;
  DWORD            VendorIdOffset;
  DWORD            ProductIdOffset;
  DWORD            ProductRevisionOffset;
  DWORD            SerialNumberOffset;
  STORAGE_BUS_TYPE BusType;
  DWORD            RawPropertiesLength;
  BYTE             RawDeviceProperties[1];
} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;

用于保存将要查询的盘符设备的详细信息,其中BusType用于保存盘符类型,用这个参数来判断是否是USB类型。

代码如下:

#include <windows.h>
#include <stdio.h>

#define BUFSIZE 1024

bool isUsb(TCHAR volumePath[]) {
    HANDLE deviceHandle = CreateFile(volumePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    STORAGE_PROPERTY_QUERY query;
    memset(&query, 0, sizeof(query));

    DWORD bytes;
    STORAGE_DEVICE_DESCRIPTOR devd;

    //STORAGE_BUS_TYPE用于记录结构,类型要初始化
    STORAGE_BUS_TYPE busType=BusTypeUnknown;

    if (DeviceIoControl(deviceHandle, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), &devd, sizeof(devd), &bytes, NULL)) {
        busType = devd.BusType;

    }
    CloseHandle(deviceHandle);
    return busType == BusTypeUsb;
}

int main() {
    TCHAR buf[BUFSIZE];
    HANDLE hVolume;
    UINT uNum = 0;
    //从C盘开始
    TCHAR volumePath[] = "\\\\.\\c:";
    bool ret;
    hVolume = FindFirstVolume(buf, BUFSIZE);
    if (hVolume == INVALID_HANDLE_VALUE) {
        printf(("No volume find\n"));
        return -1;
    }
    ret=isUsb(volumePath);
    printf("%s %d\n", volumePath, ret);
    while (FindNextVolume(hVolume, buf, BUFSIZE)) {
        volumePath[4] += 1;
        ret = isUsb(volumePath);
        printf("%s %d\n", volumePath, ret);
    }
    system("pause");
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值