typedef struct _u_disk_info
{
bool u_disk;
unsigned long device_number;
std::vector<char> label;
std::wstring friendly_name;
}u_disk_info;
std::vector<u_disk_info> get_u_disk_info()
{
std::vector<u_disk_info> ret;
HDEVINFO dev = SetupDiGetClassDevsW(&GUID_DEVINTERFACE_DISK, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (dev != INVALID_HANDLE_VALUE)
{
SP_DEVINFO_DATA dev_info{ 0 };
dev_info.cbSize = sizeof(dev_info);
for (int i = 0; SetupDiEnumDeviceInfo(dev, i, &dev_info); i++)
{
u_disk_info info;
wchar_t buf[512]{ 0 };
BOOL b = SetupDiGetDeviceRegistryPropertyW(dev, &dev_info, SPDRP_FRIENDLYNAME, 0, (LPBYTE)buf, 512 * sizeof(wchar_t), 0);
if (!b) continue;
info.friendly_name = buf;
int index = 0;
DWORD length = 0;
PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)VirtualAlloc(0, 1024, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (pdidd)
{
pdidd->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SP_DEVICE_INTERFACE_DATA did{ 0 };
did.cbSize = sizeof(did);
while (true)
{
if (!SetupDiEnumDeviceInterfaces(dev, &dev_info, &GUID_DEVINTERFACE_DISK, index++, &did)) break;
if (!SetupDiGetDeviceInterfaceDetailW(dev, &did, pdidd, 1024, 0, 0)) break;
HANDLE h = CreateFileW(pdidd->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (h != INVALID_HANDLE_VALUE)
{
STORAGE_DEVICE_NUMBER sdn{ 0 };
if (DeviceIoControl(h, IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, &sdn, sizeof(sdn), 0, 0))
{
info.device_number = sdn.DeviceNumber;
for (char c = 'a'; c <= 'z'; c++)
{
char drive[20]{ 0 };
sprintf_s(drive, "\\\\.\\%c:", c);
HANDLE dri = CreateFileA(drive, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (dri != INVALID_HANDLE_VALUE)
{
if (DeviceIoControl(dri, IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, &sdn, sizeof(sdn), 0, 0) && info.device_number == sdn.DeviceNumber)
{
sprintf_s(drive, "%c:", c);
info.u_disk = GetDriveTypeA(drive) == DRIVE_REMOVABLE;
info.label.push_back(c);
}
CloseHandle(dri);
}
}
ret.push_back(info);
}
CloseHandle(h);
}
}
VirtualFree(pdidd, 0, MEM_RELEASE);
}
}
SetupDiDestroyDeviceInfoList(dev);
}
return ret;
}```
C++ 获取U盘
最新推荐文章于 2023-07-31 10:11:01 发布