| 1 | ; $Id: dosa.asm,v 1.1 2000-07-16 22:18:14 bird Exp $
 | 
|---|
| 2 | ;
 | 
|---|
| 3 | ; 16-bits Dos calls overloader
 | 
|---|
| 4 | ;
 | 
|---|
| 5 | ; Copyright (c) 2000 knut st. osmundsen (knut.stange.osmundsen@pmsc.no)
 | 
|---|
| 6 | ;
 | 
|---|
| 7 | ; Project Odin Software License can be found in LICENSE.TXT
 | 
|---|
| 8 | ;
 | 
|---|
| 9 |     .386
 | 
|---|
| 10 | 
 | 
|---|
| 11 | 
 | 
|---|
| 12 | ;
 | 
|---|
| 13 | ; Include files
 | 
|---|
| 14 | ;
 | 
|---|
| 15 |     include devsegdf.inc
 | 
|---|
| 16 |     include os2.inc
 | 
|---|
| 17 |     include devsym.inc
 | 
|---|
| 18 | 
 | 
|---|
| 19 | 
 | 
|---|
| 20 | ;
 | 
|---|
| 21 | ; Exported symbols
 | 
|---|
| 22 | ;
 | 
|---|
| 23 |     public  DOS16OPEN
 | 
|---|
| 24 |     public  DOS16CLOSE
 | 
|---|
| 25 |     public  DOS16DEVIOCTL
 | 
|---|
| 26 | 
 | 
|---|
| 27 | 
 | 
|---|
| 28 | ;
 | 
|---|
| 29 | ; extrns
 | 
|---|
| 30 | ;
 | 
|---|
| 31 |     extrn   _strategyAsm0:FAR
 | 
|---|
| 32 |     extrn   _DOS16OPEN:FAR     ;70
 | 
|---|
| 33 |     extrn   _DOS16CLOSE:FAR    ;59
 | 
|---|
| 34 | 
 | 
|---|
| 35 |     extrn   ThunkStack16To32:PROC
 | 
|---|
| 36 |     extrn   ThunkStack32To16:PROC
 | 
|---|
| 37 |     extrn   TKSSBase:PROC
 | 
|---|
| 38 | 
 | 
|---|
| 39 |     extrn   _TKSSBase16:DWORD
 | 
|---|
| 40 |     extrn   _R0FlatCS16:WORD
 | 
|---|
| 41 |     extrn   _R0FlatDS16:WORD
 | 
|---|
| 42 | 
 | 
|---|
| 43 | DATA16 SEGMENT
 | 
|---|
| 44 | DATA16 ENDS
 | 
|---|
| 45 | 
 | 
|---|
| 46 | 
 | 
|---|
| 47 | 
 | 
|---|
| 48 | CODE16 SEGMENT
 | 
|---|
| 49 |     ASSUME cs:CODE16, ds:DATA16
 | 
|---|
| 50 | 
 | 
|---|
| 51 | hElf    EQU      0fE1Fh                  ; Value of the elf handle
 | 
|---|
| 52 | 
 | 
|---|
| 53 | ;;
 | 
|---|
| 54 | ; Fake opening of $elf.
 | 
|---|
| 55 | ;
 | 
|---|
| 56 | ; PASCAL convention: Parameters pushed left to right of C prototype.
 | 
|---|
| 57 | ;                    We'll have to do the cleanup.
 | 
|---|
| 58 | ;
 | 
|---|
| 59 | ; @cproto APIRET  APIENTRY  DosOpen(
 | 
|---|
| 60 | ;                               PSZ     pszFname,
 | 
|---|
| 61 | ;                               PHFILE  phfOpen,
 | 
|---|
| 62 | ;                               PUSHORT pusAction,
 | 
|---|
| 63 | ;                               ULONG   ulFSize,
 | 
|---|
| 64 | ;                               USHORT  usAttr,
 | 
|---|
| 65 | ;                               USHORT  fsOpenFlags,
 | 
|---|
| 66 | ;                               USHORT  fsOpenMode,
 | 
|---|
| 67 | ;                               ULONG   ulReserved);
 | 
|---|
| 68 | ;
 | 
|---|
| 69 | ; @returns
 | 
|---|
| 70 | ; @param     pszFname       bp +1c  dd
 | 
|---|
| 71 | ; @param     phfOpen        bp +18  dd
 | 
|---|
| 72 | ; @param     pusAction      bp +14  dd
 | 
|---|
| 73 | ; @param     ulFSize        bp +10  dd
 | 
|---|
| 74 | ; @param     usAttr         bp + e  dw
 | 
|---|
| 75 | ; @param     fsOpenFlags    bp + c  dw
 | 
|---|
| 76 | ; @param     fsOpenMode     bp + a  dw
 | 
