[3829] | 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 |
|
---|