首页
社区
课程
招聘
[求助]用哪一个API可以取得硬件的物理序号啊,详情请见内
发表于: 2007-7-11 16:12 10223

[求助]用哪一个API可以取得硬件的物理序号啊,详情请见内

2007-7-11 16:12
10223
以前用的是GetVolumeInformation这个API来取得C盘的,但是发现格式化以后这个号也是要变的,这样作为软件的注册码并不合适啊。希望哪位大侠能告诉下有没有取得硬件物理序列号的API,即使是格式化或重装系统也不会变的那种,当然最好比较唯一硬件的序列号,怕就怕一使用起大量得重复了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 262
活跃值: (56)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2
以前好像听过获取网卡物理地址来做序列号的,因为网卡地址也是唯一的,你搜索一下吧。
2007-7-11 17:36
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
硬盘物理序列号,网卡硬件物理地址,这两个比较常用,99%以上电脑都能取得.
2007-7-11 18:41
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
硬盘物理序列号要怎么样才能获得啊?好像没有API可以用啊,有知道的朋友能不能告诉下.主要是对winxp的情况来说,win9x就不考虑了吧。希望不要进入到ring0获得。。。。
2007-7-18 12:31
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
5
a.  这里没有考虑SCSI硬盘
b.  要使用的几个相关头文件和库文件在附件中
c.  调用事例:
        char szHardDiskID[100] ={0};                //一般来说,硬盘的物理序列号长14字节
        GetDiskPhysicalSN(szHardDiskID);

d.  下面是计算的全部代码:

//需要自定义的常量和结构为:
// IOCTL 指令常数
#define DFP_GET_VERSION   0x00074080
#define DFP_RECEIVE_DRIVE_DATA 0x0007c088
// 用于 IDEREGS 结构 bCommandReg 项的有效值
#define IDE_ATAPI_IDENTIFY  0xA1
#define IDE_ATA_IDENTIFY  0xEC
#define IDENTIFY_BUFFER_SIZE 512

// 结构体定义
// 保存磁盘驱动器的信息
typedef struct _GETVERSIONOUTPARAMS
{
BYTE bVersion;
BYTE bRevision;
BYTE bReserved;
BYTE bIDEDeviceMap;
DWORD fCapabilities;
DWORD dwReserved[4];
} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;
// IDE 寄存器
typedef struct _IDEREGS
{
BYTE bFeaturesReg;
BYTE bSectorCountReg;
BYTE bSectorNumberReg;
BYTE bCylLowReg;
BYTE bCylHighReg;
BYTE bDriveHeadReg;
BYTE bCommandReg;
BYTE bReserved;
} IDEREGS, *PIDEREGS, *LPIDEREGS;
// 发送磁盘指令的输入参数
typedef struct _SENDCMDINPARAMS
{
DWORD cBufferSize;
IDEREGS irDriveRegs;
BYTE bDriveNumber;
BYTE bReserved[3];
DWORD dwReserved[4];
BYTE bBuffer[1];
} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
// 磁盘状态
typedef struct _DRIVERSTATUS
{
BYTE bDriverError;
BYTE bIDEStatus;
BYTE bReserved[2];
DWORD dwReserved[2];
} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
// 发送磁盘指令的输出参数
typedef struct _SENDCMDOUTPARAMS
{
DWORD cBufferSize;
DRIVERSTATUS DriverStatus;
BYTE bBuffer[1];
} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;

////////////////////////////

