当前位置: 首页 > 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领域中的锁机制,我们一般需要掌握哪些理论知识?
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • JWT究竟是什么呢?
  • Linux gpio口使用方法
  • overflow: hidden IE7无效
  • PV统计优化设计
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • windows-nginx-https-本地配置
  • 关于springcloud Gateway中的限流
  • 后端_ThinkPHP5
  • 区块链共识机制优缺点对比都是什么
  • 使用Gradle第一次构建Java程序
  • 思维导图—你不知道的JavaScript中卷
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 《天龙八部3D》Unity技术方案揭秘
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #define,static,const,三种常量的区别
  • #数学建模# 线性规划问题的Matlab求解
  • #微信小程序:微信小程序常见的配置传值
  • %@ page import=%的用法
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (C语言)fgets与fputs函数详解
  • (三)Honghu Cloud云架构一定时调度平台
  • (一)RocketMQ初步认识
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .net 获取url的方法
  • .net 流——流的类型体系简单介绍
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .net访问oracle数据库性能问题
  • .net分布式压力测试工具(Beetle.DT)
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @RestControllerAdvice异常统一处理类失效原因
  • [20180224]expdp query 写法问题.txt
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [Android 13]Input系列--获取触摸窗口