本帖最后由 yanaying 于 2021-11-11 14:47 编辑
近期发现华为的电脑100%识别不出来正确的硬盘序列号,只能读一串不知道是啥的数字字母文本。
在AIDA64里面可以看到那串文本在物理驱动器的标识里,不同电脑可能相同。
测试了若干电脑,发现六七台,集中在华为和联想的新电脑上,硬盘型号各不相同。是不是安装什么奇怪的驱动了?
想测试的可以在DOS窗口执行下面三条命令,你会发现读出来的是四位间隔是文本,这是错误的序列号。
正确的序列号是一串字母数字(超过四位,不到20位)。AIDA64可以查到正确的序列号,可以与AIDA64的结果对照。
wmic diskdrive get serialnumber
wmic path win32_physicalmedia get SerialNumber
wmic path Win32_DiskDrive get SerialNumber
查看AIDA64的硬盘序列号,在左边选ata,右边硬盘型号后面括号里的数字就是序列号。
我觉得这个问题会影响大部分靠硬盘序列号识别授权的软件。
已经确认是NVME(NVM Express) 固态硬盘造成的。wmic为什么不支持nvme这很奇怪,虽然windows11已经放弃了wmic,但是windows10还活着啊。
附上MFC源代码,这个代码当初发布的时候,还没有nvme...,看来需要升级了。
[C] 纯文本查看 复制代码 HANDLE hPhysicalDriveIOCTL = 0;
// Try to get a handle to PhysicalDrive IOCTL, report failure
// and exit if can't.
char cszDriveName [256];
sprintf_s(cszDriveName,256,"\\\\.\\PhysicalDrive%d", iDrive);
// Windows NT, Windows 2000, Windows XP - admin rights not required
hPhysicalDriveIOCTL = CreateFileA (cszDriveName, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
{
SecureZeroMemory(m_cszErrorMessage,sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage,256,"%d ReadPhysicalDriveInNTWithZeroRights ERROR CreateFileA(%s) returned INVALID_HANDLE_VALUE",__LINE__, cszDriveName);
}
else
{
STORAGE_PROPERTY_QUERY query;
DWORD dwBytesReturned = 0;
char cszBuffer [1000];
memset ((void *) & query, 0, sizeof (query));
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;
memset (cszBuffer, 0, sizeof (cszBuffer));
if (DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
& query,
sizeof (query),
& cszBuffer,
sizeof (cszBuffer),
& dwBytesReturned, NULL) )
{
STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & cszBuffer;
int snoffset = descrip->SerialNumberOffset+1;
int mnoffset = descrip->ProductIdOffset + 1;
char* cszSerialNumber = (char*)descrip->RawDeviceProperties + snoffset - 0x25;
char* cszModelNumber = (char*)descrip->RawDeviceProperties + mnoffset - 0x25;
}
else
{
DWORD dwErr = GetLastError ();
SecureZeroMemory(m_cszErrorMessage,sizeof(m_cszErrorMessage));
sprintf_s (m_cszErrorMessage,"DeviceIOControl IOCTL_STORAGE_QUERY_PROPERTY error = %d\n", dwErr);
}
CloseHandle (hPhysicalDriveIOCTL);
|