THE DOS ENVIRONMENT BLOCK When the *initial* copy of COMMAND.COM is loaded at boot time, it creates a block of memory that will contain the master or global DOS environment. The environment of DOS consists of a number of text string variables maintained by COMMAND.COM, each variable consisting of a name and an associated string having the form VARIABLE=string of characters in which the end of the string is indicated by a zero byte (ASCIIz string). The environment usually contains a series of such variables, and the end of the environment is indicated by an additional zero byte. The variables are used to pass information to and from the DOS shell COMMAND.COM, batch files and, sometimes, application programs. Variables can be added to the DOS environment via the SET command. Some of these variables, however, are added without user intervention; for example, after a hard-disk booting without an AUTOEXEC.BAT file, the DOS environment contains the following two variables: PATH= COMSPEC=C:\COMMAND.COM The variable PATH= tells COMMAND.COM which directories to search for files, whereas the variable COMSPEC= tells COMMAND.COM from where to reload itself to replace its transient portion located in high RAM. In addition to these variables, other ones (such as PROMPT=) may be present; the contents of the environment can be inspected by entering 'SET' from the DOS prompt line. GLOBAL vs. LOCAL ENVIRONMENT Each program loaded by COMMAND.COM, including any secondary copy of itself, such as when running a batch file from another with the instruction: [d:][\path]command /C xxxx.BAT inherits from the 'parent' a static copy of its environment block. Be aware that the contents of the DOS environment of the 'child' are not transferred or copied to the environment of the 'parent,' and that there is little room in the inherited environment for addition or modification of variables. In setting up an environment variable for the software, especially when the variable is being modified (rather than created), you should make sure that the modification takes place in the global environment of DOS, and not of a secondary command-processor copy, if you wish to preserve the modification. Alternatively, running a batch file via a secondary copy of COMMAND.COM is an excellent manner to use temporary variables or modifications that do not need to be restored or removed at the end of the file. Notice that the DOS 3.2+ command CALL, which can also be used to run a batch file from another, preserves the environment of the 'child' batch file upon termination of the 'parent' file. Whereas the SET command modifies the current DOS environment block (whether it is the global or a local one), switch /E only modifies the global block, even when it is issued under a secondary copy of COMMAND.COM (in which case the local environment is not changed). /E access to the global environment requires use of an undocumented DOS function (52h) which has been found not to work in some buggy DOS 4.00 versions (but works in versions 2.10 through 3.31 and 4.01). ENVIRONMENT SIZE Depending on the DOS version, the environment's size may be up to 32 kbytes (i.e. 32,768 decimal bytes) long. The default environment size of COMMAND. COM, however, is of 160 bytes in versions 2.2x through 3.3x; this space can fill up quickly, in which case DOS displays the message 'Out of environment space' when attempting to add a new variable or increasing an existing one. In DOS versions 3.10 and later, the size of the environment can be modified by including the following statement in the CONFIG.SYS file: SHELL=[d:][\path]COMMAND.COM /P /E:nn in which [d:] and [\path] are the drive and path specification, P indicates that this is to be considered the initial loading of the command processor, and /E:nn specifies the size of the environment in bytes (versions 3.2 and higher) or paragraphs (1 paragraph=16 bytes, version 3.1). Notice that version 3.1 allows a maximum environment of 992 bytes (62 paragraphs). For DOS versions 2.0 up to 3.0, however, the size of the environment can be changed only by patching 1 or 2 bytes in the COMMAND.COM file. (This may be done by using DEBUG as discussed below.) ------------------------------------------------------------------------------ MODIFICATION OF ENVIRONMENT SIZE (DOS 2.X - 3.0) The following DEBUG commands describe the patching of COMMAND.COM in MS-DOS and IBM-PC-DOS versions 2.00 through 3.00, located in a diskette mounted in drive A: 1. Load: 'DEBUG A:\COMMAND.COM' 2. Search for the code which sets size: 's 100 L 5600 BB 0A 00 B4 48 CD 21' This code disassembles to: MOV BX,000A ;environment in paragraphs MOV AH,48 ;fn. allocate memory block INT 21 ;DOS services interrupt 3. DEBUG will then display this code address, which will be 'xxxx:0ECE' for MS-DOS versions 2.0 and 2.1, and 'xxxx:0F20' for version 3.0; 'xxxx' may be any hexadecimal number. (If you obtain a different address, use that one instead.) 4. Add 1 to this address to get the address of two bytes that determine the environment size (0+1=1...8+1=9, 9+1=A, A+1=B...E+1=F, F+1=10 etc), i.e. the '0A 00' in item 2. These two bytes represent the hexadecimal number '000A' (corresponding to the decimal number '0010'), which specifies the size of the environment in paragraphs (blocks of 16 bytes). Thus, 10x16= 160 bytes, which is the default size. NOTE: The bytes of this hexadecimal number are reversed in order, with the least significant byte ('0A') listed first, and the most one ('00') listed second. This is due to the way the "little-endian" microprocessors used by PC and PC-compatible machines store data in memory. To modify the environment size change this number to a hexadecimal digit between 000B (16x11=176 decimal bytes) and 0800 (16x2,048=32,768 decimal bytes) that should also be stored in memory in reversed byte order. This range can be entered with the DEBUG commands: 'e 0ECF 0B 00' through 'e 0ECF 08 00' for DOS 2.x or ~~ ~~ ~~ ~~ 'e 0F21 0B 00' through 'e 0F21 08 00' for DOS 3.0 ~~ ~~ ~~ ~~ After patching, write the patch to the COMMAND.COM copy with the command 'W' and exit DEBUG with the command 'Q'. The patching should be carried out in a copy of COMMAND.COM in a bootable disk(ette) different from the copy used to boot the machine. 5. To see is the patch was successful, reboot with the diskette in drive A, and test the modified command intepreter. (When you are satisfied that the patch was successful, copy the modified COMMAND.COM to the booting disk, *after* saving the original COMMAND.COM in a separate diskette in case of conflicts.) ------------------------------------------------------------------------------ [END]