ATA_PASS_THROUGH_EXフォーマットかつATA_FLAGS_48BIT_COMMANDをONで
ATAコマンドを送信する際のPreviousTaskFileおよびCurrentTaskFileの
機能割付けについて教えて頂けないでしょうか。
環境はWindows7で、VC++ Express 2012を使用しております。
質問事項は2点です。
1.READ SECTOR(S) EXT(24h)でSector countを0x101以上を指定して実行すると
DeviceIoControl発行時に「パラメータが間違っています」のエラーが出てしまい、
実行できません。
Sector countを0x100以下で実行すると問題なさそうです。
またWRITE SECTOR(S) EXT(34h)でLBAを0x800以上を指定して実行すると
DeviceIoControl発行時に「アクセスが拒否されました」のエラーが出てしまい、
実行できません。
LBAを0x7FF以下で実行すると問題なさそうです。
私のPreviousTaskFileおよびCurrentTaskFileの解釈がおかしいのでしょうか?
現在は以下のように解釈しております。
PreviousTaskFile[0] Features register(15~8ビットめ)
CurrentTaskFile[0] Features register( 7~0ビットめ)
PreviousTaskFile[1] Sector count register(15~8ビットめ)
CurrentTaskFile[1] Sector count register( 7~0ビットめ)
PreviousTaskFile[4] Cylinder high register(LBAの47~40ビットめ)
PreviousTaskFile[3] Cylinder low register (LBAの39~32ビットめ)
PreviousTaskFile[2] Sector number register(LBAの31~24ビットめ)
CurrentTaskFile[4] Cylinder high register(LBAの23~16ビットめ)
CurrentTaskFile[3] Cylinder low register (LBAの15~ 8ビットめ)
CurrentTaskFile[2] Sector number register(LBAの 7~ 0ビットめ)
PreviousTaskFile[5] Device/head register
CurrentTaskFile[5] Device/head register
PreviousTaskFile[6] Command register
CurrentTaskFile[6] Command register
PreviousTaskFile[7] 未使用
CurrentTaskFile[7] 未使用
実際の値は以下の通りです。
READ SECTOR(S) EXT(24h)実行時(Sector Count 0x101 LBA 0x0)
PreviousTaskFile[0] 0x00 Features register(15~8ビットめ)
CurrentTaskFile[0] 0x00 Features register( 7~0ビットめ)
PreviousTaskFile[1] 0x01 Sector count register(15~8ビットめ)
CurrentTaskFile[1] 0x01 Sector count register( 7~0ビットめ)
PreviousTaskFile[4] 0x00 Cylinder high register(LBAの47~40ビットめ)
PreviousTaskFile[3] 0x00 Cylinder low register (LBAの39~32ビットめ)
PreviousTaskFile[2] 0x00 Sector number register(LBAの31~24ビットめ)
CurrentTaskFile[4] 0x00 Cylinder high register(LBAの23~16ビットめ)
CurrentTaskFile[3] 0x00 Cylinder low register (LBAの15~ 8ビットめ)
CurrentTaskFile[2] 0x00 Sector number register(LBAの 7~ 0ビットめ)
PreviousTaskFile[5] 0xE0 Device/head register
CurrentTaskFile[5] 0xE0 Device/head register
PreviousTaskFile[6] 0x24 Command register
CurrentTaskFile[6] 0x24 Command register
PreviousTaskFile[7] 0x00 未使用
CurrentTaskFile[7] 0x00 未使用
WRITE SECTOR(S) EXT(34h)実行時(Sector Count 0x2 LBA 0x812)
PreviousTaskFile[0] 0x00 Features register(15~8ビットめ)
CurrentTaskFile[0] 0x00 Features register( 7~0ビットめ)
PreviousTaskFile[1] 0x00 Sector count register(15~8ビットめ)
CurrentTaskFile[1] 0x02 Sector count register( 7~0ビットめ)
PreviousTaskFile[4] 0x00 Cylinder high register(LBAの47~40ビットめ)
PreviousTaskFile[3] 0x00 Cylinder low register (LBAの39~32ビットめ)
PreviousTaskFile[2] 0x00 Sector number register(LBAの31~24ビットめ)
CurrentTaskFile[4] 0x00 Cylinder high register(LBAの23~16ビットめ)
CurrentTaskFile[3] 0x08 Cylinder low register (LBAの15~ 8ビットめ)
CurrentTaskFile[2] 0x12 Sector number register(LBAの 7~ 0ビットめ)
PreviousTaskFile[5] 0xE0 Device/head register
CurrentTaskFile[5] 0xE0 Device/head register
PreviousTaskFile[6] 0x34 Command register
CurrentTaskFile[6] 0x34 Command register
PreviousTaskFile[7] 0x00 未使用
CurrentTaskFile[7] 0x00 未使用
上記解釈の他にも何か思い当たるところがありましたらご教示いただけないでしょうか
2.ICC fieldとAUXILIARYフィールドはPreviousTaskFile/CurrentTaskFileの
どのエリアにあてはまるのでしょうか?
こちらはまだ実行していないのですが、現在の私の解釈は以下の通りです。
PreviousTaskFile[5] ICCフィールド or AUXILIARY(15~8ビット)
PreviousTaskFile[6] AUXILIARY(15~8ビット)
上記解釈であってますでしょうか?
違いましたら正解をご教示頂くとありがたいです。