ID Number: Q36311
2.x 3.x 4.00
MS-DOS
Question:
Whenever MS-DOS loads a program, it sets the default DTA to offset 80h
in that program's PSP (program segment prefix). It does not, however,
necessarily reset the DTA at program termination. Specifically, when
the program is run through interrupt 21h service 4Bh (a.k.a. Execute
Program or EXEC), on return to the parent program, the DTA is left
pointing to the child's DTA.
This can cause problems if the parent subsequently requests memory
allocations that result in MS-DOS creating a memory paragraph header
at the location of the child's DTA and then issues a MS-DOS request
that uses the DTA. The result is a "Fatal Memory Allocation Error,"
which requires a reboot of the system. Is there a valid reason for
MS-DOS to leave the DTA pointing into free memory upon termination of
a program run through the EXEC service?
Response:
It is presumed that a MS-DOS program that uses the EXEC service is a
"new" program. The DTA is primarily used by the "old" FCB-style calls.
MS-DOS assumes that a program that is smart enough to use EXEC is not
going to use the old FCB calls.
There is only one set of "new" calls that use the DTA. These calls are
interrupt 21h service 4Eh (File Handle Find First) and interrupt 21h
service 4Fh (File Handle Find Next). You should make sure that the DTA
is explicitly set before making calls to these services.
MS-DOS does not explicitly reset the DTA pointer because the
investment of time to save/restore the DTA address per task is an
extremely poor use of limited space and time. There are more important
things for MS-DOS to do than this. As stated above, a program should
explicitly call interrupt 21h service 1Ah (Set DTA) to explicitly set
the DTA to a known area before calling any MS-DOS services that use
the DTA.