//在Linux下获取硬盘物理系列号的程序
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> /* ioperm() */
#include <sys/io.h> /* outb(), inb() */
//#include <asm/io.h> //推荐不要使用这个asm/io.h
#define _DEBUG_ 1
/* get serial number */
int gethddsn(char *ide)
{
unsigned int ide_info[257];
unsigned int info_off;
unsigned long loop2 = 0;
int loop, loop1 = 0;
if( ioperm(0x1F6, 1, 1) ) {
perror("ioperm");
//exit(-1);
return 0;
}
outb(0xA0, 0x1F6);
if( ioperm(0x1F7, 1, 1) ) {
perror("ioperm");
//exit(-1);
return 0;
}
outb(0xEC, 0x1F7);
do {
if( ioperm(0x1F7, 1, 1) ) {
perror("ioperm");
//exit(-1);
return 0;
}
}while( inb(0x1F7) != 0x58 && loop2++ < 0xFFFF );
for( info_off = 0; info_off != 256; info_off++) {
if( ioperm(0x1F0, 2, 1) ) {
perror("ioperm");
//exit(-1);
return 0;
}
ide_info[info_off] = inw(0x1F0);
}
for(loop = 10, loop1 = 0; loop <= 19; loop++)
{
ide[loop1++] = (char)(ide_info[loop]/256);
ide[loop1++] = (char)(ide_info[loop]%256);
}
ide[loop1] = 0x00; //字符串结束
if( loop1 > 20 )
{
printf("*hdsn too len:[%d] error!*\n", loop1);
return 0;
}
return 1;
}
#if _DEBUG_
int main(void) //print hard disk number
{
static char serial[21];
gethddsn(serial);
printf("IDE hard disk s/n: %s\n", serial);
return 0;
}
#endif
/* end of gethddsn.c */
评论30
最新资源