ibug5299
驱动牛犊
驱动牛犊
  • 注册日期2005-03-19
  • 最后登录2006-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3141回复:9

如何读取ATA硬盘S.M.A.R.T状态信息

楼主#
更多 发布于:2005-03-19 18:35
现在已经知道如何在用户态下取得S.M.A.R.T信息,但是要求是需要在核心态里取得S.M.A.R.T信息,本人刚接触驱动开发,希望能得到大家的帮助。

以下简述用户态如何取得S.M.A.R.T信息
①打开设备\"\\\\\\\\.\\\\PhysicalDrive0\"
②发送DeviceIoControl(,SMART_SEND_DRIVE_COMMAND,,,)

核心态中如何实现上述①②两个步骤?或有其他方法可以取得S.M.A.R.T信息?
wjjssnew
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2011-04-12
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-20 18:29
    S.M.A.R.T信息保留在硬盘的系统保留区(service area)内,这个区域一般位于硬盘0物理面的最前面几十个物理磁道,由厂商写入相关内部管理程序。除了S.M.A.R.T信息表外还包括低级格式化程序、加密解密程序、自监控程序、自动修复程序等。监测软件通过一个名为“SMART RETURN STATUS”的命令(命令代码为:B0h)对S.M.A.R.T信息进行读取,且不允许最终用户对信息进行修改。

google找的 希望对你有帮助:_)
莫带有色眼镜看人!~
ibug5299
驱动牛犊
驱动牛犊
  • 注册日期2005-03-19
  • 最后登录2006-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-21 16:31
谢谢你的帮助,这些信息我也在google上找到过,现在想知道的是在kernal下的具体实现方法,因为在User mode下已经可以得到S.M.A.R.T.信息了

不过仍然谢谢你热心帮助我,谢谢
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-22 11:04
谢谢你的帮助,这些信息我也在google上找到过,现在想知道的是在kernal下的具体实现方法,因为在User mode下已经可以得到S.M.A.R.T.信息了

不过仍然谢谢你热心帮助我,谢谢

跟踪一下,看它往1f0-1f7端口中写什么,读什么?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
ibug5299
驱动牛犊
驱动牛犊
  • 注册日期2005-03-19
  • 最后登录2006-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-22 11:25

跟踪一下,看它往1f0-1f7端口中写什么,读什么?


有什么工具可以方便的监测吗?我自己做的程序中有对端口读写的功能,但是读了以后发现1f0-1f7读出的数据都是0xCC。

我手头有S.M.A.R.T的一份资料,0x1F4,0x1F5分别是Cylinder low和Cylinder high,可是通过端口读,读到的都是0xCC,头痛阿,觉得1f0-1f7应该不是端口地址,而是硬盘内的offset
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-03-22 15:03
[quote]
跟踪一下,看它往1f0-1f7端口中写什么,读什么?


有什么工具可以方便的监测吗?我自己做的程序中有对端口读写的功能,但是读了以后发现1f0-1f7读出的数据都是0xCC。

我手头有S.M.A.R.T的一份资料,0x1F4,0x1F5分别是Cylinder low和Cylinder high,可是通过端口读,读到的都是0xCC,头痛阿,觉得1f0-1f7应该不是端口地址,而是硬盘内的offset [/quote]
把你的资料作为附件发上来,我没有资料,只是从以前BIOS那里来的一些零星经验,觉得1f0-1f7可以肯定是端口地址,0x1F4,0x1F5分别是Cylinder low和Cylinder high,可是通过端口读,读到的都是0xCC,监测软件通过一个名为“SMART RETURN STATUS”的命令(命令代码为:B0h)对S.M.A.R.T信息进行读取,且不允许最终用户对信息进行修改。
先设置参数,这个我没有资料,但估计是你说的0x1F4,0x1F5分别是Cylinder low和Cylinder high,所以需要把你的资料发上来,我根据经验判断一下,然后必须先向端口写入命令,这里是B0h,据我的经验,1f6h写入主命令字节,1f7写入副命令字,最后才能读个状态端口,或依靠产生中断的方式,报告结果完成
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
ibug5299
驱动牛犊
驱动牛犊
  • 注册日期2005-03-19
  • 最后登录2006-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-03-22 15:28
附件是S.M.A.R.T.的命令,以及对应的格式等等,我现在利用的是API函数DeviceIoControl,具体如下

InParams.irDriveRegs.bCommandReg  = SMART_CMD;
InParams.irDriveRegs.bCylHighReg  = 0xC2;
InParams.irDriveRegs.bCylLowReg   = 0x4F;
InParams.irDriveRegs.bFeaturesReg = RETURN_SMART_STATUS;

ret = DeviceIoControl (
h_ata_ioctl,
SMART_SEND_DRIVE_COMMAND,
&InParams,
(sizeof(SENDCMDINPARAMS)-1),
&OutParams,
(sizeof(SENDCMDOUTPARAMS)-1+sizeof(IDEREGS)),
&dwBytes,
NULL );

使用API函数发送S.M.A.R.T.命令
ibug5299
驱动牛犊
驱动牛犊
  • 注册日期2005-03-19
  • 最后登录2006-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-03-22 15:31
忘记附件了
附件名称/大小 下载次数 最后更新
2005-03-22_8035R2_0.PDF (262KB)  42
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-03-22 16:27
回去看看,另外你现在用Softice的bpio捕获这几个端口,然后执行你的用户程序,看看对端口读写顺序,及写入的什么东东
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
ibug5299
驱动牛犊
驱动牛犊
  • 注册日期2005-03-19
  • 最后登录2006-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-03-22 16:51
谢谢,SoftIce没用过,研究研究去
游客

返回顶部