新聞中心

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

通過(guò)LabVIEW獲取硬盤(pán)序列號(hào)

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

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

本文引用地址:http://2s4d.com/article/201701/336580.htm

接下來(lái)的工作就很簡(jiǎn)單了。大致流程就是下面這樣了:
2.1等待硬盤(pán)就緒
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等待硬盤(pán)就緒
2.4將返回信息讀回
; 注意一定要讀滿 100h 個(gè)字長(zhǎng)。也就是寄存器中的所有信息
2.5返回的信息中,型號(hào)、序列號(hào)、版本號(hào)為字形式
; 需要整理到字符串的形式
3、代碼及前面板



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



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

評(píng)論


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

關(guān)閉