新闻中心

EEPW首页 > 测试测量 > 设计应用 > 通过LabVIEW获取硬盘序列号

通过LabVIEW获取硬盘序列号

作者:时间:2017-01-05来源:网络收藏
这类的帖子很多,不过差不多都是通过调用动态链接库实现的。准确的说实现获取硬盘序列号的工作是由其他语言编写的DLL来实现的。今天我的这例子不用调用动态链接库,直接由LabVIEW来获取硬盘的序列号。

这种方式在一个论坛上看见过,本想参考参考,不过楼主把VI加密了,索性自己做一个和大家分享,讨论讨论。
本程序读取的是硬盘的物理序列号,不同于DLL调用的方法,本方法获取的是硬盘唯一真正物理ID(是固化在硬盘BISO里的SN不是分区的SN),不会出现重复,也不可能被修改(或者说难度很大,而且还有危险,网上看到过说一个叫PC-3000的可以修改,没有尝试过,有哪位胆大拿自己硬盘试验一下,把结果共享一下吧)。可用在软件加密中。
1、原理
大家知道,硬盘相对于CPU来说属于外部设备,而CPU访问外部设备其实就是对外部IO的端口操作,这是硬盘的底层操作,对硬盘的任何操作都可以的,这样只要我们搞清楚如何通过IO指令对硬盘操作和硬盘物理序列号存放的寄存器就可以轻松读取我们所要的硬盘物理序列号了。下面是从网络上搜集的一些资料。
硬盘读写端口的具体含义
对硬盘进行操作的常用端口是1f0h~1f7h号端口,各端口含义如下:
端口号 读还是写 具体含义
1F0H 读/写 用来传送读/写的数据(其内容是正在传输的一个字节的数据)
1F1H 读 用来读取错误码
1F2H 读/写 用来放入要读写的扇区数量
1F3H 读/写 用来放入要读写的扇区号码
1F4H 读/写 用来存放读写柱面的低 8位字节
1F5H 读/写 用来存放读写柱面的高 2位字节(其高 6位恒为 0)
1F6H 读/写 用来存放要读/写的磁盘号及磁头号
第 7位 恒为 1
第 6位 恒为 0
第 5位 恒为 1
第 4位 为 0代表第一块硬盘、为 1代表第二块硬盘
第3~0位 用来存放要读/写的磁头号
1f7H 读 用来存放读操作后的状态
第 7位 控制器忙碌
第 6位 磁盘驱动器准备好了
第 5位 写入错误
第 4位 搜索完成
第 3位 为 1时扇区缓冲区没有准备好
第 2位 是否正确读取磁盘数据
第 1位 磁盘每转一周将此位设为1,
第 0位 之前的命令因发生错误而结束
写 该位端口为命令端口,用来发出指定命令
为50h 格式化磁道
为20h 尝试读取扇区
为21h 无须验证扇区是否准备好而直接读扇区
为22h 尝试读取长扇区(用于早期的硬盘,每扇可能不是 512字节,而是128字节到1024
之间的值)
为23h 无须验证扇区是否准备好而直接读长扇区
为30h 尝试写扇区
为31h 无须验证扇区是否准备好而直接写扇区
为32h 尝试写长扇区
为33h 无须验证扇区是否准备好而直接写长扇区
上面是磁盘0的指令,下面是磁盘1的
171H 1号硬盘错误寄存器
172H 1号硬盘数据扇区计数
173H 1号硬盘扇区数
174H 1号硬盘柱面(低字节)
175H 1号硬盘柱面(高字节)
176H 1号硬盘驱动器/磁头寄存器
177H 1号硬盘状态寄存器
2、操作
知道硬盘的IO操作指令了,下面就是如何在LabVIEW里去实现这些指令了。这方面LabVIEW提供了现成的操作指令。他们就是读端口和写端口。

本文引用地址:http://www.eepw.com.cn/article/201701/336580.htm

接下来的工作就很简单了。大致流程就是下面这样了:
2.1等待硬盘就绪
2.2发送命令
; 如果向主控制发送命令,则端口为 1f0h-1f7h
; 如果向副控制发送命令,则端口为 170h-177h
; 1f6h 如果要检测的设备为该IDE接口的主(MASTER)设备,
那么发送 a0,如果为从那么发送 b0
; 1f7h 如果要检测的设备为 ATA 设备那么发送 ec
如果为 ATAPI 设备那么发送 a1
2.3等待硬盘就绪
2.4将返回信息读回
; 注意一定要读满 100h 个字长。也就是寄存器中的所有信息
2.5返回的信息中,型号、序列号、版本号为字形式
; 需要整理到字符串的形式
3、代码及前面板



注意:此程序只在XP下对并口硬盘做了测试。对串口(SATA)硬盘的测试失败。VISTA下由于安全原因可能会被禁止,请将程序保护的选项去除。这个没有详细测试,希望安装了VISTA系统的朋友测试一下,把结果共享出来。
上面图即为程序的全部代码。



关键词: LabVIEW硬盘序列

评论


技术专区

关闭