您的位置:首页精文荟萃破解文章 → CD-ROM出盒、入盒程序

CD-ROM出盒、入盒程序

时间:2004/10/15 1:02:00来源:本站整理作者:蓝点我要评论(0)

 

 


概述:

     我们在应用程序中常见到用软件控制 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 install
COPYRIGHT	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 bytes
CMD_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_reload1
CMD_LINE	ENDP
CD_INT		PROC
		mov	ax,1510h
mov buf_seg,cs
mov bx,offset req_head
mov   cx,cd_drv
int   2fh
		ret
CD_INT		ENDP
GET_STATUS	PROC
		mov   buffer,6
mov buf_len,5
mov req_cmd,3
call  cd_int
ret
GET_STATUS	ENDP
EJECT_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
ret
EJECT_DISK   ENDP
CLOSE_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
ret
CLOSE_TRAY   ENDP
LOCK_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
ret
LOCK_DOOR	ENDP
UNLOCK_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
ret
UNLOCK_DOOR	ENDP
CHECK_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
ret
CHECK_CDROM   ENDP
PRINT		PROC
		mov   ah,9
int   21h
ret
PRINT		ENDP
install:
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   20h
CODE		ENDS
END START


    
    
     
    
    
     

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 去除winrar注册框方法

最新文章 比特币病毒怎么破解 比去除winrar注册框方法 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)通过Access破解MSSQL获得数据

人气排行 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)qq相册密码破解方法去除winrar注册框方法(适应任何版本)怎么用手机破解收费游戏华为无线猫HG522破解如何给软件脱壳基础教程