如何得到唯一的硬盘序号

本文介绍了两种获取硬盘序列号的方法,并对比了它们的区别。一种方法是通过GetVolumeInformation函数,但这种方式在硬盘格式化后会变化;另一种方法是通过特定的函数在不同操作系统下读取硬盘序列号,这种方法即使在硬盘格式化后也能保持不变。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

不正确的序列号

利用GetVolumelnformation获取的计算机硬盘卷序列号,不是正确的唯一序列号:

01.void CWJGISApp::Register()
02.{
03.    DWORD VolumeSerialNumber;
04.    GetVolumeInformation("c:\\",NULL,NULL,&VolumeSeriaINumber,NULL,NULL,NULL,NULL);
05.    char charVolumeSerialNumber[l0];
06.    itoa(VolumeSerlalNumber,charVoIumeSerialNumber,10);
07.    CString strTemp;
08.    strTemp.Format("%s",charVolumeSerialNumber);
09.}

该函数获取的序列号在硬盘格式化后会发生变化。

正确获取硬盘的序列号

正确获取硬盘序列号代码如下:

01.    //读般硬盘序列号函数
02.    char* CGetHDSerial::GetHDSerial()
03.    {
04.        m_buffer[0]='\n';
05.        //得到当前操作系统版本
06.        OSVERSIONINFO OSVersionInfo;
07.        OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
08.        GetVersionEx(&OSVersionInfo);
09.        if(OSVersionInfo.dwPlatformld != VER_PLATFORM_WIN32_NT)
10.        {
11.            //Windows 9x/ME下读取硬盘序列号
12.              WORD m_wWin9xl'HDSerial[256];
13.            Win9xReadHDSerial(m_wWin9xHDSerial);
14.            strcpy (m_buffer, WORDToChar(m _wWin9xHDSerial, 10, 19));
15.        }
16.        else
17.        {
18.            //Windows NT/2000/XP下读取硬盘序列弓
19.             DWORD m_wWinNTHDSerial[256];
20.            //判断是否有SCSI硬盘
21.             if (!WinNTReadIDEHDSerial(m_wWinNTHDSerial))
22.                WinNTReadSCSIHDSerial(m_wWinNTHDSerial);
23.            strcpy (m_buffer,DWORDToChar(m_wWinNTHDSerial,10, 19));
24.        }
25.        return m_buffer;
26.    }
27.    //Windows NT/2000/XP下读取IDE硬盘序列号
28.    BOOL CGetHDScriaI::WinNTReadIDEHDSerial(DWORD* buffer)
29.    
30.        BYTE JdOutCmd [sizeof(SENDCMDOUTPARAMS)+IDFNTIFY_BUFFER_SIZE - 1];
31.        BOOL bFlag = FALSE;
32.        int drive = 0;
33.        Char driveName[256];
34.        HANDLE hPhysicalDrivelOCTL=0;
35.  
36.        Sprintf(driveName,"\\\.\\PhysicalDrive%d",drive);
37.        //Windows NT/2000/XP 下创建文件需要管理员权限
38.         hPhysicalDriveIOCTL=CreateFile(driveName,GENERIC_READ|GENERIC_WRITE,
39.FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
40.  
41.        if(hPhysicalDriveIOCTL!=INVALID_HANDLE_VALUE)
42.        {
43.            GETVERSIONOUTPARAMS VersionParams;
44.            DWORD cbBytesReturned=0;
45.            //得到驱动器的I/O控制器版本
46.             memser((void*)&VersionParams,0,sizeof(VersionParams));
47.            if(DeviceIoControl(hPhysicalDriveIOCTL,IOCTL_GET_VERSION,NULL,
48.0,&VersionPaiams,sizeof(VersionParams),sizeof(VersionParams),
49.              &cbBytesReturned,NULL))
50.            {
51.               if(VersionParams.bIDEDeviceMap>0)
52.               {
53.                   BYTE bIDCmd=0;//IDE或者ATAPI识别命令 
54.                     SENDCMDINPARAMS  scip;
55.                   //如果驱动器是光驱,采用命令IDE_ATAPI_IDENTIFY,command,
56.否则采用命令IDE_ATA_IDENTIFY读取驱动器信息
57.                     bIDCmd=(VersionParams.bIDEDeviceMap>>drive&0x10)?                   
58.IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
59.   
60.                   memset(&scip,0,sizeof(scip));
61.                   memset(IdOutCmd,0,sizeof(IdOutCmd));
62.                   //获取驱动器信息
63.                     if(WinNTGetIDEHDInfo(hPhysicalDrivelOCTL,&scip,(PSENDCMDOUTPARMS)&
64.IdOutCmd,(BYTE)bIDCmd,(BYTE)drive,&cbBytesReturned))
65.                   {
66.                      int m=0;
67.                      USHORT*pldSector=(USHORT*)((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer;
68.                      for(m=0;m<256;m++)
69.                          buffer[m]=pIdSector[m];
70.                      bFlag=TRUE;  //读取硬盘信息成功
71.                     }
72.               }
73.            }
74.            CloseHandle(hPhysicalDriyeIOCTL); //关闭句柄
75.         }
76.        Return bFlag;
77.    }

 

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值