首页
社区
课程
招聘
[求助]扩展int 13h读取驱动器参数的问题
发表于: 2017-7-8 11:08 5349

[求助]扩展int 13h读取驱动器参数的问题

2017-7-8 11:08
5349

写了一段代码,用nasm编译,然后仅仅用WinHex将U盘的第一扇区覆盖。最后通过BIOS的U盘启动,读取失败。屏幕打印的no DriveParametersPacket。


驱动器号dl=0x80是对应的C盘么?还是主板BIOS不支持扩展int 13h。

请求大神指点、讨论。


主要代码如下,其余都是打印调试的代码。

mov ds,ax
mov di,structDriveParametersPacket ;ds:di structDriveParametersPacket地址
mov ah,0x48
mov dl,0x80
int 0x13

全部代码如下

mov ax,0x900
mov ss,ax
xor sp,sp ;随便设置一下栈
mov ax,0x07c0
mov ds,ax
mov di,structDriveParametersPacket ;ds:di structDriveParametersPacket地址
mov ah,0x48
mov dl,0x80
int 0x13
jnc ok ;cf = 0成功
push 24
push 0x07c0
push msg_wrong
call println_string
add sp,6
jmp $
ok:
push 25
push 0x07c0
push msg_ok
call println_string
add sp,6
jmp $
println_string:
;push 字符串个数
;push 字符串段地址
;push 字符串偏移地址
pusha
push bp
mov ah,0x03 ;读光标位置
xor bh,bh ;页号
int 0x10 ;dh = 行 dl = 列
inc dh ;简单得实现一下换行
mov bp,sp
mov cx,[ss:bp+0x18]
mov ax,[ss:bp+0x16]
mov es,ax 
mov ax,[ss:bp+0x14]
mov bp,ax ;es:bp
mov ah,0x13 ;在Teletype模式下显示字符串
mov al,0x01 ;字符串中只含显示字符,其显示属性在bl中。显示后,光标位置改变
mov bl,0x07
;BIT7:背景是否闪烁。0不闪烁,1闪烁
;BIT6~BIT4为背景色,分别为RGB,000为黑色,111为白色
;BIT3为1,则前景色加亮,为0则不加亮
;BIT2-BIT0为前景色,意义同背景色
int 0x10
pop bp
popa
ret
structDriveParametersPacket: resb 26
msg_ok: db 'get DriveParametersPacket'
msg_wrong: db 'no DriveParametersPacket'
times 510-($-$$) db 0
dw 0xAA55



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 3
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

用的WINHEX直接覆盖U盘第一扇区

2017-7-8 11:12
0
雪    币: 3
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

2017-7-8 11:17
0
雪    币: 3
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
请大神们指点指点
2017-7-8 11:18
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5

dl=0x80对应的是本机的第一块硬盘。在BIOS层面上能看到的只是物理设备和扇区。

1995年以后出厂的BIOS都支持扩展int 13h的,不支持是不可能的。。。

你这个问题之前我也遇到过,就是用int 13h在非硬盘启动的阶段读写硬盘会失败。原因是你在调用int 13h的时候,BIOS还没初始化好int 13h的目标盘,在这个例子里就是你的物理硬盘。。。我当时的解决方案是驻留内存,挂钩int 19h,在int 19h被调用的时候,int 13h的硬盘IO必须是被初始化好的。

2017-7-8 11:40
0
雪    币: 3
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Morgion dl=0x80对应的是本机的第一块硬盘。在BIOS层面上能看到的只是物理设备和扇区。 1995年以后出厂的BIOS都支持扩展int 13h的,不支持是不可能的。 ...
谢谢Morgion指教,我想再请教您几个问题。所说的驻留内存是什么意思。我查了一下:INT  19会将MBR的512字节装载到内存0x7c00中,然后JUMP到0x7c00处,开始执行MBR的可执行程序。这意味着是否需要修改第一块硬盘里的内容了,又JUMP到0x7c00不修改原先的内容的话就失去控制了。U盘启动的话,U盘是否也作为硬盘进行编号,此时U盘应该是装载好了吧,如何确定U盘所在的驱动号呢?这方面资料有点少,也不知道如何寻找,希望大神指点指点,授人以渔
2017-7-8 12:38
0
雪    币: 39
活跃值: (2856)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

楼主查过中断大全吗?参数都弄错了(你把si写成了di):
IBM/MS  INT  13  Extensions  -  GET  DRIVE  PARAMETERS
AH  =  48h
DL  =  drive  (80h-FFh)
DS:SI  ->  buffer  for  drive  parameters  (see  #00273)
Return:CF  clear  if  successful
AH  =  00h
DS:SI  buffer  filled
CF  set  on  error
AH  =  error  code  (see  #00234)

其中ds:si必须指向以下格式的结构(你根本就没有对结构做初始化):

Offset  Size    Description     (Table 00273)
00h    WORD    (call) size of buffer
(001Ah for v1.x, 001Eh for v2.x, 42h for v3.0)
(ret) size of returned data
02h    WORD    information flags (see #00274)04h    DWORD   number of physical cylinders on drive
08h    DWORD   number of physical heads on drive
0Ch    DWORD   number of physical sectors per track
10h    QWORD   total number of sectors on drive
18h    WORD    bytes per sector
---v2.0+ ---
1Ah    DWORD   -> EDD configuration parameters (see #00278)FFFFh:FFFFh if not available
---v3.0 ---
1Eh    WORD    signature BEDDh to indicate presence of Device Path info
20h    BYTE    length of Device Path information, including signature and this
byte (24h for v3.0)
21h  3 BYTEs   reserved (0)
24h  4 BYTEs   ASCIZ name of host bus ("ISA" or "PCI")
28h  8 BYTEs   ASCIZ name of interface type
"ATA"
"ATAPI"
"SCSI"
"USB"
"1394" IEEE 1394 (FireWire)
"FIBRE" Fibre Channel
30h  8 BYTEs   Interface Path (see #00275)38h  8 BYTEs   Device Path (see #00276)40h    BYTE    reserved (0)
41h    BYTE    checksum of bytes 1Eh-40h (two's complement of sum, which makes
the 8-bit sum of bytes 1Eh-41h equal 00h)

Note: If the size is less than 30 on call, the final DWORD will not be returned by a v2.x implementation; similarly for the Device Path info 



2017-7-8 13:38
0
雪    币: 3
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
NutCracker 楼主查过中断大全吗?参数都弄错了(你把si写成了di):IBM/MS  INT  13  Extensions&nb ...
多谢NutCracker,问题解决了,谢谢你。我在百度上下的一份扩展INT  13H调用规范上面参数就写错了,我真的是迷啊!!
@NutCracker  问一下中断大全哪里有下载?我按照你的内容只在维基百科的一个链接里找到了一个网站http://www.ctyme.com/intr/rb-0715.htm。
2017-7-8 15:05
0
雪    币: 39
活跃值: (2856)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
teajiang 多谢NutCracker[em_63],问题解决了,谢谢你。我在百度上下的一份扩展INT 13H调用规范上面参数就写错了,我真的是迷啊!! @NutCracker 问一下中断大全哪里有下载?我按照你 ...
对的,就是那个链接。你可以把整个网站抓下来保存的。
2017-7-9 14:35
0
雪    币: 3
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
NutCracker 对的,就是那个链接。你可以把整个网站抓下来保存的。
感谢!感谢!
2017-7-10 20:40
0
游客
登录 | 注册 方可回帖
返回
//