不正确的序列号
利用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. else17. {
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. }

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

被折叠的 条评论
为什么被折叠?



