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。完成以后测试,在不同类型的固态和机械硬盘上测试后发现都可以正常识别。看来偏差情况还是很少发生的。至此调查结束。

测试结果:


获取硬盘信息(c++代码实现)

  • 2008年09月13日 22:07
  • 7KB
  • 下载

C/C++ Windows API——获取磁盘信息

// LogicalDrive.cpp : Defines the entry point for the console application. //#include "stdafx.h" #in...
  • chy555chy
  • chy555chy
  • 2016年10月15日 00:07
  • 2231

windows 下C++获取磁盘信息笔记

windows下获取磁盘信息: 头文件为:windows.h 1、获取系统逻辑驱动的数量: 使用 GetLogicalDrives(void) 函数获取逻辑驱动的数量,函数返回一个32无符号整型...
  • koxiaozi1988
  • koxiaozi1988
  • 2017年08月30日 09:24
  • 409

SSD固态硬盘才装上确找不到盘怎么办-原来要初始化

原文地址::http://www.upantool.com/jiaocheng/ssd/2014/6263.html 相关文章 1\固态硬盘如何安装----http://jingyan.b...
  • xqhrs232
  • xqhrs232
  • 2016年07月30日 16:54
  • 7433

固态硬盘ssd的寿命如何计算,固态硬盘质量怎么检测?

固态硬盘ssd的寿命如何计算,固态硬盘质量怎么检测? ① 机械硬盘的寿命一般是用使用(通电)时间来计算的,比如500GB机械硬盘通电20000个小时。 ② 固态硬盘ssd 不能用通常的通电时...
  • chenchunlin526
  • chenchunlin526
  • 2017年01月23日 09:28
  • 9827

更换固态硬盘ssd后分区对拷系统拷贝复制

此教程用于笔记本添加固态ssd光驱的位置 然后拷贝复制原来的系统(当然也可以对调原来硬盘和光驱位置的硬顺序) 光盘托架淘宝购买 具体型号拆机教程请百度 具体思路可以理解为以下几个步骤  制...
  • wuxingpu5
  • wuxingpu5
  • 2017年05月08日 16:33
  • 1105

联想T430 安装msata接口的SSD固态硬盘

一、认识下mSATA SSD和 2.5英寸 SSD固态硬盘       目前固态硬盘有mSATA SSD和 2.5英寸 SSD固态硬盘。       1、mSATA SSD采用mSATA接口连接...
  • aoshilang2249
  • aoshilang2249
  • 2015年05月01日 16:11
  • 8667

固态硬盘与传统的机械硬盘的比较

固态硬盘(Solid State Drives),简称固盘,固态硬盘(Solid State Drive)用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。...
  • xingjiarong
  • xingjiarong
  • 2015年06月01日 17:12
  • 1543

固态硬盘寿命不长?!快来看看12个固态硬盘优化技巧

http://www.ipc.me/ying-pan-you-hua-ji-qiao.html SSD优化(固态硬盘优化)是如何优化的呢?相信许多人都对此一概不知,以下分享的是关于固态硬...
  • zzh_my
  • zzh_my
  • 2015年12月17日 22:09
  • 4725

固态硬盘与机械硬盘读取速度实测

Crucial M500 120GB SATA 6Gbps mSATA Internal SSD
  • pan_tian
  • pan_tian
  • 2014年08月23日 00:20
  • 26859
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows上判断磁盘是否为固态硬盘
举报原因:
原因补充:

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