2016-10-01 46 views
0

我一直在創建一個程序來發送(最好是任意的)ATA命令,到目前爲止,我在Windows中發現的唯一選項是IOCTL_ATA_PASS_THROUGH和一個使用C++的相關結構,ATA_PASS_THROUGH_EX如何使用IOCTL_ATA_PASS_THROUGH?

不幸的是,我一直在尋找那些不知道他們在做什麼的人缺乏的文檔。以下是我沒有想到的:

  • IOCTL_ATA_PASS_THROUGH如何在語句中使用?
  • 你把ATA命令發送到哪裏?
  • ATA_PASS_THROUGH_EX.DataTransferLength應該是數據緩衝區的大小,以字節爲單位。這是結構+ ATA命令,還是隻是命令?
  • 如何選擇命令將要使用的驅動器?
  • 從驅動器的響應去哪裏?

回答

1

這對於評論來說太長了,所以我將它作爲答案發布,但請注意,它在很大程度上是受過教育的猜測。

在聲明中如何使用IOCTL_ATA_PASS_THROUGH?

這個很簡單。像所有控制碼一樣,它使用the DeviceIoControl function發送。

你把ATA命令發送到哪裏?

我不熟悉ATA,但我的猜測是「命令註冊表」,即CurrentTaskFile[6]。我想你可以找到一些關於ATA協議的文檔來清除它。

ATA_PASS_THROUGH_EX.DataTransferLength應該是數據緩衝區的大小,以字節爲單位。這是結構+ ATA命令,還是隻是命令?

文檔說

如果嵌入式ATA命令是一個寫操作,輸入緩衝器的大小應爲的sizeof(ATA_PASS_THROUGH_EX)和ATA_PASS_THROUGH_EX的DataTransferLength成員的值的總和。

所以DataTransferLength絕對不包括ATA_PASS_THROUGH_EX結構的長度。

如何選擇命令將要使用的驅動器?

推測這是由您傳遞給DeviceIoControl()的設備句柄決定的。

從驅動器的響應去哪裏?

進入DeviceIoControl()輸出緩衝區。

+0

這是完全正確的。謝謝! – Smurfton