不正确的序列号
利用GetVolumelnformation获取的计算机硬盘卷序列号,不是正确的唯一序列号:
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.
}
该函数获取的序列号在硬盘格式化后会发生变化。
正确获取硬盘的序列号
正确获取硬盘序列号代码如下:
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.
}