无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3348|回复: 6
打印 上一主题 下一主题

[求助] grub能否通过外部命令bios查询硬盘物理序列号

[复制链接]
跳转到指定楼层
1#
发表于 2012-12-26 09:32:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
grub能否通过外部命令bios查询硬盘物理序列号
现在想在grub启动后查询硬盘物理序列号,但没有发现这个功能,只有dos环境 linux环境 和windows环境有这样的功能。
请知道的大侠指点下 grub下如何查询磁盘物理序列号。
2#
发表于 2012-12-26 10:45:35 | 只看该作者
把你的 DOS 程序、Linux 程序的源代码拿过来,重新改造、编译为 grub4dos 的程序,就可以了。

目前的 bios 命令也主要是调用 BIOS 罢了。查询物理序列号,估计不是调用 BIOS,可能还需要访问 IO 指令。

总之,需要生成 grub4dos 的可执行程序才行。
回复

使用道具 举报

3#
 楼主| 发表于 2012-12-27 21:30:32 | 只看该作者

回复 #2 不点 的帖子

网上找到的查看硬盘序列号的源码都需要 dos.h 这类头文件。grub只有 grub4dos.h 这个头文件。
回复

使用道具 举报

4#
发表于 2012-12-27 21:39:06 | 只看该作者
只要有源码,就有希望。dos.h 之类的,都是小问题。

你不妨把源码拿来,说不定这里有人能帮你搞定。
回复

使用道具 举报

5#
 楼主| 发表于 2012-12-29 21:16:38 | 只看该作者

回复 #4 不点 的帖子

6f5df6935f28.rar (940 Bytes, 下载次数: 15) 这是网上找到的dos下查看硬盘id的源码  这个好像只能查看ide硬盘的序列号
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include <string.h>

char *getascii (unsigned int in_data [], int off_start, int off_end);

void main (void)
{
unsigned int dd [256]; /* DiskData */
unsigned int dd_off; /* DiskData offset */
char * sn;
char * test;
char ch;
FILE * fp;
int i;
int temp;
char key[]="TJFM5~SZGLQ^q6WP0.07";
if((fp=fopen("C:\TLQJFD.BIN","w+b"))==NULL){
        printf("cannot opent file\n");
        exit(1);
        }
while (inp (0x1F7) != 0x50)/* Wait for controller not busy */;

outp (0x1F6, 0xA0); /* Get first/second drive */

outp (0x1F7, 0xEC); /* Get drive info data */

while (inp (0x1F7) != 0x58) /* Wait for data ready */;

for (dd_off = 0; dd_off != 256; dd_off++) /* Read "sector" */
        dd [dd_off] = inpw (0x1F0);
sn=getascii(dd,10,19);
test=sn;
printf ("\nThe  Serial Number Hard Disk is %s",sn);

for(i=0;i<=1024;i++)
        putc(rand(),fp);
for(i=0;i<20;i++){
        temp=3*i*i-14*i+159;
        *sn=*sn^key;
        fseek(fp,temp,0);
        putc(*sn,fp);
        sn++;
        }
        printf ("\nTest Serial Number Hard Disk is ");

        for(i=0;i<20;i++){
        temp=3*i*i-14*i+159;
        fseek(fp,temp,0);
        ch=getc(fp);
        if(*test!=ch) {
                printf("\nfailure!");
                ch=0;
                break;
                }
        printf("%c",ch^key);
        test++;
        }

        if(ch!=0) printf("\n\nCongraduate! Successfully register!");
fclose(fp);

}

char *getascii (unsigned int in_data [], int off_start, int off_end)
{
static char ret_val [255];
int loop, loop1;

for (loop = off_start, loop1 = 0; loop <= off_end; loop++)
{
ret_val [loop1++] = (char) (in_data [loop] / 256); /* Get High byte */
ret_val [loop1++] = (char) (in_data [loop] % 256); /* Get Low byte */
}
ret_val [loop1] = '\0'; /* Make sure it ends in a NULL character */
return (ret_val);
}


[ 本帖最后由 2012ybds8 于 2012-12-29 22:25 编辑 ]
回复

使用道具 举报

6#
发表于 2012-12-30 09:41:10 | 只看该作者
while (inp (0x1F7) != 0x50)/* Wait for controller not busy */;

outp (0x1F6, 0xA0); /* Get first/second drive */

outp (0x1F7, 0xEC); /* Get drive info data */

while (inp (0x1F7) != 0x58) /* Wait for data ready */;
这几句是关键.
如果我猜的不错.这是在读写端口.  0X1F7是硬盘端口?  0X50表示硬盘不忙?
0X1F6选择硬盘. 0X1F7发送指令.  0X1F7即是状态寄存器又是指令寄存器
回复

使用道具 举报

7#
 楼主| 发表于 2013-1-1 10:42:48 | 只看该作者

回复 #6 sgw888 的帖子

这个看代码 只能读取ide 硬盘的序列号,对sata硬盘无效。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-16 08:45

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表