
C语言读取硬盘号的步骤、使用Windows API、使用Linux系统调用、使用第三方库
在C语言中读取硬盘号可以通过多种方式实现,常见的方法包括:使用Windows API、使用Linux系统调用、使用第三方库。接下来,我们将详细讨论其中的一种方法,即使用Windows API读取硬盘号。
一、使用Windows API读取硬盘号
1、引入必要的头文件
在使用Windows API读取硬盘号之前,首先需要引入必要的头文件。这些头文件包含了用于调用系统函数的声明。
#include <windows.h>
#include <stdio.h>
2、定义函数获取硬盘号
接下来,我们定义一个函数,用于获取硬盘号。这个函数将调用Windows API函数DeviceIoControl来获取硬盘号。
BOOL GetHardDriveSerialNumber(char* serialNumber, DWORD length) {
HANDLE hDevice = CreateFile("\\.\PhysicalDrive0", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE) {
return FALSE;
}
STORAGE_PROPERTY_QUERY query;
DWORD bytesReturned;
char buffer[10000];
memset(&query, 0, sizeof(query));
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;
if (!DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), &buffer, sizeof(buffer), &bytesReturned, NULL)) {
CloseHandle(hDevice);
return FALSE;
}
STORAGE_DEVICE_DESCRIPTOR* deviceDescriptor = (STORAGE_DEVICE_DESCRIPTOR*)&buffer;
strcpy_s(serialNumber, length, (char*)(buffer + deviceDescriptor->SerialNumberOffset));
CloseHandle(hDevice);
return TRUE;
}
3、主函数调用读取硬盘号函数
在主函数中,我们调用之前定义的函数来读取硬盘号,并将结果打印出来。
int main() {
char serialNumber[256];
if (GetHardDriveSerialNumber(serialNumber, sizeof(serialNumber))) {
printf("Hard Drive Serial Number: %sn", serialNumber);
} else {
printf("Failed to retrieve hard drive serial number.n");
}
return 0;
}
二、使用Linux系统调用读取硬盘号
在Linux系统中,可以使用系统调用来读取硬盘号。以下是实现步骤:
1、引入必要的头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/hdreg.h>
2、定义函数获取硬盘号
int GetHardDriveSerialNumber(char* serialNumber, size_t length) {
int fd = open("/dev/sda", O_RDONLY | O_NONBLOCK);
if (fd < 0) {
perror("open");
return -1;
}
struct hd_driveid id;
if (ioctl(fd, HDIO_GET_IDENTITY, &id) == 0) {
snprintf(serialNumber, length, "%.20s", id.serial_no);
close(fd);
return 0;
} else {
perror("ioctl");
close(fd);
return -1;
}
}
3、主函数调用读取硬盘号函数
int main() {
char serialNumber[256];
if (GetHardDriveSerialNumber(serialNumber, sizeof(serialNumber)) == 0) {
printf("Hard Drive Serial Number: %sn", serialNumber);
} else {
printf("Failed to retrieve hard drive serial number.n");
}
return 0;
}
三、使用第三方库读取硬盘号
使用第三方库可以简化读取硬盘号的过程。以下是使用libudev库在Linux中读取硬盘号的示例。
1、引入必要的头文件
#include <libudev.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
2、定义函数获取硬盘号
int GetHardDriveSerialNumber(char* serialNumber, size_t length) {
struct udev* udev = udev_new();
if (!udev) {
fprintf(stderr, "Cannot create udev context.n");
return -1;
}
struct udev_enumerate* enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, "block");
udev_enumerate_scan_devices(enumerate);
struct udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate);
struct udev_list_entry* entry;
udev_list_entry_foreach(entry, devices) {
const char* path = udev_list_entry_get_name(entry);
struct udev_device* device = udev_device_new_from_syspath(udev, path);
const char* devtype = udev_device_get_devtype(device);
if (devtype && strcmp(devtype, "disk") == 0) {
const char* serial = udev_device_get_property_value(device, "ID_SERIAL_SHORT");
if (serial) {
strncpy(serialNumber, serial, length - 1);
serialNumber[length - 1] = '