我需要得到硬盘序列号使用它作为密钥许可一个软件。
我用了diskid32此网址中的代码:http://www.winsim.com/diskid32/diskid32.html http://www.winsim.com/diskid32/diskid32.html它使用了设备Io控制Win32 API 的 IO 控制代码为IOCTL_STORAGE_QUERY_PROPERTY.
有效。然而,当我仔细检查 HDD 本身上打印的实际序列号时,我发现该数字的每 2 个字节都被翻转。
一个简单的解决方案可能是简单地flip返回字节。它在 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 );
...
}