我需要得到硬盘序列号来使用它作为许可软件的关键。我在这个url:DeviceIoControl中使用了diskid32代码,它与IOCTL_STORAGE_QUERY_PROPERTY.的IO控制代码一起使用了 Win32 API。
啊,真灵。然而,当我再次检查打印在HDD上的实际序列号时,我发现该数字的每2个字节就会被翻转。
一个简单的解决方案可以是简单地将字节翻转回。它工作在Windows,Vista和7,但在windows 8不需要翻转!
我想知道在Windows、Vista和7中翻转字节的确切原因,以及为什么不在Windows8中翻转。下一个怎么办?
代码中有一些小改动的部分:
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 );
...
}发布于 2013-09-12 00:34:19
我在软件许可中使用相同的方法(和相同的代码)。是的,由于某种原因,Windows 8正在返回这个方法的翻转值,我不能说为什么(所以我不能回答您的问题)。
我的解决方案就是你指出的那个:再次翻转这些值。因此,在调用"flipAndCodeBytes“之后,您可以测试是否是Windows8OS,并翻转值。
在我的例子中,它现在起作用了(对于Windows /Vista/7和Windows 8,我得到了相同的值)。
祝好运!
发布于 2014-05-14 09:47:24
当windows 8或更高版本时,只需使用flibAndCodeBytes函数的“翻转”标志关闭翻转即可。
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 Determine if O/S is Windows 7)
发布于 2013-02-15 02:22:42
基本上,您所依赖的数据并不是严格可靠的。驱动器可能会在计算机的生命周期内发生变化;同时获得正确的序列号对您的产品来说甚至都不重要。
我能想到的一种简单的方法是使序列号正常化,例如对数字进行排序;这将使更多的驱动器看起来类似,但我怀疑这将成为一个问题。
另一种看待问题的方法是,应用程序应该规定序列号的更改;用户可以被告知许可证问题(无论出于什么原因),并要求与支持部门联系生成的代码(不一定是序列号本身)。根据这段代码,支持可以为客户创建一个新的许可证。
https://stackoverflow.com/questions/14623397
复制相似问题