SMART 数据储存于 WMI 中 ROOT\WMI\MSStorageDriver_ATASmartData 命名空间中,其中属性 'VendorSpecific' 包含有硬盘温度的数据,这是ATA标准定义的。这是一个结构大小为512字节,第一个和第二个字节代表 SMART 版本信息,从第三个字节起定义 SMART 的属性,每个属性为12字节长,每个属性的第一字节为当前属性定义,0x09 定义已经使用的小时数, 0xc2 为温度属性,第五字节表示当前温度。

本人尚处学习阶段,如有不足或错误之处,欢迎指出。

头文件:#include <stdio.h>
#include <windows.h>
#include <WinIoCtl.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>#define MAX_ATTRIBUTE 30bool Getsmart(int driver);
void capacity(char* model_buf, char* sn_buf, char* fw_buf);
void GetDisksmart(WORD count,DWORD driver, CHAR *modelNumber, CHAR *sn_buf, CHAR * fw_buf );
void    ChangeByteOrder(PCHAR szString, USHORT uscStrSize);#pragma pack (1)
typedef struct ATA_IDENTIFY_DEVICE
{WORD        GeneralConfiguration;                    //0WORD        LogicalCylinders;                        //1    ObsoleteWORD        SpecificConfiguration;                    //2WORD        LogicalHeads;                            //3 ObsoleteWORD        Retired1[2];                            //4-5WORD        LogicalSectors;                            //6 ObsoleteDWORD        ReservedForCompactFlash;                //7-8WORD        Retired2;                                //9CHAR        SerialNumber[20];                        //10-19WORD        Retired3;                                //20WORD        BufferSize;                                //21 ObsoleteWORD        Obsolute4;                                //22CHAR        FirmwareRev[8];                            //23-26CHAR        Model[40];                                //27-46WORD        MaxNumPerInterupt;                        //47WORD        Reserved1;                                //48WORD        Capabilities1;                            //49WORD        Capabilities2;                            //50DWORD        Obsolute5;                                //51-52WORD        Field88and7064;                            //53WORD        Obsolute6[5];                            //54-58WORD        MultSectorStuff;                        //59DWORD        TotalAddressableSectors;                //60-61WORD        Obsolute7;                                //62WORD        MultiWordDma;                            //63WORD        PioMode;                                //64WORD        MinMultiwordDmaCycleTime;                //65WORD        RecommendedMultiwordDmaCycleTime;        //66WORD        MinPioCycleTimewoFlowCtrl;                //67WORD        MinPioCycleTimeWithFlowCtrl;            //68WORD        Reserved2[6];                            //69-74WORD        QueueDepth;                                //75WORD        SerialAtaCapabilities;                    //76WORD        SerialAtaAdditionalCapabilities;        //77WORD        SerialAtaFeaturesSupported;                //78WORD        SerialAtaFeaturesEnabled;                //79WORD        MajorVersion;                            //80WORD        MinorVersion;                            //81WORD        CommandSetSupported1;                    //82WORD        CommandSetSupported2;                    //83WORD        CommandSetSupported3;                    //84WORD        CommandSetEnabled1;                        //85WORD        CommandSetEnabled2;                        //86WORD        CommandSetDefault;                        //87WORD        UltraDmaMode;                            //88WORD        TimeReqForSecurityErase;                //89WORD        TimeReqForEnhancedSecure;                //90WORD        CurrentPowerManagement;                    //91WORD        MasterPasswordRevision;                    //92WORD        HardwareResetResult;                    //93WORD        AcoustricManagement;                    //94WORD        StreamMinRequestSize;                    //95WORD        StreamingTimeDma;                        //96WORD        StreamingAccessLatency;                    //97DWORD        StreamingPerformance;                    //98-99ULONGLONG    MaxUserLba;                                //100-103WORD        StremingTimePio;                        //104WORD        Reserved3;                                //105WORD        SectorSize;                                //106WORD        InterSeekDelay;                            //107WORD        IeeeOui;                                //108WORD        UniqueId3;                                //109WORD        UniqueId2;                                //110WORD        UniqueId1;                                //111WORD        Reserved4[4];                            //112-115WORD        Reserved5;                                //116DWORD        WordsPerLogicalSector;                    //117-118WORD        Reserved6[8];                            //119-126WORD        RemovableMediaStatus;                    //127WORD        SecurityStatus;                            //128WORD        VendorSpecific[31];                        //129-159    WORD        CfaPowerMode1;                            //160WORD        ReservedForCompactFlashAssociation[7];    //161-167WORD        DeviceNominalFormFactor;                //168WORD        DataSetManagement;                        //169WORD        AdditionalProductIdentifier[4];            //170-173WORD        Reserved7[2];                            //174-175CHAR        CurrentMediaSerialNo[60];                //176-205WORD        SctCommandTransport;                    //206WORD        ReservedForCeAta1[2];                    //207-208WORD        AlignmentOfLogicalBlocks;                //209DWORD        WriteReadVerifySectorCountMode3;        //210-211DWORD        WriteReadVerifySectorCountMode2;        //212-213WORD        NvCacheCapabilities;                    //214DWORD        NvCacheSizeLogicalBlocks;                //215-216WORD        NominalMediaRotationRate;                //217WORD        Reserved8;                                //218WORD        NvCacheOptions1;                        //219WORD        NvCacheOptions2;                        //220WORD        Reserved9;                                //221WORD        TransportMajorVersionNumber;            //222WORD        TransportMinorVersionNumber;            //223WORD        ReservedForCeAta2[10];                    //224-233WORD        MinimumBlocksPerDownloadMicrocode;        //234WORD        MaximumBlocksPerDownloadMicrocode;        //235WORD        Reserved10[19];                            //236-254WORD        IntegrityWord;                            //255

}ATA_IDENTIFY_DEVICE ;typedef struct NVME_IDENTIFY_DEVICE{CHAR        Reserved1[4];CHAR        SerialNumber[20];CHAR        Model[40];CHAR        FirmwareRev[8];CHAR        Reserved2[9];CHAR        MinorVersion;SHORT        MajorVersion;CHAR        Reserved3[428];}NVME_IDENTIFY_DEVICE;union IDENTIFY_DEVICE{ATA_IDENTIFY_DEVICE  A;NVME_IDENTIFY_DEVICE N;};typedef    struct _SMART_ATTRIBUTE    //smart属性
{BYTE    Id;WORD    StatusFlags;BYTE    CurrentValue;BYTE    WorstValue;BYTE    RawValue[6];BYTE    Reserved;
} SMART_ATTRIBUTE;typedef struct ATA_SMART_INFO
{IDENTIFY_DEVICE   identifydevice;SMART_ATTRIBUTE    Attribute[MAX_ATTRIBUTE];BYTE                SmartReadData[512];}ATA_SMART_INFO;#pragma pack ()

