16,472
社区成员
发帖
与我相关
我的任务
分享
WCHAR newDrive[256]; //改函数传递进来的参数是CHAR* drive,这里转换为WCHAR
memset(newDrive, 0, sizeof(newDrive));
MultiByteToWideChar(CP_ACP, 0, drive, strlen(drive)+1, newDrive, sizeof(newDrive)/sizeof(newDrive[0]));
_wsetlocale(LC_ALL, newDrive);
wprintf(L"%s", newDrive); //测试下转换是否正确,这里控制台显示结果"C:"而不是"C:/"
//----
hDevice = CreateFile(
newDrive, // drive to open
GENERIC_READ | GENERIC_WRITE, // access to the drive
FILE_SHARE_READ | FILE_SHARE_WRITE, //share mode
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL // do not copy file attribute
);
if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError()); //显示无法打开,错误5
return DWORD(-1);
}
#include <stdio.h>
#include <windows.h>
#include <winioctl.h>
#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE
#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef enum _STORAGE_QUERY_TYPE {
PropertyStandardQuery,
PropertyExistsQuery,
PropertyMaskQuery,
PropertyQueryMaxDefined
} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
typedef enum _STORAGE_PROPERTY_ID {
StorageDeviceProperty,
StorageAccessAlignmentProperty,
StorageAdapterProperty,
StorageDeviceIdProperty,
StorageDeviceUniqueIdProperty,
StorageDeviceWriteCacheProperty
} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
typedef struct _STORAGE_PROPERTY_QUERY {
STORAGE_PROPERTY_ID PropertyId;
STORAGE_QUERY_TYPE QueryType;
UCHAR AdditionalParameters[1];
} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
/*
typedef enum _STORAGE_BUS_TYPE {
BusTypeUnknown = 0x00,
BusTypeScsi = 0x1,
BusTypeAtapi = 0x2,
BusTypeAta = 0x3,
BusType1394 = 0x4,
BusTypeSsa = 0x5,
BusTypeFibre = 0x6,
BusTypeUsb = 0x7,
BusTypeRAID = 0x8,
BusTypeiScsi = 0x9,
BusTypeSas = 0xA,
BusTypeSata = 0xB,
BusTypeSd = 0xC,
BusTypeMmc = 0xD,
BusTypeVirtual = 0xE,
BusTypeFileBackedVirtual = 0xF,
BusTypeMax = 0x10,
BusTypeMaxReserved = 0x7F
} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
*/
typedef struct _STORAGE_DESCRIPTOR_HEADER {
ULONG Version;
ULONG Size;
} STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER;
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;
int main(int argc, char *argv[])
{
TCHAR szDrive[] = TEXT("\\\\.\\D:");
HANDLE hDevice = CreateFile(szDrive, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDevice != INVALID_HANDLE_VALUE)
{
DWORD dwResult = 0;
STORAGE_PROPERTY_QUERY spq = { 0 };
STORAGE_DESCRIPTOR_HEADER sdh = { 0 };
spq.PropertyId = StorageDeviceProperty;
spq.QueryType = PropertyStandardQuery;
BOOL bResult = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &spq, sizeof(spq), &sdh, sizeof(sdh), &dwResult, NULL);
if (bResult && (sdh.Size > 0))
{
STORAGE_DEVICE_DESCRIPTOR *sdd = LocalAlloc(LPTR, sdh.Size);
if (sdd != NULL)
{
bResult = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &spq, sizeof(spq), sdd, sdh.Size, &dwResult, NULL);
if (bResult)
{
// 7 代表 USB 即可移动磁盘
printf("[%s] => %d\n", szDrive, sdd->BusType);
}
LocalFree(sdd);
}
}
CloseHandle(hDevice);
}
return 0;
}
void HDDScan(void)
{
char drive[4];
drive[0] = 'a';
drive[1] = ':';
drive[2] = '\\';
drive[3] = 0;
int ret;
// scan the drives
for (drive[0] = 'a' ; drive[0] <= 'z' ; drive[0]++)
{
ret=GetDriveType (drive);
switch (ret)
{
case DRIVE_CDROM:{
printf("%s盘是DRIVE_CDROM\n",drive);
break;
}
case DRIVE_REMOVABLE:{
printf("%s盘是DRIVE_REMOVABLE\n",drive);
break;
}
case DRIVE_FIXED:{
printf("%s盘是DRIVE_FIXED\n",drive);
break;
}
case DRIVE_REMOTE:{
printf("%s盘是DRIVE_REMOTE\n",drive);
break;
}
case DRIVE_RAMDISK:{
printf("%s盘是DRIVE_RAMDISK\n",drive);
break;
}
case DRIVE_UNKNOWN:{
printf("%s盘是DRIVE_UNKNOWN\n",drive);
break;
}
}
}
}