您的位置:首页 > 其它

如何得到唯一的硬盘序号

2012-12-21 16:02 337 查看
不正确的序列号
利用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.
}


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

正确获取硬盘的序列号

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

//读般硬盘序列号函数
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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: