最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2013年4月28日 星期日

用RU在DOS或UEFI下,對SATA Controller下ATA Command取得HDD與ODD資訊(2)

接續上一篇用RU在DOS或UEFI下,對SATA Controller下ATA Command取得HDD與ODD資訊(1),這一篇將就前面整理的資訊來取得HDD資訊。
Step 1 : 由Intel® 6 Series Chipset and Intel® C200 Series Chipset找出在PCI interface的Bus 0、Device 1F、Function 2的ABAR與所有的PxPCR。

Port Registers
Value
ABAR
0xB0417000
Port0 Offset(ABAR + 0*80h + 100h)
0xB0417100
Port1 Offset(ABAR + 1*80h + 100h)
0xB0417180
Port2 Offset(ABAR + 2*80h + 100h)
0xB0417200
Port3 Offset(ABAR + 3*80h + 100h)
0xB0417280
Port4 Offset(ABAR + 4*80h + 100h)
0xB0417300
Port5 Offset(ABAR + 5*80h + 100h)
0xB0417380
Port6 Offset(ABAR + 6*80h + 100h)
0xB0417400
Port7 Offset(ABAR + 7*80h + 100h)
0xB0417480

Step 2 : Serial ATA AHCI 1.3 Specification用RU抓出系統中有關下圖Port Registers。


Port Registers
Value
ABAR
0xB0417000
Port0 Offset(ABAR + Port*80h + 100h)
0xB0417100
P0CLB(P0PCR + Offset 00h)
0x91DE9000
P0CLBU(P0PCR + Offset 04h)
0x00000000
P0FB(P0PCR + Offset 08h)
0x91DE7000
P0FBU(P0PCR + Offset 0Ch)
0x00000000
P0IS(P0PCR + Offset 10h)
0x00000021
P0IE(P0PCR + Offset 14h)
0x00000000
P0CMD(P0PCR + Offset 18h)
0x00000006
P0TFD(P0PCR + Offset 20h)
0x00000050
P0SIG(P0PCR + Offset 24h)
0x00000101
P0SSTS(P0PCR + Offset 28h)
0x00000133
P0SCTL(P0PCR + Offset 2Ch)
0x00000300
P0SERR(P0PCR + Offset 30h)
0x00000000
P0SACT(P0PCR + Offset 34h)
0x00000000
P0CI(P0PCR + Offset 38h)
0x00000000
P0SNTF(P0PCR + Offset 3Ch)
0x00000000
P0FBS(P0PCR + Offset 40h)
0x00000000
P0VS(P0PCR + Offset 70h)
0x00000000

Step 3 : 判斷裝置所在位置與裝置類型。
若PxSIG&0x0000FFFF為0x00000101,則裝置存在於該Port上,反之則否。由P0SIG判斷裝置存在於Port0的位置上
若PxSSTS&0xFFFF0000為0xEB140000,則裝置類型為ATAPI裝置,如CD、DVD,反之則為ATA裝置。由P0SSTS判斷裝置類型為ATA裝置,如HDD、SSD。

Step 4 : P0CLB由找出FIS Base Address

Step 5 : 使用上一篇用RU在DOS或UEFI下,對SATA Controller下ATA Command取得HDD與ODD資訊(1)文章整理的ATA Command,抓取Identify Data就是HDD的資訊。


Identify Data HDD
Identify Data ODD
Attribute Values
Attribute Thresholds
Enable SMART
Disable SMART
SMART STATUS
Input
Feature
XX
XX
D0h
D1h
D8h
D9h
DAh
Sector Count
01h
01h
01h
01h
XX
XX
XX
Sector Number
XX
XX
XX
XX
01h
01h
XX
LBA Low
XX
XX
4Fh
4Fh
4Fh
4Fh
4Fh
LBA High
XX
XX
C2h
C2h
C2h
C2h
C2h
Device/Head
XX
XX
A0h
A0h
XX
XX
XX
Command
ECh
A1h
B0h
B0h
B0h
B0h
B0h
Output
Return Byte
512
512
512
512
0
0
0


Step 6 : 建立PRDT (Physical Region Descriptor Table)。

各位址的意義

確認DW3 BIT0 (Data Byte Count),是否為 1,如果 BIT0為 0,將其設為1。
確認DW3 BIT31(Interrupt On Completion),是否為 1,如果 BIT0為 0,將其設為1。

Step 7 : 建立Command List結構。

各位址的意義

設定以下參數
CFL= 5 (CFIS length)
PRDTL = 1 (PRDT entry number. For Identify command)

Step 8 : 開始執行。
原始狀態

設定執行Command,切忌順序要對。
  1. 將P0CMD(P0PCR + Offset 18h) Bit4設為1。
  2. P0CI(P0PCR + Offset 38h) Bit0設為1。
  3. 將P0CMD(P0PCR + Offset 18h) Bit0設為1。
  4. 等待P0CI(P0PCR + Offset 38h) 由01變為00 或在上一步執行後等待0.3~0.5秒即可。
執行後的狀態

Step 9 : 取得HDD資訊

最後需要將取回的HDD資料進行高低位元資料轉換,如此才能獲得最後HDD的資訊。以上的作法是針對HDD,若是要取得ODD資訊,只需要在Step 5的Command換成0xA1即可。

該硬碟的資訊如下

沒有留言:

張貼留言