windows上判断磁盘是否为固态硬盘

原创 2015年07月09日 17:30:51

遇到这个问题的时候首先就将windows的几个直接获取磁盘相关信息的API函数给否决掉了,比如GetDiskType,返回类型只有几个,并且固态硬盘作为新生事物,这个多年前就存在的API应该是不可能有相关信息的。

下面就想到了WMI来获取磁盘的相关信息来判断,WMI获取的磁盘相关信息明显是多了很多,但是仔细到MSDN上查看相关的返回值,发现并没有可以作为判断依据的属性或者。本人也亲自实现了一下,发现果然是没有什么返回值可以给我们作为判断的依据。

下面我们到网上查了下相关的解决办法,http://bbs.csdn.net/topics/390412941里面有人提到,通过判断磁盘的转速来判断磁盘是不是固态硬盘BOOL

下面我通过DeviceIoControl函数获取了文章中所说的转速信息的word217所在的结构体的信息

// 向驱动发“IDENTIFY DEVICE”命令,获得设备信息 // hDevice: 设备句柄 // pIdInfo: 设备信息结构指针
BOOL IdentifyDevice(HANDLE hDevice, PIDINFO pIdInfo)
{
	PSENDCMDINPARAMS pSCIP; // 输入数据结构指针
	PSENDCMDOUTPARAMS pSCOP; // 输出数据结构指针
	DWORD dwOutBytes; // IOCTL输出数据长度
	BOOL bResult; // IOCTL返回值 // 申请输入/输出数据结构空间
	pSCIP = (PSENDCMDINPARAMS)::GlobalAlloc(LMEM_ZEROINIT, sizeof(SENDCMDINPARAMS) - 1);
	pSCOP = (PSENDCMDOUTPARAMS)::GlobalAlloc(LMEM_ZEROINIT, sizeof(SENDCMDOUTPARAMS) + sizeof(IDINFO) - 1); // 指定ATA/ATAPI命令的寄存器值 //
	pSCIP->irDriveRegs.bFeaturesReg = 0; //
	pSCIP->irDriveRegs.bSectorCountReg = 0; //
	pSCIP->irDriveRegs.bSectorNumberReg = 0; //
	pSCIP->irDriveRegs.bCylLowReg = 0; //
	pSCIP->irDriveRegs.bCylHighReg = 0; //
	pSCIP->irDriveRegs.bDriveHeadReg = 0; 
	pSCIP->irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY; // 指定输入/输出数据缓冲区大小 IDENTIFY DEVICE
	pSCIP->cBufferSize = 0; 
	pSCOP->cBufferSize = sizeof(IDINFO); //
	bResult = ::DeviceIoControl(hDevice, // 设备句柄
		DFP_RECEIVE_DRIVE_DATA, // 指定IOCTL
		pSCIP, sizeof(SENDCMDINPARAMS) - 1, // 输入数据缓冲区
		pSCOP, sizeof(SENDCMDOUTPARAMS) + sizeof(IDINFO) - 1, // 输出数据缓冲区
		&dwOutBytes, // 输出数据长度
		(LPOVERLAPPED)NULL); // 用同步I/O // 复制设备参数结构
	::memcpy(pIdInfo, pSCOP->bBuffer, sizeof(IDINFO)); // 释放输入/输出数据空间
	::GlobalFree(pSCOP); 
	::GlobalFree(pSCIP); 
	return bResult;
}
但是,我发现无论是机械硬盘还是固态硬盘word217都是0,也就是无返回

数据的结构体为IDENTIFY_DEVICE_DATA,该结构体本身很长,有兴趣的可以去查查看。

调查工作到这里就陷入僵局了,但是我发现在上文中,其中提过可以通过TRIM属性来判断是否是SSD属性。但是有可能出现偏差。因为早期的SSD和组成RAID的SSD没有TRIM属性。但是觉得总比什么都没有强吧,我就尝试着获取TRIM属性。获取属性其实和上面获取硬件信息是一样的都是通过函数DeviceIoControl.。只不过输入输出的结构体和IOCTL指令不同罢了,输入的结构体为STORAGE_PROPERTY_QUERY,输出的结构体为DEVICE_TRIM_DESCRIPTOR,IOCTL的指令为IOCTL_STORAGE_QUERY_PROPERTY。完成以后测试,在不同类型的固态和机械硬盘上测试后发现都可以正常识别。看来偏差情况还是很少发生的。至此调查结束。

测试结果:


相关文章推荐

利用MongoDB的SplitVector命令实现并发数据迁移

摘要: 背景 数据迁移是数据库运维中一个很常见的场景。数据迁移分为全量和增量。为了追求速度,通常我们会采用并发的方式对数据进行全量迁移。在全量导出数据时,通常都会选择做到记录级的并发,因此通常会涉及到...

spark集群安装和基本使用

spark官网下载地址:http://spark.apache.org/downloads.html 我下载的是1.6.3兼容hadoop2.4的版本spark-1.6.3-...

SSD(Solid StateDisk)和HDD(Hard Disk Driver) Simulator Research 固态硬盘和硬磁盘模拟器调研(修改)

抱歉,昨天写的关于硬盘模拟器的文章有错误,给大家造成了误解,不好意思,特此更正。 主要错误时Disksim3.0应该是模拟HDD的,而不是SSD的,要模拟SSD需要在Disksim3.0上集成SSD...
  • wyj7260
  • wyj7260
  • 2013年07月01日 10:27
  • 2572

Windows7下固态硬盘安装Linux Mint 18双系统

一.前言 Linux Mint是一种基于Ubuntu或Debian开发出的Linux桌面操作系统,于2006年开始发行,致力于为家庭用户和企业用户提供一个免费、高效、易用、高雅的桌面操作系统。目前...

系统迁移到固态硬盘的方法

  • 2017年10月26日 18:36
  • 11.81MB
  • 下载

正版win10系统重装(更换固态硬盘等操作)保持之前正版激活教程

首先把win10 系统更新到周年版以上,我的系统版本是1607在我之上的肯定都是周年版以上的了。 查看版本号在win+R 输入 winver 进行查看。 周年版应该是上线了一个 电脑系统与微软...

该图为硬件SSD固态硬盘图0

  • 2015年04月15日 14:00
  • 284KB
  • 下载

固态硬盘潜能释放器 v4.0.1.0最新版

  • 2015年09月25日 15:50
  • 11.56MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows上判断磁盘是否为固态硬盘
举报原因:
原因补充:

(最多只允许输入30个字)