阅读:3141回复:9
如何读取ATA硬盘S.M.A.R.T状态信息
现在已经知道如何在用户态下取得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信息? |
|
沙发#
发布于: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找的 希望对你有帮助:_) |
|
|
板凳#
发布于:2005-03-21 16:31
谢谢你的帮助,这些信息我也在google上找到过,现在想知道的是在kernal下的具体实现方法,因为在User mode下已经可以得到S.M.A.R.T.信息了
不过仍然谢谢你热心帮助我,谢谢 |
|
地板#
发布于:2005-03-22 11:04
谢谢你的帮助,这些信息我也在google上找到过,现在想知道的是在kernal下的具体实现方法,因为在User mode下已经可以得到S.M.A.R.T.信息了 跟踪一下,看它往1f0-1f7端口中写什么,读什么? |
|
|
地下室#
发布于:2005-03-22 11:25
有什么工具可以方便的监测吗?我自己做的程序中有对端口读写的功能,但是读了以后发现1f0-1f7读出的数据都是0xCC。 我手头有S.M.A.R.T的一份资料,0x1F4,0x1F5分别是Cylinder low和Cylinder high,可是通过端口读,读到的都是0xCC,头痛阿,觉得1f0-1f7应该不是端口地址,而是硬盘内的offset |
|
5楼#
发布于:2005-03-22 15:03
[quote] 有什么工具可以方便的监测吗?我自己做的程序中有对端口读写的功能,但是读了以后发现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写入副命令字,最后才能读个状态端口,或依靠产生中断的方式,报告结果完成 |
|
|
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.命令 |
|
7楼#
发布于:2005-03-22 15:31
忘记附件了
|
|
|
8楼#
发布于:2005-03-22 16:27
回去看看,另外你现在用Softice的bpio捕获这几个端口,然后执行你的用户程序,看看对端口读写顺序,及写入的什么东东
|
|
|
9楼#
发布于:2005-03-22 16:51
谢谢,SoftIce没用过,研究研究去
|
|