参考: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设备

DeviceIoControl获取硬盘信息相关推荐

  1. 计算机无法正确抓取硬盘信息,获取硬盘信息失败?2招轻松解决,u盘装系统就这么简单!...

    原标题:获取硬盘信息失败?2招轻松解决,u盘装系统就这么简单! U盘装系统是近来经常听到的一个词汇,现在的人都不再像以前那样事事花钱请人,能自己动手的决不多啰嗦.况且u盘装系统确实也不是个技术含量很高 ...

  2. python 获取硬盘信息失败请谨慎操作_【裸机装系统】获取硬盘信息失败,请谨慎操作!(示例代码)...

    公司新买了两台服务器,需要安装操作系统. 我在安装其中一台进PE时,提示"获取硬盘信息失败,请谨慎操作!" 研究了半天,网上说是因为磁盘设置了RAID,于是我把RAID删除.按CT ...

  3. python 获取硬盘信息失败请谨慎操作_【裸机装系统】获取硬盘信息失败,请谨慎操作!...

    公司新买了两台服务器,需要安装操作系统. 我在安装其中一台进PE时,提示"获取硬盘信息失败,请谨慎操作!" 研究了半天,网上说是因为磁盘设置了RAID,于是我把RAID删除.按CT ...

  4. python 获取硬盘信息失败请谨慎操作_大白菜U盘装系统提示获取硬盘信息失败怎么办?...

    相信不少的用户在使用u盘装系统的时候都有遇到过获取硬盘信息失败的提示导致安装不了,出现这个问题主要是由于硬盘模式与当前pe系统不兼容所导致,那么该怎么解决这个问题呢?接下来就和小编一起来看一下u盘装系 ...

  5. Linux c获取硬盘信息

    在linux系统中为获取磁盘的剩余空间大小或者其他的一些硬盘信息,可以通过以下两种方式获取:直接在终端通过指令获取或者通过linux c编程获取硬盘的信息结构体. 一.指令获取 打开终端,在终端输入: ...

  6. 获取linux命令硬盘信息,Linux 下使用命令获取硬盘信息

    本文主要是一些和硬盘相关的命令,包括如何查看硬盘的型号,容量,还有硬盘上的分区情况,来详细了解本机硬盘的状态. hdparm 如果想要在 Linux 下查看硬盘信息,可以使用命令 hdparm .这个 ...

  7. “获取硬盘信息失败,请谨慎操作”的解决方案

    是自己误打误撞搞定了,百度上的经验.知道啥的,都不太靠谱, 首先还是先进入 BIOS,可以试试切换 SATA Mode Section 里面的 IDE(性能一般) 和AHCI (性能较好)的选项重启试 ...

  8. 获取硬盘信息失败 请谨慎操作 的解决方案

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 是自己误 ...

  9. python 获取硬盘信息失败请谨慎操作_重装系统显示:获取硬盘信息失败,请谨慎操作...

    展开全部 一般出e5a48de588b662616964757a686964616f31333433656663现这种情况,可能的原因有两个,一个是硬盘本身存在故障,另一个是硬盘模式有点问题. 排查: ...

最新文章

  1. 从初创公司的角度来看微服务
  2. java form action 参数_java发起form请求(有参数,无参数)
  3. 《Debug Hacks》和调试技巧【转】
  4. hadoop 计算几点 主节点_01-Hadoop的介绍
  5. html css实现登录注册页面,基于HTML5+css+JS_的精美登陆注册界面
  6. SIEM部署失败的五大原因
  7. 期待!华为或在今年8月/9月推出自家操作系统
  8. 新冠疫情,或加速银行数字化服务转型
  9. 一篇google developer 安全介绍的翻译
  10. 尔雅 科学通史(吴国盛) 个人笔记及课后习题 2018 第四章 中国独立发展的科技文明
  11. 直线插补和圆弧插补的区别
  12. 鸿蒙系统图标大小怎么调节,华为手机桌面图标大小怎么调?用华为手机的朋友这些技巧需要了解...
  13. [转载]从KX、KR用户的购镜选择谈到K5和其他
  14. 如何在手机下载微博APP中视频?【最新有效方法】
  15. macOS Monterey 12.6.1 (21G217) 正式版 ISO、IPSW、PKG 下载
  16. 产品冷思考:大而全or小而美如何选择?
  17. AI+教育 I 69天流利说APP学习浅谈自适应学习
  18. 不会编辑图片大小?这几个软件你快码住
  19. 兄弟7360清零后无法传真、扫描的故障,变成英文
  20. html+css+js 制作表白翻页相册

热门文章

  1. fineui mysql_FineUI配置文件
  2. javascript常用到的东西(珍藏)
  3. 离散数学_谓词公式的范式与谓词推演
  4. 简单快速过一遍分支语句和循环语句
  5. cp提示overwrite
  6. 计算机网络01:因特网概述、三种交换方式、计算机网络定义和分类、计算机网络的性能指标、计算机网络体系结构
  7. 记一次装机——笔记本UEFI双硬盘(SSD+机械)双系统(Win10+Linux Mint)
  8. JAVA之读取二进制文件
  9. 基于TensorFlow的SSD车辆检测-1
  10. Excel VBA 利用FileSystemObject处理文件