硬盘的序列号只能采用对硬盘控制器直接操作的方式进行读取,也就是说只能
采用CPU的I/O指令操作硬盘控制器,读取的方法如下面的C语言程序所示:
static int WaitIde()
{
int al;
while ((al=inp(0x1F7)) >=0x80) ;
return al;
}
static void ReadIDE()
{
int al;
int i;
WORD pw[256];
WaitIde();
outp(0x1F6,0xA0);
al = WaitIde();
if ((al&0x50)!=0x50) return;
outp(0x1F6,0xA0);
outp(0x1F7,0xEC);
al = WaitIde();
if ((al&0x58)!=0x58) return;
for (i=0;i< 256;i++)
pw[i] = inpw(0x1F0);
}
---- 上面的程序实际上读取了保存在硬盘控制器内的全部信息,而序列号只是其中
的一部分,位于上面提到的 pw[] 数组的 10 至 20 元素内,即从 &pw[10] 开始的10个WORD内,每个WORD占两个字节,共占用了20个字节。由于该序列号保存时每个WORD的高、低字节是非Intel顺序,也就是说它的高字节在前,低字节在后,所以在使用时需要将高、低字节颠倒一下,这样就能得到完整的序列号。