新聞中心

EEPW首頁 > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > 通過LabVIEW獲取硬盤序列號(hào)

通過LabVIEW獲取硬盤序列號(hào)

作者: 時(shí)間:2017-01-05 來源:網(wǎng)絡(luò) 收藏
這類的帖子很多,不過差不多都是通過調(diào)用動(dòng)態(tài)鏈接庫實(shí)現(xiàn)的。準(zhǔn)確的說實(shí)現(xiàn)獲取硬盤序列號(hào)的工作是由其他語言編寫的DLL來實(shí)現(xiàn)的。今天我的這例子不用調(diào)用動(dòng)態(tài)鏈接庫,直接由LabVIEW來獲取硬盤的序列號(hào)。

這種方式在一個(gè)論壇上看見過,本想?yún)⒖紖⒖?,不過樓主把VI加密了,索性自己做一個(gè)和大家分享,討論討論。
本程序讀取的是硬盤的物理序列號(hào),不同于DLL調(diào)用的方法,本方法獲取的是硬盤唯一真正物理ID(是固化在硬盤BISO里的SN不是分區(qū)的SN),不會(huì)出現(xiàn)重復(fù),也不可能被修改(或者說難度很大,而且還有危險(xiǎn),網(wǎng)上看到過說一個(gè)叫PC-3000的可以修改,沒有嘗試過,有哪位膽大拿自己硬盤試驗(yàn)一下,把結(jié)果共享一下吧)??捎迷谲浖用苤?。
1、原理
大家知道,硬盤相對(duì)于CPU來說屬于外部設(shè)備,而CPU訪問外部設(shè)備其實(shí)就是對(duì)外部IO的端口操作,這是硬盤的底層操作,對(duì)硬盤的任何操作都可以的,這樣只要我們搞清楚如何通過IO指令對(duì)硬盤操作和硬盤物理序列號(hào)存放的寄存器就可以輕松讀取我們所要的硬盤物理序列號(hào)了。下面是從網(wǎng)絡(luò)上搜集的一些資料。
硬盤讀寫端口的具體含義
對(duì)硬盤進(jìn)行操作的常用端口是1f0h~1f7h號(hào)端口,各端口含義如下:
端口號(hào) 讀還是寫 具體含義
1F0H 讀/寫 用來傳送讀/寫的數(shù)據(jù)(其內(nèi)容是正在傳輸?shù)囊粋€(gè)字節(jié)的數(shù)據(jù))
1F1H 讀 用來讀取錯(cuò)誤碼
1F2H 讀/寫 用來放入要讀寫的扇區(qū)數(shù)量
1F3H 讀/寫 用來放入要讀寫的扇區(qū)號(hào)碼
1F4H 讀/寫 用來存放讀寫柱面的低 8位字節(jié)
1F5H 讀/寫 用來存放讀寫柱面的高 2位字節(jié)(其高 6位恒為 0)
1F6H 讀/寫 用來存放要讀/寫的磁盤號(hào)及磁頭號(hào)
第 7位 恒為 1
第 6位 恒為 0
第 5位 恒為 1
第 4位 為 0代表第一塊硬盤、為 1代表第二塊硬盤
第3~0位 用來存放要讀/寫的磁頭號(hào)
1f7H 讀 用來存放讀操作后的狀態(tài)
第 7位 控制器忙碌
第 6位 磁盤驅(qū)動(dòng)器準(zhǔn)備好了
第 5位 寫入錯(cuò)誤
第 4位 搜索完成
第 3位 為 1時(shí)扇區(qū)緩沖區(qū)沒有準(zhǔn)備好
第 2位 是否正確讀取磁盤數(shù)據(jù)
第 1位 磁盤每轉(zhuǎn)一周將此位設(shè)為1,
第 0位 之前的命令因發(fā)生錯(cuò)誤而結(jié)束
寫 該位端口為命令端口,用來發(fā)出指定命令
為50h 格式化磁道
為20h 嘗試讀取扇區(qū)
為21h 無須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接讀扇區(qū)
為22h 嘗試讀取長(zhǎng)扇區(qū)(用于早期的硬盤,每扇可能不是 512字節(jié),而是128字節(jié)到1024
之間的值)
為23h 無須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接讀長(zhǎng)扇區(qū)
為30h 嘗試寫扇區(qū)
為31h 無須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接寫扇區(qū)
為32h 嘗試寫長(zhǎng)扇區(qū)
為33h 無須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接寫長(zhǎng)扇區(qū)
上面是磁盤0的指令,下面是磁盤1的
171H 1號(hào)硬盤錯(cuò)誤寄存器
172H 1號(hào)硬盤數(shù)據(jù)扇區(qū)計(jì)數(shù)
173H 1號(hào)硬盤扇區(qū)數(shù)
174H 1號(hào)硬盤柱面(低字節(jié))
175H 1號(hào)硬盤柱面(高字節(jié))
176H 1號(hào)硬盤驅(qū)動(dòng)器/磁頭寄存器
177H 1號(hào)硬盤狀態(tài)寄存器
2、操作
知道硬盤的IO操作指令了,下面就是如何在LabVIEW里去實(shí)現(xiàn)這些指令了。這方面LabVIEW提供了現(xiàn)成的操作指令。他們就是讀端口和寫端口。

本文引用地址:http://butianyuan.cn/article/201701/336580.htm

接下來的工作就很簡(jiǎn)單了。大致流程就是下面這樣了:
2.1等待硬盤就緒
2.2發(fā)送命令
; 如果向主控制發(fā)送命令,則端口為 1f0h-1f7h
; 如果向副控制發(fā)送命令,則端口為 170h-177h
; 1f6h 如果要檢測(cè)的設(shè)備為該IDE接口的主(MASTER)設(shè)備,
那么發(fā)送 a0,如果為從那么發(fā)送 b0
; 1f7h 如果要檢測(cè)的設(shè)備為 ATA 設(shè)備那么發(fā)送 ec
如果為 ATAPI 設(shè)備那么發(fā)送 a1
2.3等待硬盤就緒
2.4將返回信息讀回
; 注意一定要讀滿 100h 個(gè)字長(zhǎng)。也就是寄存器中的所有信息
2.5返回的信息中,型號(hào)、序列號(hào)、版本號(hào)為字形式
; 需要整理到字符串的形式
3、代碼及前面板



注意:此程序只在XP下對(duì)并口硬盤做了測(cè)試。對(duì)串口(SATA)硬盤的測(cè)試失敗。VISTA下由于安全原因可能會(huì)被禁止,請(qǐng)將程序保護(hù)的選項(xiàng)去除。這個(gè)沒有詳細(xì)測(cè)試,希望安裝了VISTA系統(tǒng)的朋友測(cè)試一下,把結(jié)果共享出來。
上面圖即為程序的全部代碼。



關(guān)鍵詞: LabVIEW硬盤序列

評(píng)論


技術(shù)專區(qū)

關(guān)閉