home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 4 Drivers
/
04-Drivers.zip
/
DEVHLP.ZIP
/
DEVHLP.ASM
next >
Wrap
Assembly Source File
|
1990-09-25
|
6KB
|
229 lines
; DEVHLP.ASM
; to produce DEVHLP.SYS ("OS/2 Device Driver in a Can")
; Andrew Schulman, 32 Andrew St., Cambridge MA 02139
; with revisions by Art Rothstein, Morgan Labs, San Francisco, CA
; DEF file:
; LIBRARY DEVHLP
; DESCRIPTION 'DEVHLP.SYS (c) Andrew Schulman 1990'
; PROTMODE
; masm devhlp; && link devhlp,devhlp.sys,,,devhlp.def
; put in OS/2 config.sys:
; device=devhlp.sys
; access with DosOpen ("DEVHLPXX"), DosDevIOCTL (category 128, func 60h)
.286p
; the only specific DevHlp that DEVHLP.SYS knows about
VerifyAccess equ 27h
ioctlpkt struc
db 13 dup (?) ; header
cat db ? ; category
fun db ? ; function
param dd ? ; param area
dataptr dd ? ; data area
ioctlpkt ends
regs struc
regs_ax dw ?
regs_bx dw ?
regs_cx dw ?
regs_dx dw ?
regs_si dw ?
regs_di dw ?
regs_ds dw ?
regs_es dw ?
regs_flags dw ?
regs ends
regs_size equ size regs
dgroup group _DATA
_DATA segment word public 'DATA'
header dd -1
dw 8880h
dw Strat
dw 0
db 'DEVHLPXX'
db 8 dup (0)
DevHlp dd 0
dispch dw Init ; 0 -- Init
dw 12 dup (Error) ; 1..12 -- not supported
dw DevOp ; 13 -- DevOpen
dw DevOp ; 14 -- DevClose
dw Error ; 15 -- not supported
dw GenIOCtl ; 16 -- DevIOCtl
dw 10 dup (Error) ; 17..26 -- not supported
enddata dw 0
_DATA ends
_TEXT segment word public 'CODE'
assume cs:_TEXT, ds:DGROUP, es:NOTHING
Strat proc far
mov di, es:[bx+2]
and di, 0ffh
cmp di, 26 ; max # of commands
jle Strat1
call Error
jmp short Strat2
Strat1: add di, di
call word ptr [di+dispch]
Strat2: mov word ptr es:[bx+3], ax ; set request header status
ret
Strat endp
; used by DevOpen and DevClose
DevOp proc near
mov ax, 0100h
ret
DevOp endp
GenIOCtl proc near
push es
push bx
cmp es:[bx].cat, 128
jne bad
cmp es:[bx].fun, 60h
jne bad
call Do_DevHlp
jc bad
mov ax, 0100h ; no error
jmp short done
bad: mov ax, 8101h ; error
done: pop bx
pop es
ret
GenIOCtl endp
Do_DevHlp proc near
; verify user's access:
; VerifyAccess will shut down user's app in the event of error
mov ax, word ptr es:[bx+17] ; selector of parameter block
mov di, word ptr es:[bx+15] ; offset
mov cx, regs_size ; length to be read
mov dx, VerifyAccess ; read
call DevHlp
jnc ok1
ret
ok1: mov ax, word ptr es:[bx+21] ; selector of data buffer
mov di, word ptr es:[bx+19] ; offset
mov cx, regs_size ; length to be written
mov dx, (1 SHL 8) + VerifyAccess ; read/write
call DevHlp
jnc ok2
ret
ok2: push ds ; see if we should verify ds
lds di, es:[bx].param
mov ax, [di].regs_ds
pop ds
test ax, ax ; need to verify?
je nods ; skip if no
xor di, di ; verify seg:0 for read, 1 byte
mov cx, 1 ; length
mov dx, VerifyAccess ; read=0
call DevHlp
jc fini ; if carry flag set
nods: push ds ; see if we should verify es
lds di, es:[bx].param
mov ax, [di].regs_es
pop ds
test ax, ax ; need to verify?
je noes ; skip if no
xor di, di ; verify seg:0 for read, 1 byte
mov cx, 1 ; length
mov dx, VerifyAccess ; read=0
call DevHlp
jc fini ; if carry flag set
noes: push ds ; going to be bashed!
push es
push bx
; save DevHlp address on stack so we can change ds
push word ptr DevHlp+2
push word ptr DevHlp
; get the parameters for DevHlp from regs
lds di, es:[bx].param
mov ax, [di].regs_ax
mov bx, [di].regs_bx
mov cx, [di].regs_cx
mov dx, [di].regs_dx
mov si, [di].regs_si
mov es, [di].regs_es
push [di].regs_ds
mov di, [di].regs_di
pop ds
; here it is, the whole point of this exercise!
mov bp, sp
call dword ptr [bp]
pop bp ; pull DevHlp address off stack
pop bp ; without changing carry flag
jc fini
; save ES:BX to put in out-regs: destroys DX
mov bp, es
mov dx, bx
; get back old DS, ES:BX
pop bx
pop es
pop ds
; save FLAGS, SI, DS on stack
pushf
push si
push ds
; set up regs to return to the app
lds si, es:[bx].dataptr
mov [si].regs_ax, ax
pop [si].regs_ds
pop [si].regs_si
pop [si].regs_flags
mov [si].regs_cx, cx
mov [si].regs_bx, dx
mov [si].regs_es, bp
mov [si].regs_di, di
clc
fini: ret
Do_DevHlp endp
Error proc near
mov ax, 8103h
ret
Error endp
Init proc near
mov ax, es:[bx+14]
mov word ptr DevHlp, ax
mov ax, es:[bx+16]
mov word ptr DevHlp+2, ax
mov word ptr es:[bx+14], offset _TEXT:Init ; end of code
mov word ptr es:[bx+16], offset DGROUP:enddata
mov ax, 0100h
ret
Init endp
_TEXT ends
end