当前位置: 首页 > news >正文

DeviceIoControl获取硬盘信息

参考: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设备
在这里插入图片描述

相关文章:

  • 47.全排列II | 90.子集II
  • 快鲸智慧楼宇系统在楼宇管理中发挥了哪些积极作用?
  • vsftp配置多用户
  • Self-supervised Video Transformer 阅读
  • ArcGisRuntime100.14绘制曲线
  • 榜一的蔑视!阿里专家手写Spring全家桶笔记,整2000页
  • 置业小技能:按揭相关事项
  • 存储更弹性,详解 Fluid “ECI 环境数据访问” 新功能
  • 高精度随流检测技术助力金融行业实现智能运维
  • windows上Qt5.15+openssl1.1.1+msvs2022静态编译32位版本的笔记
  • CentOS系统下,配制nginx访问favicon.ico
  • 1-十四烷基-3-甲基咪唑六氟磷酸盐([C14MIm][PF6])修饰纳米SiO2二氧化硅(mg级瓶装)
  • stm32f4xx-定时器
  • (过滤器)Filter和(监听器)listener
  • Java 并发编程解析 | 如何正确理解Java领域中的锁机制,我们一般需要掌握哪些理论知识?
  • [case10]使用RSQL实现端到端的动态查询
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 345-反转字符串中的元音字母
  • JavaScript创建对象的四种方式
  • Joomla 2.x, 3.x useful code cheatsheet
  • Laravel Telescope:优雅的应用调试工具
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • PermissionScope Swift4 兼容问题
  • STAR法则
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 关于字符编码你应该知道的事情
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 排序(1):冒泡排序
  • 深入浅出Node.js
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ![CDATA[ ]] 是什么东东
  • #include到底该写在哪
  • #NOIP 2014# day.1 T2 联合权值
  • $.ajax中的eval及dataType
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十八)SpringBoot之发送QQ邮件
  • (十一)图像的罗伯特梯度锐化
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET 回调、接口回调、 委托
  • .net 无限分类