BBS: Inland Empire Archive Date: 02-23-94 (23:25) Number: 298 From: GARY GLUECKERT Refer#: NONE To: HARRY F. HARRISON Recvd: NO Subj: Re: Get dos errorlevel Conf: (2) Quik_Bas
HF> > Help! I've been trying to find a way to get the dos errorlevel and
HF>am > having some problems. I'm using INT 21H, AH=4DH as shown below.
HF>This > interrupt is known as the GET Child-Program Return Value and
HF>is
HF>The problem is this:
HF>
HF>COMMAND.COM always returns 0.
HF>
Not so: see the code below which I posted earlier:
; MonitorShell (MONSHELL.ASM)
; Written by Tony Elliott
; EllTech Development, Inc.
; 4374 Shallowford Industrial Parkway
; Marietta, GA 30066
; (404) 928-8960 Voice or (404) 928-7111 BBS (HST)
; Released into the public domain.
; This routine is written for Microsoft QuickBASIC 4.x, BASIC 6.x and
Microsoft ; PDS 7.x. Assemble using MASM 5.1: MASM MONSHELL;
; You can link it directly to your program, place it in a LINK library
(.LIB) ; or a .QLB.
; To use it:
; DECLARE SUB MonitorShell ()
; DECLARE FUNCTION FetchErrorLevel% ()
;
; CALL MonitorShell
; SHELL "PkZip -Xxy"
; PRINT "ErrorLevel returned from SHELL:";FetchErrorLevel
.model medium, basic
.code
Old21 Label Dword ;Label pointing to old Int 21h handler
Old21Offset dw ? ;Offset part
Old21Segment dw ? ;Segment part
MonitorSet db 0 ;Our "hooked" flag
ExitCode db ? ;Where we store the exit code
MonitorShell proc uses ds
; From BASIC: CALL MonitorShell
cmp cs:MonitorSet,0 ;Are we already hooked?
jnz MonitorExit ;If so, exit
mov ax,3521h ;Get current vector for int 21h
int 21h
mov cs:Old21Segment,es ;Remember it for later
mov cs:Old21Offset,bx
mov ax,2521h
push cs
pop ds ;Point int 21h handler to our code
mov dx, offset OurInt21
int 21h
mov cs:MonitorSet,-1 ;Set our flag
MonitorExit:
ret
OurInt21: ;Our Int 21h handler
cmp ah,4ch ;Is it a 'terminate' request?
jnz Continue ;If not, continue on
mov cs:ExitCode,al ;Remember the exit code
push ax
push ds
mov ax,2521h ;Unhook ourself after the first hit
mov ds,Old21Segment
mov dx,Old21Offset
int 21h ;Point Int 21h back to original handler
pop ds
pop ax
mov cs:MonitorSet,0 ;Set out flag back to zero
Continue:
jmp dword ptr [Old21] ;Transfer control to original Int 21h
MonitorShell endp
FetchErrorLevel proc
;From BASIC: DECLARE FUNCTION FetchErrorLevel%
; PRINT "Last errorlevel:"; FetchErrorLevel%
mov al,cs:ExitCode ;Put the errorlevel into al
xor ah,ah ;Zero ah
ret ;ErrorLevel returned as result
FetchErrorLevel endp
end
The errorlevel is set in DOS by the last process. There are actually
two variables set - The termination method of the last process and it's
DOS errorlevel. Note that you will receive 0 as the DOS errorlevel in
EVERY case if you do not set the interrupt vector first.
Try the little ditty above, if you don't have the compiled OBJ file
then you can freq it from here with the magic name of MONSHELL or you
can d/l from my basic programming directory.
FIDONet 1:107/270, FREQ=MONSHELL
BBS Phone 516-420-0818, Download filename=FETCHERR.ZIP
Gary G.
--- MsgToss 2.0c
* Origin: The State University of New York at Farmingdale (1:107/270)

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET