2024年6月15日发(作者:)

用api函数读取硬盘的序列号

关于盘序列号有两种:

硬盘序列号: 英文名 Hard Disk Serial Number, 该号是出厂时生产厂家

区别产品而设置的, 是唯一的, 是只读的, 利用硬盘序列号的

加密往往是利用其唯一和只读的特性, 大多是针对有序列号的

IDE HDD而言, 对于没有序列号或SCSI HDD硬盘则无能为力,

这也是利用它进行加密的局限性.

卷的序列号: 英文名 Volume Serial Number, 该号既可指软磁盘要

得, 如:

A:盘和B:盘的, 又可以指硬盘的逻辑盘, 如: C:, D:...的,

是高级格式化时随机产生的, 是可以修改的, 所以利用其进行

加密,

在写程序时我们想对每一台计算机都生成一个唯一的标识,而且在一此共享软件中我们也看

到,软件在不同的机器上生成了不同的标识,这是如何实现的呢,其实是软件有一部分程序

读取了,本地计算机的一部分

硬件

参数(如硬盘序列号,网卡序列号等等),再通过一系列算

法而得到了一个唯一标识,其实我们也可以通过一个api函数生成我们的唯一标识,由于硬

盘人人都有,而网卡不一定每个人都有,所以以读硬盘序列号为例,

下面就先介绍一下我们要用到的api函数

BOOL GetVolumeInformation(

LPCTSTR lpRootPathName, // 硬盘的路径

LPTSTR lpVolumeNameBuffer, // 硬盘的卷标

DWORD nVolumeNameSize, // 卷标的字符串长度

LPDWORD lpVolumeSerialNumber, // 硬盘的序列号

LPDWORD lpMaximumComponentLength, // 最大的文件长度

LPDWORD lpFileSystemFlags, // 文件系统的一此标志

LPTSTR lpFileSystemNameBuffer, // 存储所在盘符的分区类型的长指针变量

DWORD nFileSystemNameSize // 分区类型的长指针变量所指向的字符串长

);

如果上述函数成功就返回一个非0值。

光说不做,是不行了,我们还得实践一下:// 最大的文件长度

首选用MFC AppWizard建立一个基于Dialog base的对话框工程,名为GetHardID,

点击finish。

加一个按钮,双击它,点击ok,并在对应的函数中加入如下代码:

LPCTSTR lpRootPathName="c:"; //取C盘

LPTSTR lpVolumeNameBuffer=new char[12];//磁盘卷标

DWORD nVolumeNameSize=12;// 卷标的字符串长度

DWORD VolumeSerialNumber;//硬盘序列号

DWORD MaximumComponentLength;// 最大的文件长度

LPTSTR lpFileSystemNameBuffer=new char[10];// 存储所在盘符的分区类型的长

指针变量

DWORD nFileSystemNameSize=10;// 分区类型的长指针变量所指向的字符串长度

DWORD FileSystemFlags;// 文件系统的一此标志

::GetVolumeInformation(lpRootPathName,

lpVolumeNameBuffer, nVolumeNameSize,

&VolumeSerialNumber, &MaximumComponentLength,

&FileSystemFlags,

lpFileSystemNameBuffer, nFileSystemNameSize);

CString str;

("Seria Num is %lx ",VolumeSerialNumber);

AfxMessageBox(str);

编译,链接并运行程序,单击按钮,在弹出的对话框中就是我们要的序列号。

对不对我们验证一下,进入dos窗口,打入"dir c:/p"命令,怎么样是不是和我们的程序显

示的一模一样

这样我们就在功告成了。

=======cpu adapter id ===========

以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号)

BYTE szSystemInfo[4096]; // 在程序执行完毕后,此处存储取得的系统特征码

UINT uSystemInfoLen = 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 );

if( piai != NULL )

{

dwResult = GetAdaptersInfo( piai, &uSize );

if( ERROR_SUCCESS == dwResult )

{

IP_ADAPTER_INFO* piai2 = piai;

while( piai2 != NULL && ( uSystemInfoLen +

piai2->AddressLength ) < 4096U )

{

CopyMemory( szSystemInfo + uSystemInfoLen,