获取硬盘的序列号、型号和固件版本号,此类功能通常用于做硬盘绑定或硬件验证操作,通过使用Windows API
的DeviceIoControl
函数与物理硬盘驱动程序进行通信,发送ATA
命令来获取硬盘的信息。
以下是该程序的主要功能和流程:
定义常量 IDE_ATAPI_IDENTIFY
和 IDE_ATA_IDENTIFY
分别表示读取 ATAPI
设备和 ATA
设备信息的命令。
- 实现
Trim
函数,用于去除字符串首尾的空格。 - 实现
ConvertToString
函数,用于将DWORD
数组转换为字符串,并通过Trim
函数去除首尾空格。 - 实现
DoIdentify
函数,该函数通过DeviceIoControl
发送SMART
命令,获取硬盘的详细信息。 - 实现
GetDiskInfo
函数,该函数打开物理硬盘设备,并调用DoIdentify
获取硬盘序列号、型号和固件版本号。
在 main
函数中,通过调用 GetDiskInfo
获取硬盘信息,并输出到控制台。
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <iostream>
#include <winioctl.h>
#include <string>
const WORD IDE_ATAPI_IDENTIFY = 0xA1; // 读取ATAPI设备的命令
const WORD IDE_ATA_IDENTIFY = 0xEC; // 读取ATA设备的命令
// 去除字符串首尾的空格
BOOL Trim(char* szStr)
{
int i = 0, j = 0, iFirst = -1, iLast = -1;
int iLen = strlen(szStr);
char szTemp[256] = { 0 };
// 从前往后遍历,获取第一个不为 空格 的下标
for (i = 0; i < iLen; i )
{
if (' ' != szStr[i])
{
iFirst = i;
break;
}
}
// 从后往前遍历,获取第一个不为 空格 的下标
for (i = (iLen - 1); 0 <= i; i--)
{
if (' ' != szStr[i])
{
iLast = i;
break;
}
}
// 字符串全为 空格
if (-1 == iFirst || -1 == iLast)
{
return FALSE;
}
// 获取去除 空格 部分
for (i = iFirst; i <= iLast; i )
{
szTemp[j] = szStr[i];
j ;
}
szTemp[j] = '