Board logo

标题: 关于[获取硬盘物理参数]... [打印本页]

作者: BSLTT     时间: 2005-12-28 10:17    标题: 关于[获取硬盘物理参数]...

关于[获取硬盘物理参数]...   [DOS]

在网上一大把关于如何获取硬盘物理参数的文章.

我已经在网上找了N久,找出以下两种方法能得到硬盘的参数.

(一) .通过对IDE的I/O端口(1F0-1F7)操作获得硬盘参数.

①向端口3F6写入控制字节,建立相应的硬盘控制方式;
②检验硬盘控制器和驱动器的状态(检测端口的第7和第6两位),如果控制器空闲而且驱动器就绪,即可输入命令;
③完整的输入7个字节长度的命令块,一次写入端口1F1H-1F7H,不论是否需要,端口1F1H-1F6H对应的前6个字节的参数必须读出,端口1F7H的输出命令码为“0ECH”;
④检测端口1F7H的第7和第3两位,如果控制器空闲且第3位置1,表示操作结束,即可读取结果;
⑤通过端口1F0H读取100H字节到缓冲区;
⑥再次读取端口1F7H,判断第0位是否为0,如果为0,表示命令成功,否则表示命令失败;

读出的256字节信息的主要内容如下:
┏━━━━┯━━━━━━━━━┯━━━━━┓
┃ 偏移量  │ 内 容                   │长度(字节)┃
┠────┼─────────┼─────┨
┃02H      │柱面数                   │2            ┃
┃06H      │磁头数                   │2            ┃
┃08H      │每磁道所含的字节数 │2            ┃
┃0AH      │没扇区所含的字节数 │2            ┃
┃0CH      │每磁道所含的扇区数 │2            ┃
┃14H      │产品的序列号          │20          ┃  
┃2AH      │硬盘缓冲区容量       │2            ┃
┃2CH      │ECC校验码的长度     │2            ┃
┃2EH      │硬件修正号             │8            ┃
┃36H      │硬盘型号                │40          ┃
┗━━━━┷━━━━━━━━━┷━━━━━┛
以为这个似乎能解决了,但其实只是读出了 C.H.S 和硬盘序列号而以,先不说能访问8.4G以的磁盘空间.现在的电脑的BIOS都能自己检测硬盘,COMS->AUTO.
这样以来,硬盘是以LBA的方式工作,而不是C.H.S方式工作.
如果我们用BIOSDISK()这个函数再加上以上方式得到的C.H.S参数来用的话.就会出错.所以要得到硬盘的LBA参数.

(二)通过调用中断INT13 AH=48H(扩展)来获取硬盘LBA参数

入口:
    AH = 48h
    DL = 驱动器号
    DS:SI = 返回数据缓冲区地址
返回:
    CF = 0, AH = 0 成功
    DS:SI 硬盘参数数据包地址
    CF = 1, AH = 错误码

[至于程序网上很多,我就不贴了]
---------------------------------------------------------------------------------------------------------------
以上这些我在网上找了!出了什么问题不关我的事哎~!哈哈~!
---------------------------------------------------------------------------------------------------------------
现在有一问题无法解决.

如果用TC来写以上程序没有问题,但要用DJGPP来写的话就有问题!
问题出在INT86X()这个中断调用函数.网上的这个例子全是用TC写的,而TC有里一个FP_SEG()和FP_OFF()来获取硬盘参数数据包的段地址和偏移地址.
而我需要用DJGPP来写程序,根本不怎么怎么样获取硬盘参数数据包的段地址和偏移地址来放入INT86X()这个参数里,一但使用这个它就出错~!
(我读的书少,也不知道问题出在哪!)

知道的兄弟们请帮帮忙!谢谢~!

[ Last edited by BSLTT on 2005-12-28 at 10:36 ]
作者: taowentao     时间: 2005-12-28 10:48
连接:
http://www.cn-dos.net/forum/viewthread.php?tid=16538
内有实模式和保护模式的获取硬盘物理参数方法;

从:
http://www.cn-dos.net/forum/atta ... 6&checkid=69e88
下载rtCell_vc5_sources.rar,里面的 rtAta_Disk.c 内有保护模式磁盘操作源代码。
作者: BSLTT     时间: 2005-12-28 10:54
老大~!没有你我真不知道怎么过了~!谢谢~!太感谢了~!
(看看先~!)
作者: BSLTT     时间: 2005-12-28 11:39
老大!不知道是不是我搞错了还是怎么的~!
DJGPP GCC 编译无法通过~!!!
作者: taowentao     时间: 2005-12-28 13:05
用DJGPP GCC 实现rtAta_Disk.h中的

extern void __cdecl repinsw(WORD port, BYTE *buffer, WORD count);  
extern void __cdecl repoutsw(WORD port, BYTE *buffer, WORD count);
/* 从端口 port 输入一字节 */
extern BYTE _cdecl_ in_byte(WORD port);

/* 从端口 port 输入一字 */
extern WORD _cdecl_ in_word(WORD port);

/* 向端口 port 输出一字节 value */
extern void _cdecl_ out_byte(WORD port,WORD value);

/* 向端口 port 输出一字 value */
extern void _cdecl_ out_word(WORD port,WORD value);
几个函数;

用忙等待实现 Sleep(DWORD WAIT_TIMEOUT)延迟函数;

则可读取硬盘参数(调用static void wd_readp(ATA_DISK *pAD));



此程序的其他读写部分调用了实时微内核rtCell的库函数,建议你不要使用。