首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows、Vista和7中,HDD序列号每两个字节翻转一次,但在Windows 8中没有

在Windows、Vista和7中,HDD序列号每两个字节翻转一次,但在Windows 8中没有
EN

Stack Overflow用户
提问于 2013-01-31 10:20:10
回答 5查看 3.5K关注 0票数 15

我需要得到硬盘序列号来使用它作为许可软件的关键。我在这个url:DeviceIoControl中使用了diskid32代码,它与IOCTL_STORAGE_QUERY_PROPERTY.的IO控制代码一起使用了 Win32 API。

啊,真灵。然而,当我再次检查打印在HDD上的实际序列号时,我发现该数字的每2个字节就会被翻转。

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

我想知道在Windows、Vista和7中翻转字节的确切原因,以及为什么不在Windows8中翻转。下一个怎么办?

代码中有一些小改动的部分:

代码语言:javascript
复制
  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 );

        ...
     }
EN

回答 5

Stack Overflow用户

发布于 2013-09-12 00:34:19

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

我的解决方案就是你指出的那个:再次翻转这些值。因此,在调用"flipAndCodeBytes“之后,您可以测试是否是Windows8OS,并翻转值。

在我的例子中,它现在起作用了(对于Windows /Vista/7和Windows 8,我得到了相同的值)。

祝好运!

票数 3
EN

Stack Overflow用户

发布于 2014-05-14 09:47:24

当windows 8或更高版本时,只需使用flibAndCodeBytes函数的“翻转”标志关闭翻转即可。

代码语言:javascript
复制
bool shoulFlipBytes = true;
if(IsWin8OrLater()) shouldFlipBytes = false;

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

您可以使用它来检查windows版本:

代码语言:javascript
复制
#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 Determine if O/S is Windows 7)

票数 3
EN

Stack Overflow用户

发布于 2013-02-15 02:22:42

基本上,您所依赖的数据并不是严格可靠的。驱动器可能会在计算机的生命周期内发生变化;同时获得正确的序列号对您的产品来说甚至都不重要。

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

另一种看待问题的方法是,应用程序应该规定序列号的更改;用户可以被告知许可证问题(无论出于什么原因),并要求与支持部门联系生成的代码(不一定是序列号本身)。根据这段代码,支持可以为客户创建一个新的许可证。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14623397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档