庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>安全技术>软件破解>反汇编>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

CD-ROM出盒、入盒程序

 作者:本站收集   日期:2005-5-27
字号选择〖 〗/ 双击滚屏 单击停止   
概述:
     我们在应用程序中常见到用软件控制 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
上一篇:汉字显示编程示例    下一篇:用汇编计算圆周率  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-5-27
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