我尝试了多种方法来获取正确的硬盘序列号,这些方法是通过使用智能界面并在笔记本电脑中安装驱动程序时从管理员模式获取的,但它们都无法获取实际的硬盘序列号。
实际序列号:S65VNE0NC41799
非管理员模式下的序列号:3635_5630_4EC4_1799_0025_3845_0000_0001。
下面给出用于获取 HDD 序列号的代码。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>
#include <winioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
int ReadPhysicalDriveInNT_StorageQuery (char *deviceName, char *realDiskID, int diskid_len)
{
int retCode = 1;
STORAGE_PROPERTY_QUERY query;
DWORD cbBytesReturned = 0;
char buffer [10000] = {'\0'};
HANDLE hPhysicalDriveIOCTL = 0;
STORAGE_DEVICE_DESCRIPTOR * descrip = NULL;
char serialNumber [128] = {'\0'};
hPhysicalDriveIOCTL = CreateFile (TEXT(deviceName), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
{
printf("ReadPhysicalDriveInNT_StorageQuery ERROR:"
" CreateFile(%s) returned INVALID_HANDLE_VALUE\n"
, deviceName);
goto ERR_EXIT;
}
memset ((void *) & query, 0, sizeof (query));
memset (buffer, 0, sizeof (buffer));
query.QueryType = PropertyStandardQuery;
query.PropertyId = StorageDeviceProperty;
if (!DeviceIoControl(hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
& query,
sizeof (query),
&buffer,
sizeof (buffer),
& cbBytesReturned, NULL))
{
goto ERR_EXIT;
}
descrip = (STORAGE_DEVICE_DESCRIPTOR *) & buffer;
printf("\nserial number : %s\n\n", buffer + descrip->SerialNumberOffset);
ERR_EXIT:
CloseHandle (hPhysicalDriveIOCTL);
return retCode;
}
int main()
{
char dname[256] = {0};
char diskID[64];
int i = 0;
for(i=0; i< 4;i++)
{
sprintf(dname, "\\\\.\\PhysicalDrive%d", i);
dname[strlen(dname)] = '\0';
ReadPhysicalDriveInNT_StorageQuery(dname, diskID, sizeof(diskID));
}
return 0;
}
我通过这种方式得到了错误的硬盘序列号,那么在 NVME SSD 中获取硬盘序列号的确切方法是什么。