硬盘序列号翻转在Windows XP,Vista和Windows 7,但不是在Windows 8中,

2019-08-16 16:24发布

我需要的硬盘序列号 ,用它作为许可软件的关键。 我用diskid32代码在这个网址: http://www.winsim.com/diskid32/diskid32.html它使用的DeviceIoControl的Win32 API与IOCTL_STORAGE_QUERY_PROPERTY的IO控制代码。

有效。 然而,当我用加倍印在硬盘本身的实际序列号检查,我发现,每2个字节数的被翻转。

一个简单的解决方案可能是简单地翻转字节后面。 它的工作在Windows XP,Vista和Windows 7,但在Windows 8不需要翻转!

我想知道确切的原因字节在Windows XP,Vista和Windows 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 );

        ...
     }

Answer 1:

我用我的软件许可相同的方法(和相同的代码)。 是的,Windows 8中由于某种原因被翻转返回值这个方法,我不能说,为什么(所以我不能回答你的问题)。

我的解决办法是,你指出了一个:再次翻转值。 因此,呼吁“flipAndCodeBytes”后,你可以测试是否是Windows 8操作系统,并翻转值。

在我的情况下,它的工作,现在(我得到了相同的值适用于Windows XP / VISTA / 7和Windows 8)。

祝好运!



Answer 2:

只是关闭使用flibAndCodeBytes功能的“翻转”标志翻转当Windows 8或更大。

bool shoulFlipBytes = true;
if(IsWin8OrLater()) shouldFlipBytes = false;

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

您可以使用此功能来检查的Windows版本:

#include <windows.h>

bool IsWin8OrLater() {
    DWORD version = GetVersion();
    DWORD major = (DWORD) (LOBYTE(LOWORD(version)));
    DWORD minor = (DWORD) (HIBYTE(LOWORD(version)));

    return (major > 6) || ((major == 6) && (minor >= 2));
}

据http://msdn.microsoft.com/en-us/library/ms724832%28VS.85%29.aspx (感谢ChrisV 确定是否O / S是Windows 7中 )



Answer 3:

基本上你依赖于数据,这不是严格可靠的开始。 驱动器可以在计算机的寿命变化; 所有同时获得完全正确的序列号是不是你的产品甚至是重要的。

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

看待这个问题的另一种方法是,应用程序应该计提的序列号发生变化; 用户可以对发牌的问题(无论何种原因)被告知,并要求用生成的代码(不一定是序列号本身)联系技术支持部门。 鉴于此代码,支持就可以为客户创建一个新的许可证。



Answer 4:

似乎你必须通过API来检查的Windows版本,如果分支中加入()到你的代码版本是否足够高

我发现开发者等问题,此方法 - 那种IOCTL代码依赖于程序正​​在使用Win7上\ Win8的+管理员权限运行。 在我们的软件的原因,那就是与系统中的权限和客户端软件运行时严格遵守用户权限运行服务



Answer 5:

对于许可检查的目的,你真的不在乎。 所有你需要知道的是,一些配置导致的翻转,有的没有,而且它可以在许可的有效期期间改变。

因此,接受这两种型号:

string serial = get_serial();
if (license_check(serial)) {
    licensed = true;
    return;
}
serial = swap_bytes(serial);
if (license_check(serial)) {
    licensed = true;
    return;
}

(我看林峰建议这评论)

没有脆弱的OS检查,当申请了许可证的用户没有关于它是否失败的后顾之忧翻转的权利。 只是很高兴的用户。



文章来源: HDD serial number flipped every 2 bytes in Windows XP, Vista and 7 but not in Windows 8