原创 转帖:读取硬盘物理序列号(源码和执行文件)

2008-8-2 14:25 4426 4 4 分类: 软件与OS

http://www.cppblog.com/edog/archive/2005/12/01/1455.html


读取硬盘物理序列号



WINNT下实现的,WIN98下不行,网上搜索了一通,高人给出WIN98下的实现代码要用到汇编,还要取得Ring0级别的控制权,狂晕~~~偶毕业后就把汇编还给老师了,还是老老实实用C++代码吧。具体的C++和汇编源码可以在此找到:http://www.cz88.net/2004/7-7/235257.htm


 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


读取硬盘物理序列号有什么用?用来对软件加密最好了,别告诉我你是用C盘的逻辑序列号来加密的,那个冬冬可是可以用程序改的。不过听说现在连硬盘的物理序列号也可以改,不知道怎么才能改呢,高人指点一下。这个程序主要是针对有序列号的IDE HDD而言, 对于没有序列号或SCSI HDD硬盘则无能为力,这是其局限性。


 


实现原理:


1、  CreateFile可以打开物理设备和串口等,使用CreateFile("\\\\.\\PHYSICALDRIVE0",…)打开硬盘,其中的00-255,视乎有几个硬盘了。


2、  使用DeviceIoControl函数对打开的设备进行通信,发送指定命令,根据返回的PSENDCMDOUTPARAMS结构,得到物理序列号和模型号,把物理序列号和模型号格式化为一定的格式输出。
DiskInfo

顺便把各个逻辑驱动器的信息也读取一下,包括卷标,驱动器类型和逻辑序列号等。主要是用GetLogicalDriveStrings和GetVolumeInformation和GetDriveType几个API。图示是偶的机器上的结果。
程序:diskinfo.zip


 


菜农先在这里感谢真正的原作者.


运行diskinfo后,显示如下和某收费40元/台结果一样)


45864af5-74fa-4c4f-9a90-751db0a2b2d9.gif


 


还没看此源程序,先用CVI编写的,但没通过(CVI支持直接访问IO)


 


 int al;
    int i;    
    WORD pw[256];    
 while  ((al = inp (0x1F7)) >= 0x80);
    outp(0x1F6,0xA0);    
 while  ((al = inp (0x1F7)) >= 0x80);
    if ((al & 0x50) == 0x50)   
 {
     outp(0x1F6, 0xA0);    
     outp(0x1F7, 0xEC);    
  while  ((al = inp (0x1F7)) >= 0x80);
     if ((al & 0x58) == 0x58)    
  {
      for   (i=0; i< 256; i++)  
   {    
       pw = inpw(0x1F0);    
      }
  }
 }    


问题出在最后没读到0x58,而是一直读的是0x50. 难道CVI有问题???


 


不会吧...俺一直用CVI读写其他IO都没问题过...


 



 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条