home *** CD-ROM | disk | FTP | other *** search
- ; 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
-
-
-