老文章档案 · 2003 年

CD-ROM出盒、入盒程序

赢政资讯 · 破解文章 · 2003-10-14 · 作者:人气: · 出处:赢政天下整理收藏

概述:

我们在应用程序中常见到用软件控制 CD-ROM 的出、入盒,本文就是实现这种功能的一个例子。主要用到 INT 2FH 的 1510H(Send device driver request) 功能。具体参数详见程序注释。

要用到的几个中断说明如下:

1. IOCTL input 的格式:

偏移量

类型

内容

00H

字节

1AH

01H

字节

00H

02H

字节

03H

03H

字节

11 DUP(?)

0EH

双字

缓冲区地址

12H

缓冲区长度

14H

字节

6 DUP(?)

2. IOCTL output 的格式:

偏移量

类型

内容

00H

字节

1AH

01H

字节

00H

02H

字节

0CH

03H

字节

11 DUP(?)

0EH

双字

缓冲区地址

12H

缓冲区长度

14H

字节

6 DUP(?)

3. 在缓冲区中填入命令再用 INT 2fH 的 1510H 便可以实现 CD-ROM 的各种功能,缓冲的一些命令格式如下:

作用

长度

格式

出盒

1

00

解锁

2

01,00

加锁

2

01,01

入盒

1

05

取CD-ROM 状态

5

06,0,0,0,0

返回:06,xx,xx,0,0

xx,xx为状态字

位0:1 门开,0门关

位1:1未锁,0门锁

位B:1无盘,0有盘

4. 检测 CD-ROM 驱动程序的存在:

AX = 1500H

BX = 0

INT 2fH

返回:BX = CD-ROM 个数

CX = 起始CD-ROM 盘符,0=A:,1=B:等等

5. 发送 Device Driver Request:

AX = 1510H

ES:BX=请求头地址

CX = CD-ROM 的盘号

源程序如下:

; CD-ROM eject/load progrm

; Ver 1.20 ------ Jan 6,1996

CODE SEGMENT

ASSUME CS:CODE,DS:CODE

ORG 100H

START:

jmp installCOPYRIGHT DB 'CD-ROM drive eject/close prg. V1.20',0dh,0ah

DB 'Copyright (c) by Luo Yun Bin, Jan 6,1996',0dh,0ah

DB 'http://asm.yeah.net,Email: luoyunbin@telekbird.com.cn'

DB 0dh,0ah,0ah,24h

D_HELP DB 'Usage: EJ [drive:] [/?|/L|/U]',0dh,0ah

DB ' /? -------- Display this help',0dh,0ah

DB ' /L -------- Lock door',0dh,0ah

DB ' /U -------- Unlock door',0dh,0ah,24h

MESS_WAIT DB '[ENTER] to close, [Esc] to quit.',24h

MESS_ESC DB 'tray keep open...',0dh,0ah,24h

MESS_NO_CD DB 'MSCDEX not installed!',0dh,0ah,24h

MESS_STATUS DB 'There are '

DRV_NUMBER DB '0 CD-ROM drive(s) starting at '

DRV DB 'A:',0dh,0ah,24h

MESS_DRV DB 0dh,' ',0dh

DB 'drive '

DRV1 DB 'A: ',24h

MESS_EJECT DB 'ejecting....',24h

MESS_CLOSE DB 'closing ....',24h

MESS_LOCK DB 'locking ....',24h

MESS_UNLOCK DB 'unlocking...',24h

MESS_DONE DB ' Done!',0dh,0ah,24h

CD_DRV DW ?

FLAG DB ?

;======================================================

REQ_HEAD DB 1ah,0 ;IOCTL input

REQ_CMD DB 3

REQ_ERR DW ?

DB 9 dup (0)

BUF_OFF DW buffer

BUF_SEG DW ?

BUF_LEN DW ?

DB 6 dup (0)

;======================================================

BUFFER DB 5 dup (0) ;Max used 5 bytesCMD_LINE PROC mov si,81h ;处理命令行参数

mov di,80h

cld

cmd_reload:

lodsb

cmp al,0dh

jz conv_end ;将命令行小写字母换成大写

cmp al,'a'

jb conv_ok

cmp al,'z'

ja conv_ok

sub al,20h

conv_ok:

stosb

jmp short cmd_reload

conv_end:

xor al,al

stosb

mov si,80h

cmd_reload1:

lodsb

or al,al

jz cmd_end

cmp al,'/'

jz cmd_switch

cmp al,':'

jnz cmd_reload1

mov al,[si-2]

cmp al,'A'

jb cmd_end

cmp al,'Z'

ja cmd_end

sub al,'A'

xor ah,ah

mov cd_drv,ax

jmp short cmd_reload1

cmd_switch:

lodsb

cmp al,'?'

jz cmd_help

cmp al,'L'

jz cmd_lock

cmp al,'U'

jz cmd_unlock

jmp short cmd_reload1

cmd_end:

ret

cmd_help:

mov dx,offset d_help

call print

int 20h

cmd_lock:

or flag,1

jmp short cmd_reload1

cmd_unlock:

or flag,2

jmp short cmd_reload1CMD_LINE ENDPCD_INT PROC mov ax,1510h

mov buf_seg,cs

mov bx,offset req_head

mov cx,cd_drv

int 2fh

retCD_INT ENDPGET_STATUS PROC mov buffer,6

mov buf_len,5

mov req_cmd,3

call cd_int

retGET_STATUS ENDPEJECT_DISK PROC mov dx,offset mess_drv

call print

mov dx,offset mess_eject

call print mov buffer,0

mov buf_len,1

mov req_cmd,0ch

call cd_int mov dx,offset mess_done

call print

retEJECT_DISK ENDPCLOSE_TRAY PROC mov dx,offset mess_drv

call print

mov dx,offset mess_close

call print mov buffer,5

mov buf_len,1

mov req_cmd,0ch

call cd_int mov dx,offset mess_done

call print

retCLOSE_TRAY ENDPLOCK_DOOR PROC mov dx,offset mess_drv

call print

mov dx,offset mess_lock

call print

mov word ptr buffer,0101h

mov buf_len,2

mov req_cmd,0ch

call cd_int

mov dx,offset mess_done

call print

retLOCK_DOOR ENDPUNLOCK_DOOR PROC mov dx,offset mess_drv

call print

mov dx,offset mess_unlock

call print

mov word ptr buffer,0001h

mov buf_len,2

mov req_cmd,0ch

call cd_int

mov dx,offset mess_done

call print

retUNLOCK_DOOR ENDPCHECK_CDROM PROC mov ax,1500h

xor bx,bx

int 2fh

or bx,bx ;BX = CD-ROM numbers

jnz mscdex_installed mov dx,offset mess_no_cd

call print

int 20h

mscdex_installed:

mov bp,cx

xor bh,bh

add bp,bx

dec bp

cmp cd_drv,cx

jb re_set

cmp cd_drv,bp

jbe par_ok

re_set:

mov cd_drv,cx

par_ok:

add drv_number,bl

add drv,cl

mov cx,cd_drv

add drv1,cl

mov dx,offset mess_status

call print

retCHECK_CDROM ENDPPRINT PROC mov ah,9

int 21h

retPRINT ENDPinstall:

mov dx,offset copyright

call print call cmd_line

call check_cdrom ;检测 CD-ROM 状态

test flag,1 ;如果 /L 参数则 Lock_door

jz ins1

call lock_door

int 20h

ins1:

test flag,2 ;如果 /U 参数则 unlock_door

jz ins2

call unlock_door

int 20h

ins2:

call get_status

test word ptr buffer+1,1 ;如果现在在出盒状态则转入盒

jnz close_it

call eject_disk ;打开 CD-ROM mov dx,offset mess_wait ;等待

call print

xor ax,ax

int 16h

cmp al,1bh

jz _esc_quit

close_it:

call close_tray ;关闭 CD-ROM

int 20h

_esc_quit:

mov dx,offset mess_drv

call print

mov dx,offset mess_esc

call print

int 20hCODE ENDS

END START

相关资讯:

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)|

广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright (C) 1998-2004 winzheng.com All Rights Reserved.

特别感谢 蓝芒科技 提供下载站及论坛服务器

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史