|---|
| 77 | ; @param     ulReserved     bp + 6  dd
 | 
|---|
| 78 | ;
 | 
|---|
| 79 | ; @uses
 | 
|---|
| 80 | ; @equiv
 | 
|---|
| 81 | ; @time
 | 
|---|
| 82 | ; @sketch
 | 
|---|
| 83 | ; @status
 | 
|---|
| 84 | ; @author    knut st. osmundsen (knut.stange.osmundsen@pmsc.no)
 | 
|---|
| 85 | ; @remark
 | 
|---|
| 86 | DOS16OPEN PROC FAR
 | 
|---|
| 87 |     ASSUME CS:CODE16, DS:NOTHING, ES:NOTHING, SS:NOTHING
 | 
|---|
| 88 |     push    bp
 | 
|---|
| 89 |     mov     bp, sp
 | 
|---|
| 90 | 
 | 
|---|
| 91 |     ;
 | 
|---|
| 92 |     ; Is this an attempt to open the ELF device driver?
 | 
|---|
| 93 |     ;
 | 
|---|
| 94 |     push    ds
 | 
|---|
| 95 |     push    bx
 | 
|---|
| 96 |     xor     ebx, ebx
 | 
|---|
| 97 |     lds     bx, [bp + 1ch]
 | 
|---|
| 98 |     mov     eax, ds:[ebx]
 | 
|---|
| 99 |     cmp     eax, 'ved\'                 ;'\dev' assumes low-case!
 | 
|---|
| 100 |     jne     do_notelf
 | 
|---|
| 101 |     mov     eax, ds:[ebx+4]
 | 
|---|
| 102 |     cmp     eax, 'fle\'                 ;'\elf'
 | 
|---|
| 103 |     jne     do_notelf
 | 
|---|
| 104 |     mov     eax, ds:[ebx+8]
 | 
|---|
| 105 |     cmp     ax, '$'                     ; '$'\0
 | 
|---|
| 106 |     jnz     do_notelf
 | 
|---|
| 107 | 
 | 
|---|
| 108 |     ;
 | 
|---|
| 109 |     ; found filename string equal to "\dev\$elf".
 | 
|---|
| 110 |     ;
 | 
|---|
| 111 |     ; return phFile equal to Elf handle and pusAction set to 1 (FILE EXISTED).
 | 
|---|
| 112 |     ;
 | 
|---|
| 113 |     lds     bx, [bp + 18h]
 | 
|---|
| 114 |     mov     word ptr ds:[bx], hElf      ; *phFile <- hElf
 | 
|---|
| 115 |     lds     bx, [bp + 14h]
 | 
|---|
| 116 |     mov     word ptr ds:[bx], 1         ; *pusAction <- File existed.
 | 
|---|
| 117 | 
 | 
|---|
| 118 | do_ret:
 | 
|---|
| 119 |     ;
 | 
|---|
| 120 |     ; restore bx and ds and return successfully.
 | 
|---|
| 121 |     ;
 | 
|---|
| 122 |     pop     bx
 | 
|---|
| 123 |     pop     ds
 | 
|---|
| 124 |     xor     eax, eax
 | 
|---|
| 125 |     leave
 | 
|---|
| 126 |     ret     01ah
 | 
|---|
| 127 | 
 | 
|---|
| 128 | do_notelf:
 | 
|---|
| 129 |     push    dword ptr [bp +01ch]
 | 
|---|
| 130 |     push    dword ptr [bp +018h]
 | 
|---|
| 131 |     push    dword ptr [bp +014h]
 | 
|---|
| 132 |     push    dword ptr [bp +010h]
 | 
|---|
| 133 |     push    word  ptr [bp + 0eh]
 | 
|---|
| 134 |     push    word  ptr [bp + 0ch]
 | 
|---|
| 135 |     push    word  ptr [bp + 0ah]
 | 
|---|
| 136 |     push    dword ptr [bp + 06h]
 | 
|---|
| 137 |     call far ptr _DOS16OPEN
 | 
|---|
| 138 |     pop     bx
 | 
|---|
| 139 |     pop     ds
 | 
|---|
| 140 |     leave
 | 
|---|
| 141 |     ret     01ah
 | 
|---|
| 142 | DOS16OPEN ENDP
 | 
|---|
| 143 | 
 | 
|---|
| 144 | 
 | 
|---|
| 145 | ;;
 | 
|---|
| 146 | ; Fake close of $elf
 | 
|---|
| 147 | ; @cproto    APIRET  APIENTRY DosClose(HFILE hf);
 | 
|---|
| 148 | ; @returns   OS/2 return code. (NO_ERROR)
 | 
|---|
| 149 | ; @param     hFile  bp + 6
 | 
|---|
| 150 | ; @uses      EAX
 | 
