//传入参数path= "F:\\";
bool isUsbDrv(const wchar_t *path)
{//#include <winioctl.h>
//path: "\\\\?\\F:"
#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
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;
HANDLE hDisk;
STORAGE_DEVICE_DESCRIPTOR devDesc;
DWORD query[3]={0,0,1588180};
DWORD cbBytesReturned;
TCHAR szBuf[300];
wsprintf(szBuf,L"\\\\?\\%C:",path[0]);
hDisk = CreateFile(szBuf, GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
if(hDisk == INVALID_HANDLE_VALUE)
return false;
if(DeviceIoControl(hDisk, IOCTL_STORAGE_QUERY_PROPERTY, &query,sizeof(query),
&devDesc, sizeof(devDesc), &cbBytesReturned, NULL))
{
if(devDesc.BusType == BusTypeUsb)
{
CloseHandle(hDisk);
return true;
}
}
return false;
}