如何得到唯一的硬盘序号

不正确的序列号

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

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

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

正确获取硬盘的序列号

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

//读般硬盘序列号函数
char* CGetHDSerial::GetHDSerial()
{
	m_buffer[0]='\n';
	//得到当前操作系统版本
	OSVERSIONINFO OSVersionInfo;
	OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
	GetVersionEx(&OSVersionInfo);
	if(OSVersionInfo.dwPlatformld != VER_PLATFORM_WIN32_NT)
	{
		//Windows 9x/ME下读取硬盘序列号
		WORD m_wWin9xl'HDSerial[256];
		Win9xReadHDSerial(m_wWin9xHDSerial);
		strcpy (m_buffer, WORDToChar(m _wWin9xHDSerial, 10, 19));
	}
	else
	{
		//Windows NT/2000/XP下读取硬盘序列弓
		DWORD m_wWinNTHDSerial[256];
		//判断是否有SCSI硬盘
		if (!WinNTReadIDEHDSerial(m_wWinNTHDSerial))
			WinNTReadSCSIHDSerial(m_wWinNTHDSerial);
		strcpy (m_buffer,DWORDToChar(m_wWinNTHDSerial,10, 19));
	}
	return m_buffer;
}
//Windows NT/2000/XP下读取IDE硬盘序列号
BOOL CGetHDScriaI::WinNTReadIDEHDSerial(DWORD* buffer)
{ 
	BYTE JdOutCmd [sizeof(SENDCMDOUTPARAMS)+IDFNTIFY_BUFFER_SIZE - 1];
	BOOL bFlag = FALSE;
	int drive = 0;
	Char driveName[256];
	HANDLE hPhysicalDrivelOCTL=0;
	
	Sprintf(driveName,"\\\.\\PhysicalDrive%d",drive);
	//Windows NT/2000/XP 下创建文件需要管理员权限
	hPhysicalDriveIOCTL=CreateFile(driveName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
	
	if(hPhysicalDriveIOCTL!=INVALID_HANDLE_VALUE)
	{
		GETVERSIONOUTPARAMS VersionParams;
		DWORD cbBytesReturned=0;
		//得到驱动器的I/O控制器版本
		memser((void*)&VersionParams,0,sizeof(VersionParams));
		if(DeviceIoControl(hPhysicalDriveIOCTL,IOCTL_GET_VERSION,NULL,0,&VersionPaiams,sizeof(VersionParams),sizeof(VersionParams),
			&cbBytesReturned,NULL))
		{
			if(VersionParams.bIDEDeviceMap>0)
			{
				BYTE bIDCmd=0;//IDE或者ATAPI识别命令 
				SENDCMDINPARAMS  scip;
				//如果驱动器是光驱,采用命令IDE_ATAPI_IDENTIFY,command,否则采用命令IDE_ATA_IDENTIFY读取驱动器信息
				bIDCmd=(VersionParams.bIDEDeviceMap>>drive&0x10)?                   IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
				
				memset(&scip,0,sizeof(scip));
				memset(IdOutCmd,0,sizeof(IdOutCmd));
				//获取驱动器信息
				if(WinNTGetIDEHDInfo(hPhysicalDrivelOCTL,&scip,(PSENDCMDOUTPARMS)&IdOutCmd,(BYTE)bIDCmd,(BYTE)drive,&cbBytesReturned))
				{
					int m=0;
					USHORT*pldSector=(USHORT*)((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer;
					for(m=0;m<256;m++)
						buffer[m]=pIdSector[m];
					bFlag=TRUE;  //读取硬盘信息成功
				}
			}
		}
		CloseHandle(hPhysicalDriyeIOCTL); //关闭句柄
	}
	Return bFlag;
}



 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值