The PSP (with offsets in hexadecimal) is formatted as follows:
(* = undocumented)
PROGRAM SEGMENT PREFIX
offset | size | C O N T E N T S | |
0000h | 2 bytes | int 20h | |
0002h | 2 bytes | segment address, end of allocation block | |
0004h | 1 byte | reserved, normally 0 | |
0005h | 5 bytes | FAR call to MSDOS function dispatcher (int 21h) | |
000Ah | 4 bytes | previous termination handler interrupt vector (int 22h) | |
000Eh | 4 bytes | previous contents of ctrl-C interrupt vector (int 23h) | |
0012h | 4 bytes | prev. critical error handler interrupt vector (int 24h) | |
0016h | 22 bytes | reserved for DOS | |
* 2 bytes | (16) parent process' PSP | ||
* 20 bytes | (18) "handle table" used for redirection of files | ||
002Ch | 2 bytes | segment address of the program's environment block | |
002Eh | 34 bytes | reserved, DOS work area | |
* 4 bytes | (2E) stores the calling process's stack pointer when switching to DOS's internal stack. | ||
* (32) DOS 3.x max open files | |||
* 2 bytes | (3A) size of handle table |these functions are in here | ||
* 4 bytes | (3C) handle table address |but reported addresses vary | ||
0050h | 3 bytes | int 21h, RETF instruction | |
0053h | 2 bytes | reserved - unused? | |
0055h | 7 bytes | reserved, or FCB#1 extension | |
005Ch | 16 bytes | default unopened File Control Block #1 | |
006Ch | 16 bytes | default unopened FCB #2 (overlaid if FCB #1 opened) | |
0080h | 1 byte | parameter length (number of chars entered after filename) | |
0081h | ... | parameters | |
00FFh | 128 bytes | command tail and default Disk Transfer Area (DTA) |
1. The first segment of availible memory is in segment (paragraph) form. For example, 1000h would respresent 64k.
2. Offset 2Ch contains the segment address of the environment.
3. Programs must not alter any part of the PSP below offset 5Ch.
PSP (comments):
offset 00h contains hex bytes CD 20, the int 20h opcode. A program can end by making a jump to this location when the CS points to the PSP. For normal cases, int 21, function 4Ch should be used.
offset 02h contains the segment-paragraph address of the end of memory as reported by DOS. (which may not be the same as the real end of RAM). Multiply this number by 10h or 16 to get the amount of memory availible. ex. 1000h would be 64k.
offset 04h "reserved or used by DOS" according to Microsoft
offset 05h contains a long call to the DOS function dispatcher. Programs may jump to this address instead of calling int 21 if they wish. Used by Basic and other CPM object-code translated programs. It is slower than standard int 21h.
offset 0Ah, 0Eh, 12h vectors (IP, CS)
offset 16h PSP:16h is the segment address of the invoking program's PSP, which * will most often be COMMAND.COM but perhaps may be a secondary non-permanent COMMAND or a multitasking shell, etc. At any rate, the resident shell version of COMMAND.COM has PSP:16H = PSP, which indicates "don't look any lower in memory" for the command interpreter. To find the beginning of the allocation chain, look backwards through the PSP link addresses until the link address is equal to the PSP segment address that it resides in. This should be COMMAND.COM. To find COMMAND.COM's environment, look at the word stored at offset 0BD3h (PC-DOS 3.1 only). This is a segment address, so look there at offset 0.
offset 18h handle alias table (networking). Also you can make PRN go to CON, * CON go to PRN, ERR go to PRN, etc. 0FFh = availible.
offset 2Ch is the segment:offset address of the environment for the program using this particular PSP. This pointer does not point to COMMAND.COM's environment unless it is a second copy of COMMAND.
offset 2Eh the DWORD at PSP+2Eh is used by DOS to store the calling process's * stack pointer when switching to DOS's own private stack - at the end of a DOS function call, SS:SP is restored from this address.
32h, 34h * table of number of file handles (to 64k of handles!)
offset 40h 2 byte field points to the segment address of COMMAND.COM's PSP in * "weird" EXE files produced by Digital Research RASMPC/LINKPC. EXE files created with these tools can cause all sorts of problems with standard MSDOS debugging tools.
offset 50h contains a long call to the DOS int 21 function dispatcher.
offset 5Ch, 65h, 6Ch contain FCB information for use with FCB function calls. The first FCB may overlay the second if it is an extended call; your program should revector these areas to a safe place if you intend to use them.
offset 5Ch 16 bytes first command-line argument (formatted as uppercase 11 character filename)
offset 6Ch 16 bytes second command-line argument (formatted as uppercase 11 character filename)
offset 7Ch-7Fh "reserved or used by DOS"
offset 80h 1 byte number of bytes in command line argument
offset 80h, 81h contain the length and value of parameters passed on the command line.
offset 81h 97 bytes unformatted command line and/or default DTA
offset 0FFh contains the DTA
The PSP is created by DOS for all programs and contains most of the information you need to know about a program running. You can change the environment for the current process, however, but for the parent process, DOS in this case, you need to literally backtrack to DOS or COMMAND.COM's PSP. In order to get there you must look at the current PSP. At offset 16h of the current PSP segment, there a 2 byte segment address to the parent or previous process PSP.
From there you can manipulate the enviroment by looking at offset 2Ch. As you know, at offset 2Ch, there is 2 byte segment address to the environment block.
Try this under debug and explore the addresses located at these offsets;
offset length description ------------------------------------------------------------ 16h 2 segment address of parent process PSP 2Ch 2 segment address of environment block.
Remember under debug you will have to backtrack two times.
Programs Parent -------------------------- command.com none debug.com command.com program debug.com
Comments: