DeviceIoControl获取硬盘信息

该博客介绍了如何使用Windows API函数DeviceIoControl与CreateFile结合,获取物理驱动器的详细信息,包括设备描述、存储类型等。示例代码展示了如何枚举所有物理驱动器并打印产品ID和总线类型。

参考:DeviceIoControl 函数详细解析

BOOL WINAPI DeviceIoControl(
  _In_        HANDLE       hDevice,
  _In_        DWORD        dwIoControlCode,
  _In_opt_    LPVOID       lpInBuffer,
  _In_        DWORD        nInBufferSize,
  _Out_opt_   LPVOID       lpOutBuffer,
  _In_        DWORD        nOutBufferSize,
  _Out_opt_   LPDWORD      lpBytesReturned,
  _Inout_opt_ LPOVERLAPPED lpOverlapped
);
  • @param hDevice:设备句柄,通过CreateFile获得
  • @param dwIoControlCode:控制码,每个控制码都提供了lpInBuffer,nInBufferSize,lpOutBuffer和nOutBufferSize参数的使用细节
  • @param lpInBuffernInBufferSizelpOutBuffernOutBufferSize 根据控制码不同
  • lpBytesReturned 返回实际数据空间的大小,如果lpOutBuffer缓冲区大于实际缓冲区则lpBytesReturned 为实际缓冲区大小,如果lpOutBuffer缓冲区小于实际缓冲区则lpBytesReturned为lpOutBuffer缓冲区大小
  • @param lpOverlapped 基本不使用,直接NULL

通过CreateFile打开设备驱动程序的句柄时,应指定FILE_SHARE_READFILE_SHARE_WRITE访问标志。但是,当您打开通信资源(如串行端口)时,必须指定独占访问权限。FileName通常以如下形式:

文件名称含义
\\.\PhysicalDriveX获取物理驱动器X的信息,X以下标0开始计算
\\.\X:获取逻辑分区X的信息,例如C盘:\\.\C:
bool getDiskDesc(int index)
{
	TCHAR szDrvName[MAX_PATH] = _T("");
	_stprintf_s<MAX_PATH>(szDrvName, _T("\\\\.\\PhysicalDrive%d"), index);
	HANDLE hDevice = NULL;

	try
	{
		hDevice = CreateFile(szDrvName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
		if (hDevice == INVALID_HANDLE_VALUE)
		{
			return false;
		}
		DWORD dwOutBytes = 0;

		STORAGE_PROPERTY_QUERY Query;
		Query.PropertyId = StorageDeviceProperty;
		Query.QueryType = PropertyStandardQuery;

		std::string buf(1024, 0);
		BOOL bResult = ::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &Query, sizeof(Query), (char *)buf.data(), buf.capacity() - 1, &dwOutBytes, NULL);

		if (bResult)
		{
			PSTORAGE_DEVICE_DESCRIPTOR pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)buf.data();
			if (pDevDesc->Size >= buf.capacity())
			{
				buf.resize(pDevDesc->Size + 1);
				bResult = ::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &Query, sizeof(Query), (char *)buf.data(), buf.capacity() - 1, &dwOutBytes, NULL);
				if (!bResult)
				{
					CloseHandle(hDevice);
					return false;
				}
				pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)buf.data();
			}
			
			STORAGE_BUS_TYPE bsutype = pDevDesc->BusType;
			//char *SerialNumber = &buf[pDevDesc->SerialNumberOffset];
			//char *Vendor = &buf[pDevDesc->VendorIdOffset];
			if (pDevDesc->ProductIdOffset > 0)
			{
				char *ProductId = &buf[pDevDesc->ProductIdOffset];
				printf("DISK pId:%s,type:%d\r\n", ProductId, bsutype);
			}
			CloseHandle(hDevice);
			return true;
		}

	}
	catch (...)
	{
		
	}
	CloseHandle(hDevice);
	return false;
}

枚举所有物理驱动器信息

int nindex = 0;
	while (getDiskDesc(nindex++)){};

type 7:表示usb设备
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值