#include "h.h"
void capacity(char* model_buf, char* sn_buf, char* fw_buf)
{WORD count = 0;DWORD dw ;DWORD dwSize = MAX_PATH;DWORD driver = 0; char szLogicalDrives[MAX_PATH] = {0}; //缓冲区DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);  //获取逻辑驱动器号字符串//获取驱动器数dw = GetLogicalDrives();while( dw != 0 ){if((dw&1) != 0){count++;}dw>>=1;}printf("驱动器个数:%d\n",count);printf("------------------------------\n");//处理获取到的结果if (dwResult > 0 && dwResult <= MAX_PATH) {char* szSingleDrive = szLogicalDrives;  //从缓冲区起始地址开始while(*szSingleDrive) {printf("Drive: %s  ", szSingleDrive);   //输出单个驱动器的驱动器号printf("\n");GetDisksmart(count,driver, model_buf, sn_buf, fw_buf);Getsmart(driver);driver++;// 获取下一个驱动器号起始地址szSingleDrive += strlen(szSingleDrive) + 1;}}}

#include "h.h"const WORD IDE_ATAPI_IDENTIFY = 0xA1;   // 读取ATAPI设备的命令
const WORD IDE_ATA_IDENTIFY   = 0xEC;   // 读取ATA设备的命令
const int DISK_PATH_LEN = 128;
const int DISK_INFO_BUF_LEN = 128;void ChangeByteOrder(PCHAR szString, USHORT uscStrSize)
{USHORT i;CHAR temp;for (i = 0; i < uscStrSize; i+=2){temp = szString[i];szString[i] = szString[i+1];szString[i+1] = temp;}
}void GetDisksmart(WORD count,DWORD driver, CHAR *modelNumber, CHAR *sn_buf, CHAR * fw_buf )
{// CHAR sFilePath[DISK_PATH_LEN] ;BOOL result;                 // results flagDWORD readed;                   // discard results
    HANDLE hDevice;char sFilePath[255] ;while(driver!=count){      //循环sprintf(sFilePath, "\\\\.\\PhysicalDrive%d", driver);hDevice = CreateFile(sFilePath, // drive to openGENERIC_READ | GENERIC_WRITE,//  GENERIC_READ|GENERIC_WRITE ,     // access to the driveFILE_SHARE_READ| FILE_SHARE_WRITE , //share modeNULL,             // default security attributesOPEN_EXISTING,    // disposition0,                // file attributesNULL            // do not copy file attribute
                    );if (hDevice == INVALID_HANDLE_VALUE){printf("无法识别序列号等信息");//printf("------------------------------\n");break;//fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError());// return (DWORD)-1;
    }GETVERSIONINPARAMS gvopVersionParams;result = DeviceIoControl(hDevice,  SMART_GET_VERSION,   //控制码
                                   NULL,0,&gvopVersionParams,   // 输出数据缓冲区指针sizeof(gvopVersionParams),   // 输出数据缓冲区指针长度&readed,                    // 输出数据实际长度单元长度
                                   NULL);if (!result)        //fail
    {printf("无法识别序列号等信息\n");//printf("------------------------------\n");break;// fprintf(stderr, "SMART_GET_VERSION Error: %ld\n", GetLastError());// (void)CloseHandle(hDevice);// return (DWORD)-1;
    }if(0 == gvopVersionParams.bIDEDeviceMap){printf("无法识别序列号等信息\n");//printf("------------------------------\n");break;//return (DWORD)-1;
    }// IDE or ATAPI IDENTIFY cmd
    BYTE btIDCmd;SENDCMDINPARAMS inParams;    // IDE设备IOCTL输入数据结构BYTE nDrive =0;btIDCmd = (gvopVersionParams.bIDEDeviceMap >> nDrive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;  // 输出 structure BYTE outParams[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];   // + 512 - 1//fill in the input bufferinParams.cBufferSize = 0;        // 缓冲区字节数   //or IDENTIFY_BUFFER_SIZE ?inParams.irDriveRegs.bFeaturesReg = READ_ATTRIBUTES;     // irDriveRegs :IDE寄存器组  inParams.irDriveRegs.bSectorCountReg = 1;inParams.irDriveRegs.bSectorNumberReg = 1;inParams.irDriveRegs.bCylLowReg = 0;inParams.irDriveRegs.bCylHighReg = 0;inParams.irDriveRegs.bDriveHeadReg = (nDrive & 1) ? 0xB0 : 0xA0;inParams.irDriveRegs.bCommandReg = btIDCmd;//inParams.bDriveNumber = nDrive;//get the attributesresult = DeviceIoControl(hDevice,SMART_RCV_DRIVE_DATA,&inParams,sizeof(SENDCMDINPARAMS) - 1,outParams,sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,&readed,NULL);if (!result)        //获取失败
    {printf("无法识别序列号等信息\n");break;//fprintf(stderr, "SMART_RCV_DRIVE_DATA Error: %ld\n", GetLastError());//(void)CloseHandle(hDevice);// return (DWORD)-1;
    }(void)CloseHandle(hDevice);ATA_IDENTIFY_DEVICE * ip  = (ATA_IDENTIFY_DEVICE *)((SENDCMDOUTPARAMS*)outParams)->bBuffer ;  //ip指向获取的硬盘信息// 固件memset(fw_buf, 0, 8);memcpy(fw_buf, ip->FirmwareRev, 8);fw_buf[8] = '\0';ChangeByteOrder(fw_buf, 8);printf("\n->固  件: %s", fw_buf);// 型号memset(modelNumber, 0, 40);memcpy(modelNumber, ip->Model, 40);modelNumber[40] = '\0';ChangeByteOrder(modelNumber, 40);printf("\n->型  号: %s", modelNumber);// 序列号memset(sn_buf, 0, 20);memcpy(sn_buf, ip->SerialNumber+12, 12);sn_buf[12] = '\0';ChangeByteOrder(sn_buf,20);printf("\n->序列号: %s\n", sn_buf);//  printf("------------------------------\n");break;}  //    return 0;
}

#include "h.h"

bool Getsmart(int driver)
{
// CHAR sFilePath[DISK_PATH_LEN] ;
BOOL result; //DeviceIoControl返回值
DWORD readed;
HANDLE hDevice; //文件句柄

char sFilePath[255];
sprintf(sFilePath, "\\\\.\\PhysicalDrive%d", driver);
hDevice = CreateFile(
sFilePath, // drive to open
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ| FILE_SHARE_WRITE ,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hDevice == INVALID_HANDLE_VALUE)
{

fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError());
return false;
}

// 输出 structure
STORAGE_PREDICT_FAILURE spf = {0};

result = DeviceIoControl(
hDevice,
IOCTL_STORAGE_PREDICT_FAILURE, //控制码
&spf,
sizeof(spf) ,
&spf,
sizeof(spf) ,
&readed,
NULL);
if (!result) //fail
{

fprintf(stderr, "SMART_RCV_DRIVE_DATA Error: %ld\n", GetLastError());
(void)CloseHandle(hDevice);
printf("------------------------------\n");
return false;
}

(void)CloseHandle(hDevice);
ATA_SMART_INFO asi;
memcpy_s(&(asi.SmartReadData), 512, &(spf.VendorSpecific), 512);

int j = 0;
for(int i = 0; i < MAX_ATTRIBUTE; i++)
{
char buf[sizeof(WORD)+1];
int sum=0,y=1,count=1, x=0;
//DWORD rawValue = 0;

memcpy( &(asi.Attribute[j]),
&(asi.SmartReadData[i * sizeof(SMART_ATTRIBUTE) + 2]), sizeof(SMART_ATTRIBUTE));

if(asi.Attribute[j].Id != 0)
{
switch(asi.Attribute[j].Id)
{
case 0x09: // Power on Hours

printf(" ID: 09 通电时间 : ");

for(int k =0;k<=6;k++){
itoa((int)asi.Attribute[j].RawValue[k],buf,16); //转换为十六进制

for(x=sizeof(WORD)-1;x>=0;x--){

if(buf[x]!=0)
switch(buf[x])
{
case 'a':
sum=sum+10*y; y*=16; break;
case 'b':
sum=sum+11*y; y*=16; break;
case 'c':
sum=sum+12*y; y*=16;break;
case 'd':
sum=sum+13*y; y*=16; break;
case 'e':
sum=sum+14*y; y*=16;break;
case 'f':
sum=sum+15*y; y*=16; break;
default :
sum=sum+((int)buf[x]-48)*y; y*=16;break; //不能转化为WORD,而要使用int
};

}
}
printf("%d 小时\n ",sum);
sum=0;y=1;x=0;
break;

case 0x0C: // Power On Count

printf("ID: 0c 通电次数 : ");
for(int k =0;k<=6;k++){

itoa((WORD)asi.Attribute[j].RawValue[k],buf,16); //转换为十六进制

for(x=sizeof(WORD)-1;x>=0;x--){

if(buf[x]!=0)
switch(buf[x])
{
case 'a':
sum=sum+10*y; y*=16; break;
case 'b':
sum=sum+11*y; y*=16; break;
case 'c':
sum=sum+12*y; y*=16;break;
case 'd':
sum=sum+13*y; y*=16; break;
case 'e':
sum=sum+14*y; y*=16;break;
case 'f':
sum=sum+15*y; y*=16; break;
default :
sum=sum+((int)buf[x]-48)*y; y*=16;break;
};

}
}
printf("%d 小时\n ",sum);
sum=0;y=1;x=0;
break;

case 0xC2: // Temperature
printf("ID: c2 温 度 : ");
printf("%d ℃\n",(WORD)asi.Attribute[j].RawValue[0]);
break;

default:
break;
}
j++;
}
}
printf("------------------------------\n");
return true;
}

