Area: Quik_Bas Msg: #362 Date: 12-19-92 21:47 (Public) From: Rob McKee To: Peter Barney Subject: Re: Returned Exit Code
> my ERLV.COM debug source > debug <erlv.src > -----------------------8<----------------------------- > a ; v---- change this to reflect your system > MOV AX,054B ; Hard coded for my system. &h2b3 after the start of > PUSH DS ; first Command.com listed from "mem /d" PB> Wouldn't you want to use the SECOND command.com? If not, PB> couldn't you just look at the PSP's Parent_Id (word at PB> offset 16h) to tell you where the original command.com is located? > I want to be able to read the list of list and have the program > automatically go to the right byte and get it on any Dos 5 computer, > though... PB> What is the list of lists? DOS keeps a masterlist of the start of many things like Memory control blocks MCB, pointers to device drivers, etc... MCB are better suited for finding COMMAND than PSP. a MCB preceeds each PSP and it easier to step through them. The following is the New and better ERLV.COM which runs on any Dos 5 w/ COMMAND.COM platform. I've tested it on a 286/20, IBM XT, Zenith 150, and a 486-DX2. It works inside batch files, it works outside. it works shelled even.. Although it does return the Errorlevel given by the previos program. The parent hasn't exited yet so no errorlevel from them yet. It works when shelled into command.com with or without a batch file. Supports redirection even... into a file '>', not out off one '<'. Some one with MASM experiance should be able to modify the code so it could be a Obj.. then a Lib function. Erlv.a86 used by A86.COM the shareware Assembler. -------------------------8<-------------------- ORG 0100 jmp main Cur_Blk DW ? MCB_Seg dw ? Last_CMD dw ? Next_MCB dw ? out_100 db 0 out_10 db 0 out_1 db 0 out_str db 0d,0a,024 ErrorLevel db 00 NotDos5msg db 'This Program Only runs with' ContNotDos5 db ' Dos5 and COMMAND.COM',0d,0a,024 OopsMsg db 'This Program Has problems',0d,0a,024 main: push ds push ds push ds push ds push ds mov ah,030 int 33 cmp ax,5 je isDos5 NotDos5: mov dx,offset NotDos5msg Call outstr jmp exit0 Oops: mov dx,offset OopsMsg call outStr jmp exit0 outstr: mov ah,9 int 33 ret Exit0: mov ax,04c00 int 33 isDos5: ; Get list of lists mov ah,052 int 33 ; int 021xh ; es:bx-2 has list of lists dec bx dec bx mov si,bx es: mov ax,[si] ; save a copy of MCB segment cs: mov MCB_Seg,ax MCB_Next: mov ds,ax mov cs:Cur_blk,ax mov ds:ah,[0] ; get first byte of MCB mov bx,ds ; Start of block add bx,w[3] ; add Size of Block controled by MCB add bx,1 ; add 1 to give start of next MCB cmp ah,05a ; Last one?? je Chk_Lst_CMD ; If yes then go do it. cmp ah,04d ; if it's a &h4d then it's a MCB je isMCB jmp Oops ; looks like we're in lala land EXIT! EXIT! IsMCB: pop ds ; lets get the data segment right! push ds mov Next_MCB,bx ; Save the start of next MCB mov ax,Cur_blk ; Restore Cur_Blk mov es,ax ; setup Aux segment register es: ; use it. cmp byte [8],043 ; I could have done this differently but hey! jne getNextMCB ; the program is still less than 1 sector... es: cmp byte [9],04f ; does it say 'COMMAND' jne getNextMCB es: cmp byte [10],04d jne getNextMCB es: cmp byte [11],04d jne getNextMCB es: cmp byte [12],041 jne getNextMCB es: cmp byte [13],04e jne getNextMCB es: cmp byte [14],044 jne getNextMCB ds: mov ax,Cur_Blk ; Yep, it says 'COMMAND' what the segement again? mov Last_CMD,ax ; save it GetNextMCB: ; check the next MCB for 'COMMAND' ds: mov ax,Next_MCB jmp MCB_Next Chk_Lst_CMD: push cs pop ds mov ax,Last_CMD ; Check to see if we found one. cmp ax,0 jg AddCur ; If yes do it to it. jmp long Exit0 AddCur: mov ax,Last_CMD ; get the last cmd segemnt again add ax,02b ; add the offset mov es,ax es: ; use it mov al,b[3] ; get the Errorlevel ds: ; restore the data segemnt mov byte ErrorLevel,al ; save it push cs pop ds MOV CL,030 ; setup for addition CMP AL,00 ; Is the Errorlevel 0 JZ JMP2 ; if it is don't divide jump to the adding XOR AH,AH MOV BX,000A ; divide by 10 DIV BL MOV Out_1,AH ; remainder is the 1's digit XOR AH,AH ; zero out ah DIV BL ; divide again MOV Out_10,AH ; move the 10's digit MOV Out_100,AL ; all thats left is the 100's digit JMP2: ADD Out_1,CL ; make the remainders ASCII ADD Out_10,CL ADD Out_100,CL MOV DX,Offset Out_100 ; setup the offset to string Call OutStr ; display it MOV AL,ErrorLevel ; restore Errorlevel MOV AH,04c ; so when we exit the IF ERRORLEVEL x INT 021 ; in the Batch file will work -------------------------8<-------------------- TTYL -Rob --- EZPoint V2.2 * Origin: Flyer Proof Computer Services (1:125/1212.13)
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