HDD序列号在Windows XP,Vista和7中每2字节翻转一次,但在Windows 8中则不翻

A.D*_*esh 14 ioctl windows-8 deviceiocontrol

我需要获取HDD序列号,以将其用作许可软件的密钥.我在这个url中使用了diskid32代码:http://www.winsim.com/diskid32/diskid32.html 它使用了DeviceIoControl Win32 API和IO控制代码IOCTL_STORAGE_QUERY_PROPERTY.

有效.但是,当我仔细检查硬盘本身上印刷的实际序列号时,我发现该号码的每2个字节都被翻转了.

一个简单的解决方案可能是简单地将字节翻转回来.它适用于Windows XP,Vista和7,但在Windows 8中不需要翻转!

我想知道在Windows XP,Vista和7中翻转字节的确切原因,以及为什么不在Windows 8中翻转.下一个Windows怎么

部分代码略有变化:

  int drive = 0;
  HANDLE hPhysicalDriveIOCTL = 0;
  char driveName [256];
  sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);
  //  Windows NT, Windows 2000, Windows XP - admin rights not required
  hPhysicalDriveIOCTL = CreateFile (driveName, 0,
                           FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                           OPEN_EXISTING, 0, NULL);
  if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
  {
     _STORAGE_PROPERTY_QUERY query;
     DWORD cbBytesReturned = 0;
     char buffer [10000];

     memset ((void *) & query, 0, sizeof (query));
     query.PropertyId = StorageDeviceProperty;
     query.QueryType = PropertyStandardQuery;

     memset (buffer, 0, sizeof (buffer));

     if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
               & query,
               sizeof (query),
               & buffer,
               sizeof (buffer),
               & cbBytesReturned, NULL) )
     {
         _STORAGE_DEVICE_DESCRIPTOR * descrip = (_STORAGE_DEVICE_DESCRIPTOR *) & buffer;
         char serialNumber [1000];
         char modelNumber [1000];
         char vendorId [1000];
         char productRevision [1000];

         flipAndCodeBytes (buffer,
                           descrip -> SerialNumberOffset,
                           1, serialNumber );

        ...
     }
Run Code Online (Sandbox Code Playgroud)

Ja͢*_*͢ck 1

基本上,您所依赖的数据一开始并不严格可靠。驱动器可能会在计算机的整个生命周期内发生变化;始终获得正确的序列号对于您的产品来说并不重要。

我能想到的一个简单的方法是标准化序列号,例如通过对数字进行排序;这将使更多的驱动器看起来相似,但我怀疑这会成为一个问题。

看待问题的另一种方式是应用程序应该提供序列号更改;用户可以被告知许可问题(无论出于何种原因),并被要求使用生成的代码(不一定是序列号本身)联系支持部门。有了此代码,支持人员就可以为客户创建新的许可证。

  • 另一种算法:检查序列号。如果不匹配,则翻转字节并再次检查。 (2认同)