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");
}