2017-10-31 16:23:21 u010953692 阅读数 7218

1. fdisk hdparm

# fdisk -l  查看硬盘位置
# hdparm -i /dev/sda1
# hdparm -i /dev/sdb1 |grep -i serialno
SerialNo=Z1Z0MKWS 硬盘序列号

参考:
1.Linux 查看硬盘序列号 命令

2010-05-27 16:16:00 lfj200701 阅读数 747

Linux下读硬盘序列号的程序

/*
* gethddsn.c
*
* Get serial number of ide hard disk.
* example: my Maxtor 15G 's s/n is K306S04C.
*
* Compile with: gcc -O2 gethddsn.c
*
* Xiaoming DONG <xmdong@263.net>
* Aug 24, 2000
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>  /* ioperm() */
#include <asm/io.h>  /* outb(), inb() */

/* 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);
  }
  outb(0xa0, 0x1f6);
  if (ioperm(0x1f7, 1, 1)) {
    perror("ioperm"); exit(-1);
  }
  outb(0xec, 0x1f7);
  do {
    if (ioperm(0x1f7, 1, 1)) {
       perror("ioperm"); exit(-1);
    }
  } while (inb(0x1f7) != 0x58 && loop2++ < 0xffff);
  for (info_off=0; info_off != 256; info_off++) {
    if (ioperm(0x1f0, 2, 1)) {
     perror("ioperm"); exit(-1);
    }
    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] = 0;
  if (loop1 > 40) printf("*error*/n");
  return 0;
}

void main()  /* print hard disk number */
{
  static char serial[41];
  gethddsn(serial);
  printf("IDE hard disk s/n: %s/n", serial);
}
/* end of gethddsn.c */

2015-04-20 17:10:54 libinbin_1014 阅读数 914
//虚拟机大都是SCSI硬盘,获取硬盘序列号的方法不知道,但是本人将虚拟机的硬盘类型更改为IDE类型,通过下面的代码获取成功是00000000000000001
<span style="font-family: Arial, Helvetica, sans-serif;">#include <stdio.h></span>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/hdreg.h>
int getHardSerialNo(char *info)
{
        struct hd_driveid id;
        int fd = open("/dev/sda", O_RDONLY|O_NONBLOCK);
        if (fd < 0) {
                fd = open("/dev/sda", O_RDONLY|O_NONBLOCK);
                if (fd < 0) return 1;
        }
        if(!ioctl(fd, HDIO_GET_IDENTITY, &id))
        {
                strcpy(info,id.serial_no);
        }
		printf("%s\n",info);
        return 0;
}
int main()
{
	char info[50];
	getHardSerialNo(info);
	printf("****%s\n",info);
	return 0;
}

2006-12-19 16:49:00 Suprman 阅读数 5456

本代码利用linux的hdparm命令,结合pipe管道技术巧妙的获得硬盘序列号,可方便的用于软件的加密或认证领域

 char buf[256],info[1024]={0};
 char *pos;
 int i;

 snbuf[0]=0;
 fp=popen("hdparm -i /dev/hda","r");
 if(fp)
 {
  while(fgets(buf,sizeof(buf),fp))
  {
      i=strlen(info)+strlen(buf);
      if(i>1023)break;
     strcat(info,buf);
  }
  pos=strcasestr(info,"SerialNo=");
  if(pos)pos+=9;
  i=0;
  while(pos)
  {
   if((*pos<='Z'&&*pos>='A')
    ||(*pos<='z'&&*pos>='a')
    ||(*pos<='9'&&*pos>='0')
    ||(*pos==' '))
   {
       snbuf[i]=*pos;
       i++;
       if(i>buflen-10)break;
       pos++;
   }
   else
   {
      break;
   }
  }
  snbuf[i]=0;
 }
pclose(fp);

2017-07-16 17:52:01 qq_14976351 阅读数 930

获取硬盘序列号型号实例程序如下:

typedef struct _HDD_INFO
{
    char Model[64];
    char SN[64];
    char md5_hash[40];
} HDD_INFO, *PHDD_INFO;
void FillHDDStruct(IN PHDD_INFO hddinfo)
{
    struct hd_driveid id;
    char model[64]={0};
    char sn[64]={0};

    int fd = open("/dev/hda", O_RDONLY|O_NONBLOCK);
    if (fd < 0)
    {
        //try to open /dev/hda
        fd = open("/dev/sda", O_RDONLY|O_NONBLOCK);
        if(fd < 0)
        {
            perror("detecting harddisk");
            return;
        }
    }
    if(!ioctl(fd, HDIO_GET_IDENTITY, &id))
    {
        //Build HDD Model
        RTrim(id.model, 40, model);
        n = strlen(model);
        strcpy(hddinfo->Model, model);
        //Build SerialNumber
        LTrim(id.serial_no, sn);
        n = strlen(sn);
        strcpy(hddinfo->SN, sn);

    }
}

在上面的程序中,最关键的步骤就是ioctl(fd, HDIO_GET_IDENTITY, &id)。
1. 什么是ioctl
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下:
int ioctl(int fd, ind cmd, …);
其中fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。
ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。

没有更多推荐了,返回首页