void GetDiskPhysicalSN(char pchDiskPhysicalSN[14])
{
BYTE IdOutCmd[530];
HANDLE drive=CreateFile ("\\\\.\\PhysicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,

OPEN_EXISTING, 0, NULL);
if (drive == INVALID_HANDLE_VALUE)
{
  // 错误处理
  return ;
}
GETVERSIONOUTPARAMS VersionParams;
DWORD cbBytesReturned = 0;
memset ((void*) &VersionParams, 0, sizeof(VersionParams));
if (!DeviceIoControl(drive, DFP_GET_VERSION, NULL, 0,
&VersionParams,
       sizeof
(VersionParams), &cbBytesReturned, NULL))
{
  // 错误处理
  return ;
}
if (VersionParams.bIDEDeviceMap<=0)
{
  // 错误处理
  return ;
}
BYTE bIDCmd = 0;
SENDCMDINPARAMS scip;
bIDCmd = (VersionParams.bIDEDeviceMap >> 0 & 0x10) ?
IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
memset (&scip, 0, sizeof(scip));
memset (IdOutCmd, 0, sizeof(IdOutCmd));
scip.cBufferSize=IDENTIFY_BUFFER_SIZE;
scip.irDriveRegs.bFeaturesReg=0;
scip.irDriveRegs.bSectorCountReg=1;
scip.irDriveRegs.bSectorNumberReg=1;
scip.irDriveRegs.bCylLowReg=0;
scip.irDriveRegs.bCylHighReg=0;
scip.irDriveRegs.bDriveHeadReg=0xA0 | (((BYTE) drive & 1) << 4);
scip.irDriveRegs.bCommandReg=bIDCmd;
scip.bDriveNumber=(BYTE) drive;
scip.cBufferSize=IDENTIFY_BUFFER_SIZE;
if (!DeviceIoControl(drive, DFP_RECEIVE_DRIVE_DATA, &scip, sizeof(SENDCMDINPARAMS) - 1,
       (LPVOID)&IdOutCmd, sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1, &cbBytesReturned, NULL))
{
  // 错误处理
  return ;
}
unsigned char *pIdSector = (unsigned char *)((PSENDCMDOUTPARAMS) IdOutCmd) -> bBuffer;

pIdSector += 20;
int i;
for (i=0; i<7; i++)
{
         pchDiskPhysicalSN[i*2] = *(pIdSector + 2*i + 1);
         pchDiskPhysicalSN[i*2+1] = *(pIdSector + 2*i);
}
}
上传的附件:
2007-7-18 13:28
0
雪    币: 290
活跃值: (630)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个只能在管理员权限下运行,受限用户下读取不出来的,我也正在查驱动读取hd sn的资料!

用网卡MAC地址不太现实,用API得到的可以通过注册表修改,通过驱动读取硬件,可能一类网卡要写一个驱动!
2007-7-18 13:38
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
没有api  不是所有硬盘都有序列号的
2007-7-18 14:12
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
其实有方法可以在Guest权限得到硬盘物理序列号.
不过确实"不是所有硬盘都有序列号".
2007-7-18 18:55
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
取网卡硬件MAC地址也不需要驱动,不需要管理员权限.
上传的附件:
2007-7-18 19:18
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
网卡地址没用 其实不是网卡硬件的地址 就在注册表里 修改很容易
2007-7-18 19:31
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
mac改的确是可以的。。。

猜想:能不能从CPU那弄点什么?等下又要驱动就麻烦了
2007-7-18 22:08
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
注册表里的那个是逻辑MAC地址.物理MAC地址也可以获得,不需要额外驱动和特殊权限.我在WinXP上测试通过.


目前的CPU已经确定得不到可以唯一的值了.
2007-7-19 08:58
0
雪    币: 290
活跃值: (630)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
dwing,能给一些提示吗?
2007-7-19 09:47
0
雪    币: 290
活跃值: (630)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
GetAdaptersInfo得到的是逻辑MAC地址,物理MAC地址呢?
2007-7-19 09:50
0
雪    币: 290
活跃值: (630)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
Netbios得到的也是逻辑MAC地址
2007-7-19 10:03
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
到google/baidu上搜,一定能找到.
GetAdaptersInfo,Netbios,读注册表都得不到硬件MAC地址.
2007-7-19 11:45
0
雪    币: 290
活跃值: (630)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
其实有方法可以在Guest权限得到硬盘物理序列号

***********************************************
用SCSI可以在xp Guest权限下得到硬盘物理序列号,可是在2003SP2下无法得到

硬件MAC地址通过OID可以得到
2007-7-19 15:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
DeviceIoControl
2007-7-20 16:52
0
游客
登录 | 注册 方可回帖
返回
//