• 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
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • @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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    枚举所有物理驱动器信息

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

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

  • 相关阅读:
    html中的爱心小特效。
    数学建模学习(82):模拟退火算法(SA,matlab版本)
    当添加一个键值对元素时,HashMap发生了什么?
    计算机毕业设计SSM电子学生证系统APP【附源码数据库】
    Socks5代理和代理IP
    小程序上新(2022.10.13~11.14)
    【软考 系统架构设计师】数据库系统⑦ 数据库的安全性与备份
    自动化测试练手项目推荐
    【SpringMVC】拦截器&JSR303的使用
    java计算机毕业设计ssm的KTV点歌系统(源码+系统+mysql数据库+Lw文档)
  • 原文地址:https://blog.csdn.net/CAir2/article/details/126668665