|---|
| 151 | ; @status    completly implemented.
 | 
|---|
| 152 | ; @author    knut st. osmundsen (knut.stange.osmundsen@pmsc.no)
 | 
|---|
| 153 | DOS16CLOSE PROC FAR
 | 
|---|
| 154 |     ASSUME CS:CODE16, DS:NOTHING, ES:NOTHING, SS:NOTHING
 | 
|---|
| 155 |     push    bp
 | 
|---|
| 156 |     mov     bp, sp
 | 
|---|
| 157 | 
 | 
|---|
| 158 |     ;
 | 
|---|
| 159 |     ; Is it the elf handle?
 | 
|---|
| 160 |     ;
 | 
|---|
| 161 |     mov     ax, [bp + 6]
 | 
|---|
| 162 |     cmp     ax, hElf
 | 
|---|
| 163 |     jne     dc_notelf
 | 
|---|
| 164 |     xor     eax, eax
 | 
|---|
| 165 |     leave
 | 
|---|
| 166 |     ret     2
 | 
|---|
| 167 | 
 | 
|---|
| 168 | dc_notelf:
 | 
|---|
| 169 |     push    word ptr [bp + 6]           ; can't jump to higher privilege
 | 
|---|
| 170 |     call    _DOS16CLOSE
 | 
|---|
| 171 |     leave
 | 
|---|
| 172 |     ret     2
 | 
|---|
| 173 | DOS16CLOSE ENDP
 | 
|---|
| 174 | 
 | 
|---|
| 175 | 
 | 
|---|
| 176 | 
 | 
|---|
| 177 | ;;
 | 
|---|
| 178 | ;
 | 
|---|
| 179 | ; @cproto    APIRET  APIENTRY   DosDevIOCtl(
 | 
|---|
| 180 | ;                                   PVOID   pData,
 | 
|---|
| 181 | ;                                   PVOID   pParms,
 | 
|---|
| 182 | ;                                   USHORT  usFun,
 | 
|---|
| 183 | ;                                   USHORT  usCategory,
 | 
|---|
| 184 | ;                                   HFILE   hDev);
 | 
|---|
| 185 | ; @returns
 | 
|---|
| 186 | ; @param     pData       bp +10 dd
 | 
|---|
| 187 | ; @param     pParms      bp + c dd
 | 
|---|
| 188 | ; @param     usFun       bp + a dw
 | 
|---|
| 189 | ; @param     usCategory  bp + 8 dw
 | 
|---|
| 190 | ; @param     hDev        bp + 6 dw
 | 
|---|
| 191 | ; @param
 | 
|---|
| 192 | ; @uses      eax
 | 
|---|
| 193 | ; @sketch
 | 
|---|
| 194 | ; @status    completly implemented
 | 
|---|
| 195 | ; @author    knut st. osmundsen (knut.stange.osmundsen@pmsc.no)
 | 
|---|
| 196 | ; @remark
 | 
|---|
| 197 | DOS16DEVIOCTL PROC FAR
 | 
|---|
| 198 |     ASSUME CS:CODE16, DS:NOTHING, ES:NOTHING, SS:NOTHING
 | 
|---|
| 199 |     LOCAL   pkt:Packet
 | 
|---|
| 200 | 
 | 
|---|
| 201 |     push    bx
 | 
|---|
| 202 |     push    es
 | 
|---|
| 203 | 
 | 
|---|
| 204 | 
 | 
|---|
| 205 |     ;
 | 
|---|
| 206 |     ; Check that it really is the elf handle.
 | 
|---|
| 207 |     ;
 | 
|---|
| 208 |     mov     ax, word ptr [bp + 6]
 | 
|---|
| 209 |     cmp     word ptr [bp + 6], hElf
 | 
|---|
| 210 |     jne     ddioc_invalidhandle
 | 
|---|
| 211 | 
 | 
|---|
| 212 |     ;
 | 
|---|
| 213 |     ; Then we'll have to call _strategyAsm0. But first will have to
 | 
|---|
| 214 |     ; build a request packet for this IOCtl
 | 
|---|
| 215 |     ;
 | 
|---|
| 216 |     mov     pkt.PktLen, LENGenIOCTL     ; PktLen          db      ?               ; length in bytes of packet
 | 
|---|
| 217 |     mov     pkt.PktUnit, 0              ; PktUnit         db      ?               ; subunit number of block device
 | 
|---|
| 218 |     mov     pkt.PktCmd, CMDGenIOCTL     ; PktCmd          db      ?               ; command code
 | 
|---|
| 219 |     mov     pkt.PktStatus, 0            ; PktStatus       dw      ?               ; status word
 | 
|---|
| 220 |     mov     pkt.PktFlag, 0              ; PktFlag         db      ?               ; disk driver internal flags
 | 
