读书人

读取SATA硬盘序列号的步骤

发布时间: 2013-01-17 10:28:54 作者: rapoo

读取SATA硬盘序列号的方法?
本帖最后由 VisualEleven 于 2012-10-10 07:32:12 编辑 各位大侠,VC环境下要去取SATA硬盘序列号与IDE硬盘序列号的方法一样吗?

我用网上的DeviceIoControl这个函数写的,

char sFilePath[64]={0};  
sprintf(sFilePath,"\\\\.\\PHYSICALDRIVE%d",driver);//modify by lonkil 2008-07-13
HANDLE hFile = INVALID_HANDLE_VALUE;
hFile = ::CreateFile(sFilePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
0, NULL);
if (hFile == INVALID_HANDLE_VALUE) return -1;
DWORD dwBytesReturned;
GETVERSIONINPARAMS gvopVersionParams;
DeviceIoControl(hFile,
SMART_GET_VERSION,
NULL,
0,
&gvopVersionParams,
sizeof(gvopVersionParams),
&dwBytesReturned, NULL);
if(gvopVersionParams.bIDEDeviceMap <= 0) return -2;
// IDE or ATAPI IDENTIFY cmd
int btIDCmd = 0;
SENDCMDINPARAMS InParams;
int nDrive =0;
btIDCmd = (gvopVersionParams.bIDEDeviceMap >> nDrive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;

// 输出参数
BYTE btIDOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
if(DoIdentify(hFile,
&InParams,
(PSENDCMDOUTPARAMS)btIDOutCmd,
(BYTE)btIDCmd,
(BYTE)nDrive, &dwBytesReturned) == FALSE) return -3;
::CloseHandle(hFile);
DWORD dwDiskData[256];
USHORT *pIDSector; // 对应结构IDSECTOR,见头文件
pIDSector = (USHORT*)((SENDCMDOUTPARAMS*)btIDOutCmd)->bBuffer;
for(int i=0; i < 256; i++) dwDiskData = pIDSector;
// 取系列号
ZeroMemory(szSerialNumber, sizeof(szSerialNumber));
strcpy(szSerialNumber, ConvertToString(dwDiskData, 10, 19));
// 取模型号
ZeroMemory(szModelNumber, sizeof(szModelNumber));
strcpy(szModelNumber, ConvertToString(dwDiskData, 27, 46));
return 0;


到if(gvopVersionParams.bIDEDeviceMap <= 0) return -2; 这句话时就返回-2,不知道为什么,是因为这个方法只能读取IDE硬盘的序列号吗?

SATA硬盘的序列号如何读呢?

还有就是软件加密还有什么好方法吗?谢谢各位!
[解决办法]
去序列号 应该用到reg的一些信息 具体的东西应该参考 下调用注册表的函数
[解决办法]
Using WMI

[解决办法]
http://www.iflym.com/index.php/code/201203080002.html
[解决办法]
http://blog.chinaunix.net/uid-20680669-id-3125420.html
[解决办法]
你的代码读ide没问题吗?

读书人网 >VC/MFC

热点推荐