您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 如何通过LABVIEW获取硬盘ID
通过LabVIEW获取硬盘序列号网上这类的帖子很多,不过差不多都是通过调用动态链接库实现的。准确的说实现获取硬盘序列号的工作是由其他语言编写的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的171H1号硬盘错误寄存器172H1号硬盘数据扇区计数173H1号硬盘扇区数174H1号硬盘柱面(低字节)175H1号硬盘柱面(高字节)176H1号硬盘驱动器/磁头寄存器177H1号硬盘状态寄存器2、操作知道硬盘的IO操作指令了,下面就是如何在LabVIEW里去实现这些指令了。这方面LabVIEW提供了现成的操作指令。他们就是读端口和写端口。点击开看大图接下来的工作就很简单了。大致流程就是下面这样了:2.1等待硬盘就绪2.2发送命令;如果向主控制发送命令,则端口为1f0h-1f7h;如果向副控制发送命令,则端口为170h-177h;1f6h如果要检测的设备为该IDE接口的主(MASTER)设备,那么发送a0,如果为从那么发送b0;1f7h如果要检测的设备为ATA设备那么发送ec如果为ATAPI设备那么发送a12.3等待硬盘就绪2.4将返回信息读回;注意一定要读满100h个字长。也就是寄存器中的所有信息2.5返回的信息中,型号、序列号、版本号为字形式;需要整理到字符串的形式3、代码及前面板点击开看大图注意:此程序只在XP下对并口硬盘做了测试。对串口(SATA)硬盘的测试失败。VISTA下由于安全原因可能会被禁止,请将程序保护的选项去除。这个没有详细测试,希望安装了VISTA系统的朋友测试一下,把结果共享出来。上面图即为程序的全部代码。凡是索要源代码的留言和邮件疑虑不予回复。敬请谅解。关键词:LabVIEW端口操作硬盘序列号硬盘ID硬盘SN
本文标题:如何通过LABVIEW获取硬盘ID
链接地址:https://www.777doc.com/doc-5089559 .html