BBS: Inland Empire Archive Date: 09-06-92 (18:09) Number: 218 From: TONY ELLIOTT Refer#: NONE To: FRANCOIS ROY Recvd: NO Subj: Who are my parents? Conf: (2) Quik_Bas
Francois,
FR>Is it possible for a spawned program (via SHELL or more importantly via
>QBSWAP) to know the name of the program which spawned it? (or even to know
>that it is a shelled program and not a "top-level" program?) How?
There is a way to determine if a program is a child process. However,
I haven't been able to determine the name of the parent process. This
EXE filename is normally store just above the apps copy of the
environment. Apparently this info is destroyed when the parent app
shells.
Here's some code to determine if the app is being executed from a
shell:
'--------------------------Cut here---------------------------------
'MODULE 'TEST.BAS'
DEFINT A-Z
DECLARE FUNCTION ImInAShell% ()
IF ImInAShell% THEN
PRINT "I'm in a shell!"
ELSE
PRINT "I'm not in a shell."
END IF
'---------------------------Cut here----------------------------------
'Module 'INASHELL.SUB'
DEFINT A-Z
REM $INCLUDE: 'QBX.BI'
DECLARE FUNCTION BPeek% (Segment&, Offset%)
DECLARE FUNCTION WPeek% (Segment&, Offset%)
DECLARE FUNCTION ExeName$ (Psp%)
FUNCTION BPeek% (Segment&, Offset%)
'Peeks a byte (two bytes) and returns it as a result of the function
DEF SEG = Segment& 'Point to data segment
Temp% = PEEK(Offset%) 'Peek byte into temp variable
DEF SEG 'Point back to DGroup
BPeek% = Temp% 'Return it
END FUNCTION
FUNCTION ImInAShell%
DIM Reg AS RegTypeX
IntNo = &H21 'Get Current PSP
Reg.ax = &H5100
GOSUB DoDosCall
CurrentPSP = Reg.bx
Reg.ax = &H5200 'Get DOS "List of Lists"
GOSUB DoDosCall
Offset = Reg.bx
'Get pointer to first memory control block (MCB) ES:BX-2
MemBlock& = WPeek(CLNG(Reg.ES), Offset - 2)
DO
Id = BPeek(MemBlock&, 0)
SELECT CASE Id
CASE &H4D 'Part of MCB chain
OwnerPSP = WPeek(MemBlock&, 1)
BlockSize& = WPeek(MemBlock&, 3)
IF OwnerPSP <> 0 AND OwnerPSP <> 8 AND LastPSP <> OwnerPSP THEN
'Valid block
LastPSP = OwnerPSP
ParentPSP = WPeek(CLNG(OwnerPSP), &H16)
IF ParentPSP = OwnerPSP THEN
IF FirstCommandCom = 0 THEN
FirstCommandCom = ParentPSP
ELSE
ImInAShell = -1
EXIT DO
END IF
END IF
ELSEIF OwnerPSP = CurrentPSP THEN
EXIT DO 'Stop when we get to our
END IF 'own PSP.
CASE &H5A 'Last block in chain
EXIT DO
CASE ELSE 'Error - MCB's Destroyed!!
EXIT DO
END SELECT
MemBlock& = MemBlock& + BlockSize& + 1 'Next block in chain
LOOP
EXIT FUNCTION
DoDosCall:
CALL InterruptX(IntNo, Reg, Reg)
RETURN
END FUNCTION
___
X 1st 1.01b #1030s X Take a bite out of crime .. Abolish the IRS!
--- Maximus 2.01wb
* Origin: Oakland BBS (1:133/706)

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