|
ATAのコマンドのSMART READ DATAの結果が取れるカスタムControlCodeの存在は掴めませんでした。
SiliconImageのRAIDツール(InstallSATARaid_v10027.ZIP)のDeviceIoControlをキャプチャして見ると、
SMART関係は "SMART RETURN STATUS" しか使っていないようで、
しかもそれはカスタムControlCodeではなく、一般的な、
#define IOCTL_SCSI_MINIPORT_RETURN_STATUS ((FILE_DEVICE_SCSI << 16) + 0x0506)
を使っていました。
SiliconImageのツールの表示では、
Status Threshold : OK
だけの表示なので、彼らにとってはSMART READ DATAまで立ち入る必要がないのかもしれません。
なお、0x802以外のカスタムControlCodeは、送受信しているバイナリ列を見て想像するに
0x800 Ide Management Version取得
0x801 SATAコントローラチップの型番やIRQ、PCIバス番号等の取得
0x803 内容みてもわからず
0x807 HDDのキャッシュenable/disable設定変更
0x808 内容みてもわからず
のようでした。
0x802のIDENTIFY DEVICEをする前に、
0x800でバージョンチェックをしたほうがよさそうです。
0x800は↓のような感じになります。
#pragma pack(push, 1)
typedef struct {
SRB_IO_CONTROL sic ;
USHORT major_version ;
USHORT minor_version ;
} SilIdeManagementVer ;
#pragma pack(pop)
SilIdeManagementVer smv ;
memset(&smv, 0, sizeof(smv)) ;
smv.sic.HeaderLength = sizeof(SRB_IO_CONTROL) ;
memcpy(smv.sic.Signature, "CMD_IDE ", 8);
smv.sic.Timeout = 5 ;
smv.sic.ControlCode = CTL_CODE(FILE_DEVICE_CONTROLLER, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) ;
smv.sic.ReturnCode = 0xffffffff ;
smv.sic.Length = sizeof(smv) - offsetof(SilIdeManagementVer, major_version) ;
smv.major_version = 0xff ;
smv.minor_version = 0xff ;
DWORD dwReturnBytes ;
if(DeviceIoControl(hDrive, IOCTL_SCSI_MINIPORT, &smv, sizeof(smv), &smv, sizeof(smv), &dwReturnBytes, NULL)) {
printf("Silicon Image Ide Management Version = %d.%d\n", smv.major_version, smv.minor_version) ;
}
----
別の話題になりますが、
HDDのアクセスタイミングから回転数を推定できそうな気がしたので、
冗談のつもりでやってみたら、そこそこの結果が得られたので、
先日、某巨大掲示板のとあるスレにて↓としてお披露目してみました。
http://www.ne.jp/asahi/zero/eight/junk/HddRpmEst01.zip
一部問題があるものの、そこそこ良い感じの値が取れているようです。
HDDに問い合わせて得られる情報を表示するのではないので、
DiskInfoの方向性とは違うとは思いますが・・・。
|
|