获取硬盘序列号.doc

上传人:博****1 文档编号:560573592 上传时间:2022-11-01 格式:DOC 页数:6 大小:18.24KB
返回 下载 相关 举报
获取硬盘序列号.doc_第1页
第1页 / 共6页
获取硬盘序列号.doc_第2页
第2页 / 共6页
获取硬盘序列号.doc_第3页
第3页 / 共6页
获取硬盘序列号.doc_第4页
第4页 / 共6页
获取硬盘序列号.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《获取硬盘序列号.doc》由会员分享,可在线阅读,更多相关《获取硬盘序列号.doc(6页珍藏版)》请在金锄头文库上搜索。

1、用api函数读取硬盘的序列号 关于盘序列号有两种: 硬盘序列号: 英文名 Hard Disk Serial Number, 该号是出厂时生产厂家为 区别产品而设置的, 是唯一的, 是只读的, 利用硬盘序列号的 加密往往是利用其唯一和只读的特性, 大多是针对有序列号的 IDE HDD而言, 对于没有序列号或SCSI HDD硬盘则无能为力, 这也是利用它进行加密的局限性. 卷的序列号: 英文名 Volume Serial Number, 该号既可指软磁盘要得, 如: A:盘和B:盘的, 又可以指硬盘的逻辑盘, 如: C:, D:.的, 是高级格式化时随机产生的, 是可以修改的, 所以利用其进行 加

2、密, 在写程序时我们想对每一台计算机都生成一个唯一的标识,而且在一此共享软件中我们也看到,软件在不同的机器上生成了不同的标识,这是如何实现的呢,其实是软件有一部分程序读取了,本地计算机的一部分硬件参数(如硬盘序列号,网卡序列号等等),再通过一系列算法而得到了一个唯一标识,其实我们也可以通过一个api函数生成我们的唯一标识,由于硬盘人人都有,而网卡不一定每个人都有,所以以读硬盘序列号为例,下面就先介绍一下我们要用到的api函数BOOL GetVolumeInformation( LPCTSTR lpRootPathName, / 硬盘的路径 LPTSTR lpVolumeNameBuffer,

3、/ 硬盘的卷标 DWORD nVolumeNameSize, / 卷标的字符串长度 LPDWORD lpVolumeSerialNumber, / 硬盘的序列号 LPDWORD lpMaximumComponentLength, / 最大的文件长度 LPDWORD lpFileSystemFlags, / 文件系统的一此标志 LPTSTR lpFileSystemNameBuffer, / 存储所在盘符的分区类型的长指针变量 DWORD nFileSystemNameSize / 分区类型的长指针变量所指向的字符串长度);如果上述函数成功就返回一个非0值。光说不做,是不行了,我们还得实践一下:

4、/ 最大的文件长度首选用MFC AppWizard建立一个基于Dialog base的对话框工程,名为GetHardID,点击finish。加一个按钮,双击它,点击ok,并在对应的函数中加入如下代码:LPCTSTR lpRootPathName=c:; /取C盘LPTSTR lpVolumeNameBuffer=new char12;/磁盘卷标DWORD nVolumeNameSize=12;/ 卷标的字符串长度DWORD VolumeSerialNumber;/硬盘序列号DWORD MaximumComponentLength;/ 最大的文件长度LPTSTR lpFileSystemName

5、Buffer=new char10;/ 存储所在盘符的分区类型的长指针变量DWORD nFileSystemNameSize=10;/ 分区类型的长指针变量所指向的字符串长度DWORD FileSystemFlags;/ 文件系统的一此标志:GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer, nVolumeNameSize,&VolumeSerialNumber, &MaximumComponentLength,&FileSystemFlags,lpFileSystemNameBuffer, nFileSystemNameSize);

6、CString str;str.Format(Seria Num is %lx ,VolumeSerialNumber);AfxMessageBox(str);编译,链接并运行程序,单击按钮,在弹出的对话框中就是我们要的序列号。对不对我们验证一下,进入dos窗口,打入dir c:/p命令,怎么样是不是和我们的程序显示的一模一样这样我们就在功告成了。=cpu adapter id =以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号) BYTE szSystemInfo4096; / 在程序执行完毕后,此处存储取得的系统特征码 UINT uSystemInfoLen

7、= 0; / 在程序执行完毕后,此处存储取得的系统特征码的长度 / 网卡 MAC 地址,注意: MAC 地址是可以在注册表中修改的 UINT uErrorCode = 0; IP_ADAPTER_INFO iai; ULONG uSize = 0; DWORD dwResult = GetAdaptersInfo( &iai, &uSize ); if( dwResult = ERROR_BUFFER_OVERFLOW ) IP_ADAPTER_INFO* piai = ( IP_ADAPTER_INFO* )HeapAlloc( GetProcessHeap( ), 0, uSize );

8、if( piai != NULL ) dwResult = GetAdaptersInfo( piai, &uSize ); if( ERROR_SUCCESS = dwResult ) IP_ADAPTER_INFO* piai2 = piai; while( piai2 != NULL & ( uSystemInfoLen + piai2-AddressLength ) Address, piai2-AddressLength ); uSystemInfoLen += piai2-AddressLength; piai2 = piai2-Next; else uErrorCode = 0x

9、F0000000U + dwResult; VERIFY( HeapFree( GetProcessHeap( ), 0, piai ) ); else return FALSE; else uErrorCode = 0xE0000000U + dwResult; if( uErrorCode != 0U ) return FALSE; / 硬盘序列号,注意:有的硬盘没有序列号 OSVERSIONINFO ovi = 0 ; ovi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); GetVersionEx( &ovi ); if( ovi.dwPl

10、atformId != VER_PLATFORM_WIN32_NT ) / Only Windows 2000, Windows XP, Windows Server 2003. return FALSE; else if( !WinNTHDSerialNumASPhysicalRead( szSystemInfo, &uSystemInfoLen, 1024 ) ) WinNTHDSerialNumAsScsiRead( szSystemInfo, &uSystemInfoLen, 1024 ); / CPU ID BOOL bException = FALSE; BYTE szCpu16

11、= 0 ; UINT uCpuID = 0U; _try _asm mov eax, 0 cpuid mov dword ptr szCpu0, ebx mov dword ptr szCpu4, edx mov dword ptr szCpu8, ecx mov eax, 1 cpuid mov uCpuID, edx _except( EXCEPTION_EXECUTE_HANDLER ) bException = TRUE; if( !bException ) CopyMemory( szSystemInfo + uSystemInfoLen, &uCpuID, sizeof( UINT ) ); uSystemInfoLen += sizeof( UINT );

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号