|---|
| 221 |     mov     pkt.PktFlag+1, 0            ;                 db      3 dup(?)        ; reserved
 | 
|---|
| 222 |     mov     pkt.PktFlag+2, 0            ;
 | 
|---|
| 223 |     mov     pkt.PktFlag+3, 0            ;
 | 
|---|
| 224 |     mov     pkt.PktDevLink, 0           ; PktDevLink      dd      ?               ; device multiple-request link
 | 
|---|
| 225 |     mov     ax, [bp + 8]
 | 
|---|
| 226 |     mov     byte  ptr pkt.PktData + 0, al   ; Category Code
 | 
|---|
| 227 |     mov     ax, [bp + 0ah]
 | 
|---|
| 228 |     mov     byte ptr pkt.PktData + 1, al    ; Function code
 | 
|---|
| 229 |     mov     eax, [bp + 0ch]
 | 
|---|
| 230 |     mov     dword ptr pkt.PktData + 2, eax  ; pointer to parameter packet
 | 
|---|
| 231 |     mov     eax, [bp + 10h]
 | 
|---|
| 232 |     mov     dword ptr pkt.PktData + 6, eax  ; pointer to data packet
 | 
|---|
| 233 |     mov     word ptr  pkt.PktData + 10, 0   ; SFN of the driver.
 | 
|---|
| 234 | 
 | 
|---|
| 235 |     ; do the call - who cleans up the stack?
 | 
|---|
| 236 |     mov     bx, ss
 | 
|---|
| 237 |     mov     es, bx
 | 
|---|
| 238 |     lea     bx, pkt
 | 
|---|
| 239 |     ;call    far ptr _strategyAsm0      ; why did this make it into a 16:32 call?
 | 
|---|
| 240 |     call    far ptr CODE16:_strategyAsm0
 | 
|---|
| 241 | 
 | 
|---|
| 242 |     ;
 | 
|---|
| 243 |     ; We'll check if the status to see wether it failed or not.
 | 
|---|
| 244 |     ;
 | 
|---|
| 245 |     test    pkt.PktStatus, STERR
 | 
|---|
| 246 |     jnz     ddioc_error
 | 
|---|
| 247 |     test    pkt.PktStatus, STDON
 | 
|---|
| 248 |     jz      ddioc_notdone
 | 
|---|
| 249 |     test    pkt.PktStatus, STINTER
 | 
|---|
| 250 |     jnz     ddioc_interchar
 | 
|---|
| 251 |     test    pkt.PktStatus, STBUI
 | 
|---|
| 252 |     jnz     ddioc_busy
 | 
|---|
| 253 |     xor     eax, eax                    ; return NO_ERROR
 | 
|---|
| 254 |     jmp ddioc_ret
 | 
|---|
| 255 | 
 | 
|---|
| 256 | ddioc_error:
 | 
|---|
| 257 |     mov     ax, pkt.PktStatus
 | 
|---|
| 258 |     and     ax, STECODE
 | 
|---|
| 259 |     jmp ddioc_ret
 | 
|---|
| 260 | 
 | 
|---|
| 261 | ddioc_notdone:
 | 
|---|
| 262 |     mov     eax, 31                     ; ERROR_GEN_FAILURE
 | 
|---|
| 263 |     jmp ddioc_ret
 | 
|---|
| 264 | 
 | 
|---|
| 265 | ddioc_interchar:
 | 
|---|
| 266 |     mov     eax, 31                     ; ERROR_GEN_FAILURE
 | 
|---|
| 267 |     jmp ddioc_ret
 | 
|---|
| 268 | 
 | 
|---|
| 269 | ddioc_busy:
 | 
|---|
| 270 |     mov     eax, 31                     ; ERROR_GEN_FAILURE
 | 
|---|
| 271 |     jmp ddioc_ret
 | 
|---|
| 272 | 
 | 
|---|
| 273 | ddioc_invalidhandle:
 | 
|---|
| 274 |     mov     eax, 6                      ; ERROR_INVALID_HANDLE
 | 
|---|
| 275 |     jmp     ddioc_ret
 | 
|---|
| 276 | 
 | 
|---|
| 277 | ddioc_ret:
 | 
|---|
| 278 |     pop     es
 | 
|---|
| 279 |     pop     bx
 | 
|---|
| 280 |     leave
 | 
|---|
| 281 |     ret     0eh
 | 
|---|
| 282 | DOS16DEVIOCTL ENDP
 | 
|---|
| 283 | 
 | 
|---|
| 284 | 
 | 
|---|
| 285 | 
 | 
|---|
| 286 | CODE16 ENDS
 | 
|---|
| 287 | 
 | 
|---|
| 288 | END
 | 
|---|
| 289 | 
 | 
|---|
| 290 | 
 | 
|---|