#include "h.h"int main()
{char model_buf[40+1], sn_buf[20+1], fw_buf[8+1];capacity( model_buf, sn_buf, fw_buf);// Getsmart();
  getchar();return 0;
}

转载于:https://www.cnblogs.com/ziqiu/p/10696675.html

获取硬盘的smart信息相关推荐

  1. 硬盘的Smart信息说明

    SMART是硬盘的自动检测.分析.扫描及报告技术. 它将会监测硬盘信息,在硬盘故障前向你提出警告.很明显,你的硬盘已经向你提出警告了. 如果你的计算机属于菜鸟级别,就尽快备份重要信息,更换硬盘:如果水 ...

  2. linux识别硬盘位置,Linux下读取硬盘的smart信息

    Dell服务器之下,还不能直接通过smartctl /dev/sd*读取到磁盘的smart信息,因为Raid卡又包了一层.可以先使用 [root@localhost ~]# smartctl --sc ...

  3. smart gesture安装失败_手把手,嘴对嘴,讲解硬盘SMART信息

    SMART信息概览 很多同学都知道,查看硬盘的健康状态,最简单.最直接的办法是查看硬盘的SMART信息. 比如以下信息: linux下使用SMARTCTL工具查看 Windows下使用CrystalD ...

  4. java获取服务器信息返回前端,java程序获取linux服务器进程信息

    搜索了很多关于获取Linux的信息,但是没有发现获取linux服务器的进程信息详细说明. 在这里求解一下,能否在java代码中实现读取代码执行的本机linux服务器中的进程信息? 该问题又分为三个小问 ...

  5. windows系统下,获取固态U盘、固态硬盘SMART信息的小工具-CrystalDiskInfo

    SMART全称为"Self-Monitoring Analysis and Reporting Technology",即"自我监测.分析及报告技术",是一种自 ...

  6. Go-使用wmi获取硬盘smart信息并解析

    import ("fmt""strconv""github.com/StackExchange/wmi" )const (Power_On_ ...

  7. nagios通过python获取ESXi硬盘SMART信息

    ESXi可以在相关面板上看见smart信息, 我这边公司用的是组装的服务器,然后不支持,只好用SSH的办法去获取了. Nagios监控是按退出的状态代码来显示相关信息的. 退出代码如下: 0 ok; ...

  8. 硬盘SMART信息数据结构

    在Windows环境下我知道有两种方法可以读取硬盘SMART信息:一是通过DeviceIoControl这个Win API,还有就是通过wql语句查询.这两种方法已经在网上被说烂,本文主要要记录一个找 ...

  9. python硬盘api-使用python获取电脑的磁盘信息方法

    使用Python获取电脑的磁盘信息需要借助于第三方的模块psutil,这个模块需要自己安装,纯粹的CPython下面不具备这个功能. 在iPython交互界面中进行如下演示: 查看电脑的磁盘分区: I ...

最新文章

  1. struts.xml配置文件中result的语法
  2. 关于Spring Cloud 框架热部署的方法
  3. python【数据结构与算法】棋盘覆盖问题
  4. Spark- 使用第三方依赖解析IP地址
  5. 2.8 Adam 优化算法-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  6. 控件(View)之TextSwitcher, Gallery, ImageSwitcher, GridView, ListView, ExpandableList【转】
  7. 【英语学习】【WOTD】disparage 释义/词源/示例
  8. SpringBoot的Bean之@ConditionalOnBean与@ConditionalOnClass
  9. VMware vSAN 技术详解 | 周末送资料
  10. SpringMVC-@RequestMapping的参数和用法
  11. ESFramework Demo -- P2P通信Demo(附源码)
  12. 【FFMEPG】windows下编译ffmpeg2.5——使用VS2013,ARMLINUX,ANDORID编译ffmpeg
  13. Android 英文文档下载地址
  14. Kubernetes 小白学习笔记(18)--集群存储-volume、PV、PVC
  15. ArmLinux BOOTLOADER全程详解
  16. 用acdsee制作html,ACDsee教程:ACDSee的HTML相册生成
  17. 通过笔记本wifi共享到以太网接口方法--使用嵌入式设备接入互联网
  18. android三星打印插件,三星打印服务插件 Samsung Print Service for Android
  19. 空气能热水器的优惠价格在哪里找?
  20. java中文转拼音_java中文转拼音

热门文章

  1. MCGS 根据时间实现动态密码进行登陆
  2. 保存在线阅读文件到本地的方法
  3. matlab求二阶电路图,MATLAB实验MATLAB数值计算:二阶电路时域研究
  4. 张益唐被曝已证明黎曼猜想相关问题,震动数学界(文末送书)
  5. openwrt 抓取流量包
  6. Tableau数据源(一)-引入数据源
  7. C++:符合RFC1321规范的MD5计算C++实现
  8. SafeNet在软件保护与授权领域有三大知名品牌
  9. 利用BrainTree自定义UI绑定信用卡及Paypal
  10. Python爬虫:爬了7天的斗鱼,我们来看一下主播们的真实现状