home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 4 Drivers / 04-Drivers.zip / DEVHLP.ZIP / DEVHLP.ASM next >
Assembly Source File  |  1990-09-25  |  6KB  |  229 lines

  1. ; DEVHLP.ASM
  2. ; to produce DEVHLP.SYS ("OS/2 Device Driver in a Can")
  3. ; Andrew Schulman, 32 Andrew St., Cambridge MA 02139
  4. ; with revisions by Art Rothstein, Morgan Labs, San Francisco, CA
  5.  
  6. ; DEF file:
  7. ; LIBRARY DEVHLP
  8. ; DESCRIPTION 'DEVHLP.SYS (c) Andrew Schulman 1990'
  9. ; PROTMODE
  10.  
  11. ; masm devhlp; && link devhlp,devhlp.sys,,,devhlp.def
  12.  
  13. ; put in OS/2 config.sys:
  14. ; device=devhlp.sys
  15.  
  16. ; access with DosOpen ("DEVHLPXX"), DosDevIOCTL (category 128, func 60h)
  17.  
  18. .286p
  19.  
  20. ; the only specific DevHlp that DEVHLP.SYS knows about
  21. VerifyAccess        equ 27h
  22.  
  23. ioctlpkt struc
  24.                     db 13 dup (?)   ; header
  25.         cat         db ?            ; category
  26.         fun         db ?            ; function
  27.         param       dd ?            ; param area
  28.         dataptr     dd ?            ; data area
  29. ioctlpkt ends
  30.  
  31. regs    struc
  32.         regs_ax     dw ?
  33.         regs_bx     dw ?
  34.         regs_cx     dw ?
  35.         regs_dx     dw ?
  36.         regs_si     dw ?
  37.         regs_di     dw ?
  38.         regs_ds     dw ?
  39.         regs_es     dw ?
  40.         regs_flags  dw ?
  41. regs    ends
  42.  
  43. regs_size   equ     size regs
  44.  
  45. dgroup  group   _DATA
  46.  
  47. _DATA   segment word public 'DATA'
  48.  
  49. header  dd -1
  50.         dw 8880h
  51.         dw Strat
  52.         dw 0
  53.         db 'DEVHLPXX'
  54.         db 8 dup (0)
  55.  
  56. DevHlp  dd 0
  57.  
  58. dispch  dw Init             ; 0 -- Init
  59.         dw 12 dup (Error)   ; 1..12 -- not supported
  60.         dw DevOp            ; 13 -- DevOpen
  61.         dw DevOp            ; 14 -- DevClose
  62.         dw Error            ; 15 -- not supported
  63.         dw GenIOCtl         ; 16 -- DevIOCtl
  64.         dw 10 dup (Error)   ; 17..26 -- not supported
  65.  
  66. enddata dw 0
  67. _DATA   ends
  68.  
  69. _TEXT   segment word public 'CODE'
  70.  
  71.         assume cs:_TEXT, ds:DGROUP, es:NOTHING
  72.  
  73. Strat   proc far
  74.         mov di, es:[bx+2]
  75.         and di, 0ffh
  76.         cmp di, 26                       ; max # of commands
  77.         jle Strat1
  78.         call Error
  79.         jmp short Strat2
  80. Strat1: add di, di
  81.         call word ptr [di+dispch]
  82. Strat2: mov word ptr es:[bx+3], ax       ; set request header status
  83.         ret
  84. Strat   endp
  85.  
  86. ; used by DevOpen and DevClose
  87. DevOp   proc near
  88.         mov ax, 0100h
  89.         ret
  90. DevOp   endp
  91.  
  92. GenIOCtl    proc near
  93.         push es
  94.         push bx
  95.         cmp es:[bx].cat, 128
  96.         jne bad
  97.         cmp es:[bx].fun, 60h
  98.         jne bad
  99.         call Do_DevHlp
  100.         jc bad
  101.         mov ax, 0100h            ; no error
  102.         jmp short done
  103. bad:    mov ax, 8101h            ; error
  104. done:   pop bx
  105.         pop es
  106.         ret
  107. GenIOCtl endp
  108.  
  109. Do_DevHlp proc near
  110.         ; verify user's access:
  111.         ; VerifyAccess will shut down user's app in the event of error
  112.         mov ax, word ptr es:[bx+17]      ; selector of parameter block
  113.         mov di, word ptr es:[bx+15]      ; offset
  114.         mov cx, regs_size                ; length to be read
  115.         mov dx, VerifyAccess             ; read
  116.         call DevHlp
  117.         jnc ok1
  118.         ret
  119.  
  120. ok1:    mov ax, word ptr es:[bx+21]      ; selector of data buffer
  121.         mov di, word ptr es:[bx+19]      ; offset
  122.         mov cx, regs_size                ; length to be written
  123.         mov dx, (1 SHL 8) + VerifyAccess ; read/write
  124.         call DevHlp
  125.         jnc ok2
  126.         ret
  127.  
  128. ok2:    push ds                  ; see if we should verify ds
  129.         lds di, es:[bx].param
  130.         mov ax, [di].regs_ds
  131.         pop ds
  132.         test ax, ax              ; need to verify?
  133.         je nods                  ; skip if no
  134.         xor di, di               ; verify seg:0 for read, 1 byte
  135.         mov cx, 1                ; length
  136.         mov dx, VerifyAccess     ; read=0
  137.         call DevHlp
  138.         jc fini                  ; if carry flag set
  139.  
  140. nods:   push ds                  ; see if we should verify es
  141.         lds di, es:[bx].param
  142.         mov ax, [di].regs_es
  143.         pop ds
  144.         test ax, ax              ; need to verify?
  145.         je noes                  ; skip if no
  146.         xor di, di               ; verify seg:0 for read, 1 byte
  147.         mov cx, 1                ; length
  148.         mov dx, VerifyAccess     ; read=0
  149.         call DevHlp
  150.         jc fini                  ; if carry flag set
  151.  
  152. noes:   push ds                  ; going to be bashed!
  153.         push es
  154.         push bx
  155.  
  156.         ; save DevHlp address on stack so we can change ds
  157.         push word ptr DevHlp+2
  158.         push word ptr DevHlp
  159.  
  160.         ; get the parameters for DevHlp from regs
  161.         lds di, es:[bx].param
  162.         mov ax, [di].regs_ax
  163.         mov bx, [di].regs_bx
  164.         mov cx, [di].regs_cx
  165.         mov dx, [di].regs_dx
  166.         mov si, [di].regs_si
  167.         mov es, [di].regs_es
  168.         push    [di].regs_ds
  169.         mov di, [di].regs_di
  170.         pop ds
  171.  
  172.         ; here it is, the whole point of this exercise!
  173.         mov bp, sp
  174.         call dword ptr [bp]
  175.         pop bp          ; pull DevHlp address off stack
  176.         pop bp          ; without changing carry flag
  177.         jc fini
  178.  
  179.         ; save ES:BX to put in out-regs: destroys DX
  180.         mov bp, es
  181.         mov dx, bx
  182.  
  183.         ; get back old DS, ES:BX
  184.         pop bx
  185.         pop es
  186.         pop ds
  187.  
  188.         ; save FLAGS, SI, DS on stack
  189.         pushf
  190.         push si
  191.         push ds
  192.  
  193.         ; set up regs to return to the app
  194.         lds si, es:[bx].dataptr
  195.         mov [si].regs_ax, ax
  196.         pop [si].regs_ds
  197.         pop [si].regs_si
  198.         pop [si].regs_flags
  199.         mov [si].regs_cx, cx
  200.         mov [si].regs_bx, dx
  201.         mov [si].regs_es, bp
  202.         mov [si].regs_di, di
  203.         clc
  204. fini:   ret
  205. Do_DevHlp   endp
  206.  
  207. Error   proc near
  208.         mov ax, 8103h
  209.         ret
  210. Error   endp
  211.  
  212. Init    proc near
  213.         mov ax, es:[bx+14]
  214.         mov word ptr DevHlp, ax
  215.         mov ax, es:[bx+16]
  216.         mov word ptr DevHlp+2, ax
  217.  
  218.         mov word ptr es:[bx+14], offset _TEXT:Init       ; end of code
  219.         mov word ptr es:[bx+16], offset DGROUP:enddata
  220.         mov ax, 0100h
  221.         ret
  222. Init    endp
  223.  
  224. _TEXT   ends
  225.  
  226.         end
  227.  
  228.  
  229.