C++ 获取U盘

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;
}```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值