home *** CD-ROM | disk | FTP | other *** search
- ; File To Fix DJGCC V1.09 bug that doesn't allow IOCTL read/writes
- ;
- ; Written 2/9/93 by Aaron A. Collins
- ; This file is hereby placed in the public domain.
- ;
- ; Version 1.1 - minor entry/exit fixes 6/1/93 - AAC
- ;
- ; Things that need IOCTL read/write operations simply need to be
- ; recoded to use 0x440A and 0x440B (which DJGCC's go32 passes).
- ; This converts them to the proper 0x4402 or 0x4403 as required,
- ; then executes the DOS interrupt.
- ;
- .RADIX 16
- ;
- CSEG segment para public 'CODE'
- assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
- ;
- main proc near
- ;
- org 100
- ;
- begin: jmp start ; entry point according to 'end' statement
- ;
- olddv: dw 0000
- oldds: dw 0000
- ;
- ;
- start: push es
- push ds
- push cs ; litter seg registers with our CS
- pop ds
- cli
- mov ah,35 ; get vector, save and effect mine.
- mov al,21 ; get vector of DOS fn. interrupt
- int 21
- mov word ptr [olddv],bx ; store vector offset of old...
- mov ax,es
- mov word ptr [oldds],ax ; store vector segment of old...
- lea dx,dosint ; get effective address of int srvr.
- mov ah,25 ; set new interrupt vector
- mov al,21 ; set vector of DOS fn. interrupt
- int 21
- sti
- pop ds
- pop es
- mov dx,((finish-begin+115) SHR 4) ; add file length to PSP >> para
- mov ax,3100 ; DOS TSR with retcd = 00.
- int 21
- mov ax,4c01 ; DOS Program Terminate, retcd = 01
- int 21 ; we should never get here...
- ret
- ;
- main endp
- ;
- even
- ;
- ;dosint proc far ; DOS function int. service routine
- ;
- ; pushf ; simulate building Int stack structure
- ; pushf ; save flags we are about to trash
- ; cmp cx,1E ; make sure this is a Targa read/write?
- ; jnz around
- ; cmp ax,440A ; bogus IOCTL read call?
- ; jz yup ; Yes - modify it, else do DOS call
- ; cmp ax,440BH ; bogus IOCTL write call?
- ; jnz around ; No - do DOS call straight away...
- ;yup: sub al,8
- ; jmp around
- ;wierd: iret ; this is really strange but it works!
- ;around: popf ; restore saved flags
- ; push cs ; simulate building Int stack structure
- ; call wierd
- ; jmp dword ptr cs:[olddv] ; simulated far call to prev. INT 21 vector
- ;
- ;dosint endp
- ;
- dosint proc far ; DOS function int. service routine
- ;
- pushf ; save flags we are about to trash
- cmp cx,1E ; make sure this is a Targa read/write?
- jnz around
- cmp ax,440A ; bogus IOCTL read call?
- jz yup ; Yes - modify it, else do DOS call
- cmp ax,440BH ; bogus IOCTL write call?
- jnz around ; No - do DOS call straight away...
- yup: sub al,8
- around: popf ; restore saved flags
- jmp dword ptr cs:[olddv] ; simulated far call to prev. INT 21 vector
- ;
- dosint endp
- ;
- finish: db 0
- ;
- CSEG ends
- ;
- end begin
-