求一读写硬盘序列号的程序!!我想做软件的认证

解决方案 »

  1.   

    如何读取硬盘的序列号    
    ----  硬盘的序列号只能采用对硬盘控制器直接操作的方式进行读取,也就是说只能采用  
    CPU的I/O指令操作硬盘控制器,读取的方法如下面的C语言程序所示:    
    static  int  WaitIde()  
    {  
         int      al;  
         while  ((al=inp(0x1F7))  >=0x80)  ;  
         return  al;  
    }  
    static  void  ReadIDE()  
    {  
         int      al;  
         int      i;  
         WORD    pw[256];  
         WaitIde();  
         outp(0x1F6,0xA0);  
         al  =  WaitIde();  
         if  ((al&0x50)!=0x50)  return;  
         outp(0x1F6,0xA0);  
         outp(0x1F7,0xEC);  
         al  =  WaitIde();  
         if  ((al&0x58)!=0x58)  return;  
         for  (i=0;i<  256;i++)    
               pw[i]  =  inpw(0x1F0);  
    }  
      

  2.   

    哎.这种方法是在DOS时期用的.对用户很不负责任.
      

  3.   

    读取硬盘的序列号    
    ----  硬盘的序列号只能采用对硬盘控制器直接操作的方式进行读取,也就是说只能采用  
    CPU的I/O指令操作硬盘控制器,读取的方法如下面的C语言程序所示:    
    static  int  WaitIde()  
    {  
         int      al;  
         while  ((al=inp(0x1F7))  >=0x80)  ;  
         return  al;  
    }  
    static  void  ReadIDE()  
    {  
         int      al;  
         int      i;  
         WORD    pw[256];  
         WaitIde();  
         outp(0x1F6,0xA0);  
         al  =  WaitIde();  
         if  ((al&0x50)!=0x50)  return;  
         outp(0x1F6,0xA0);  
         outp(0x1F7,0xEC);  
         al  =  WaitIde();  
         if  ((al&0x58)!=0x58)  return;  
         for  (i=0;i<  256;i++)    
               pw[i]  =  inpw(0x1F0);  
    }
      

  4.   

    http://www.cppfans.com/articles/system/idehdparams.asp
      

  5.   

    楼上的行
    windows下要写驱动吧
      

  6.   

    http://www.cppfans.com/articles/system/idehdparams.asp
      

  7.   

    有个程序叫hdid,读取硬盘的硬件序列号,楼主可以和我联系
    [email protected]
      

  8.   

    BOOL DeviceIoControl(
      HANDLE hDevice,              // handle to device
      DWORD dwIoControlCode,       // operation control code
      LPVOID lpInBuffer,           // input data buffer
      DWORD nInBufferSize,         // size of input data buffer
      LPVOID lpOutBuffer,          // output data buffer
      DWORD nOutBufferSize,        // size of output data buffer
      LPDWORD lpBytesReturned,     // byte count
      LPOVERLAPPED lpOverlapped    // overlapped information
    );
      

  9.   

    http://www.winsim.com/diskid32/diskid32.html
      

  10.   

    in/out指令显然是win9x的指令,2k下不行的。
    买就算了,我想这么几十行的驱动我还是能完成的。。
      

  11.   

    在写程序时我们想对每一台计算机都生成一个唯一的标识,而且在一此共享软件中我们也看到,软件在不同的机器上生成了不同的标识,这是如何实现的呢,其实是软件有一部分程序读取了,本地计算机的一部分硬件参数(如硬盘序列号,网卡序列号等等),再通过一系列算法而得到了一个唯一标识,其实我们也可以通过一个api函数生成我们的唯一标识,由于硬盘人人都有,而网卡不一定每个人都有,所以以读硬盘序列号为例,
    下面就先介绍一下我们要用到的api函数
     BOOL GetVolumeInformation(
      LPCTSTR lpRootPathName,           // 硬盘的路径
      LPTSTR lpVolumeNameBuffer,        // 硬盘的卷标
      DWORD nVolumeNameSize,            // 卷标的字符串长度
      LPDWORD lpVolumeSerialNumber,     // 硬盘的序列号
      LPDWORD lpMaximumComponentLength, // 最大的文件长度
      LPDWORD lpFileSystemFlags,        // 文件系统的一此标志
      LPTSTR lpFileSystemNameBuffer,    // 存储所在盘符的分区类型的长指针变量
      DWORD nFileSystemNameSize         // 分区类型的长指针变量所指向的字符串长度
    );
    如果上述函数成功就返回一个非0值。光说不做,是不行了,我们还得实践一下:// 最大的文件长度
    首选用MFC AppWizard建立一个基于Dialog base的对话框工程,名为GetHardID,点击finish。
    加一个按钮,双击它,点击ok,并在对应的函数中加入如下代码:
     LPCTSTR lpRootPathName="c:\"; //取C盘
     LPTSTR lpVolumeNameBuffer=new char[12];//磁盘卷标
     DWORD nVolumeNameSize=12;// 卷标的字符串长度
     DWORD VolumeSerialNumber;//硬盘序列号
     DWORD MaximumComponentLength;// 最大的文件长度
     LPTSTR lpFileSystemNameBuffer=new char[10];// 存储所在盘符的分区类型的长指针变量
     DWORD nFileSystemNameSize=10;// 分区类型的长指针变量所指向的字符串长度
     DWORD FileSystemFlags;// 文件系统的一此标志
     ::GetVolumeInformation(lpRootPathName,
      lpVolumeNameBuffer, nVolumeNameSize,
      &VolumeSerialNumber, &MaximumComponentLength,
      &FileSystemFlags,
      lpFileSystemNameBuffer, nFileSystemNameSize);
     
     CString str;
     str.Format("Seria Num is %lx ",VolumeSerialNumber);
     AfxMessageBox(str);
     
    编译,链接并运行程序,单击按钮,在弹出的对话框中就是我们要的序列号。
    对不对我们验证一下,进入dos窗口,打入"dir c:/p"命令,怎么样是不是和我们的程序显示的一模一样
    这样我们就在功告成了。