yanaying 发表于 2021-11-10 10:18

谁有NVME固态硬盘读硬盘序列号代码,没有我就自己写了

本帖最后由 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...,看来需要升级了。

HANDLE hPhysicalDriveIOCTL = 0;

         //Try to get a handle to PhysicalDrive IOCTL, report failure
         //and exit if can't.
      char cszDriveName ;

      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 ;

         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);

yanaying 发表于 2021-11-10 10:21

本帖最后由 yanaying 于 2021-11-11 14:48 编辑



这个红色部分就是wmic识别错误的硬盘序列号,与AIDA64识别出来的不同。


已经确认是NVME造成的

wujishenfu 发表于 2021-11-10 10:37

看出来了,又怎样

jiangteddy 发表于 2021-11-10 10:38

用的翻新硬盘怎么可能让你再看到

E式丶男孩 发表于 2021-11-10 10:48

不是内部或外部命令

yanaying 发表于 2021-11-10 10:49

jiangteddy 发表于 2021-11-10 10:38
用的翻新硬盘怎么可能让你再看到

都是最近新买的电脑,你是不是想说华为用翻新硬盘?

yanaying 发表于 2021-11-10 10:52

E式丶男孩 发表于 2021-11-10 10:48
不是内部或外部命令

在DOS下运行

solly 发表于 2021-11-10 11:04

我有4个盘,M.2接口(NVMe协议)的显示4段,另外两个 SATA 接口的显示正常。

as614001 发表于 2021-11-10 11:13

你觉得有影响授权,实际上没有影响。本质上读取的只是一堆字符串加密算法转换。

Spa495 发表于 2021-11-10 11:20

我还发现品牌电脑的硬盘保护,换块硬盘就
加载不了新系统
页: [1] 2 3
查看完整版本: 谁有NVME固态硬盘读硬盘序列号代码,没有我就自己写了