Redir98.Asm
Redir98.Asm
;
; Copyright (c) 1986-1997 Kevin G. Rhoads. All rights reserved.
;
;
;
include forframe.mac
;
;
;DATA segment PUBLIC 'DATA' USE16
DATA segment PUBLIC 'DATA'
DATA ends
dgroup group DATA
;code segment 'CODE' PUBLIC USE16
code segment 'CODE' PUBLIC
assume cs:code,ds:dgroup,es:dgroup,ss:dgroup
;
; USE: integer*2 = redir() OR int*4 = redir()
; if int*4 the high word is the handle value now being used and the
; low word is the value of the handle being replaced
redir proc far
redir2 label far
redir4 label far
public redir,redir2,redir4
save
; push es
mov ah,30h ;? DOS version
int 21h
cmp al,02 ;DOS 3 or higher
ja dos3orhigher_redir
mov ah,51h ;get PSP - undoc DOS 2 version
int 21h ;PSP segment in BX
mov es,bx ;PSP:18h = process file handle table
for DOS 2
mov bx,18h
jmp havepointer_redir
dos3orhigher_redir:
mov ah,62h ;get PSP
int 21h ;PSP segment in BX
mov es,bx ;PSP segment to ES
mov bx,34h ;PSP:34h -> process file handle table
(typically PSP:18h)
les bx,es:[bx] ;get file handle table address
havepointer_redir:
mov al,es:[bx+1] ;get second handle in al (STDOUT)
mov dl,es:[bx+5] ;get sixth handle in dl (First file
opened by process)
mov es:[bx+1],dl ;stuff sixth handle in second
mov ah,0
mov dh,0
; pop es
restore
ret
db '(c) 1986-1994 Kevin G. Rhoads, all rights reserved.'
redir endp
;
; USE: integer*2 = unredir() OR int*4 = unredir()
; if int*4 the high word is the handle value now being used and the
; low word is the value of the handle being replaced
unredir proc far
unredir2 label far
unredir4 label far
public unredir,unredir2,unredir4
save
; push es
mov ah,30h ;? DOS version
int 21h
cmp al,02 ;DOS 3 or higher
ja dos3orhigher_unredir
mov ah,51h ;get PSP - undoc DOS 2 version
int 21h ;PSP segment in BX
mov es,bx ;PSP:18h = process file handle table
for DOS 2
mov bx,18h
jmp havepointer_unredir
dos3orhigher_unredir:
mov ah,62h ;get PSP
int 21h ;PSP segment in BX
mov es,bx ;PSP segment to ES
mov bx,34h ;PSP:34h -> process file handle table
(typically PSP:18h)
les bx,es:[bx] ;get file handle table address
havepointer_unredir:
mov al,es:[bx+1] ;get second handle in al (STDOUT)
mov dl,es:[bx+2] ;get third handle in dl (STDERR)
mov es:[bx+1],dl ;stuff third handle in second
mov ah,0
mov dh,0
; pop es
restore
ret
db '(c) 1986-1994 Kevin G. Rhoads, all rights reserved.'
unredir endp
;
;
; USE: int*2 = nredir(integer*2) OR int*4 = nredir(int*2)
; if int*4 the high word is the handle value now being used and the
; low word is the value of the handle being replaced
nredir proc far
nredir2 label far
nredir4 label far
public nredir,nredir2,nredir4
save
; push es
les si,dword ptr ss:[bp+argone1]
mov si,word ptr es:[si]
mov ah,30h ;? DOS version
int 21h
cmp al,02 ;DOS 3 or higher
ja dos3orhigher_nredir
mov ah,51h ;get PSP - undoc DOS 2 version
int 21h ;PSP segment in BX
mov es,bx ;PSP:18h = process file handle table
for DOS 2
mov bx,18h
jmp havepointer_nredir
dos3orhigher_nredir:
mov ah,62h ;get PSP
int 21h ;PSP segment in BX
mov es,bx ;PSP segment to ES
mov bx,34h ;PSP:34h -> process file handle table
(typically PSP:18h)
les bx,es:[bx] ;get file handle table address
havepointer_nredir:
mov al,es:[bx+1] ;get second handle in al (STDOUT)
mov dl,es:[bx+si] ;get si+1'th handle in dl
mov es:[bx+1],dl ;stuff si+1'th handle in second
mov ah,0
mov dh,0
; pop es
restore
ret 4
db '(c) 1986-1993 Kevin G. Rhoads, all rights reserved.'
nredir endp
;
; USE: call xredir(integer*2) OR int = xredir(integer*2)
xredir proc far
unrdir label far
public xredir,unrdir
save
; push es
les si,dword ptr ss:[bp+argone1]
mov si,word ptr es:[si]
mov ah,30h ;? DOS version
int 21h
cmp al,02 ;DOS 3 or higher
ja dos3orhigher_xredir
mov ah,51h ;get PSP - undoc DOS 2 version
int 21h ;PSP segment in BX
mov es,bx ;PSP:18h = process file handle table
for DOS 2
mov bx,18h
jmp havepointer_xredir
dos3orhigher_xredir:
mov ah,62h ;get PSP
int 21h ;PSP segment in BX
mov es,bx ;PSP segment to ES
mov bx,34h ;PSP:34h -> process file handle table
(typically PSP:18h)
les bx,es:[bx] ;get file handle table address
havepointer_xredir: