DOS Environment Variables
Rob X Cowan
robc at cup.portal.com
Tue May 7 19:12:02 AEST 1991
> Does anyone know how to permanently change a DOS environment variable from
> within an executing program? PUTENV() changes/creates a variable but it
> is only in effect while the program is running. As soon as I go back to
> DOS, the environment is restored to its original variables. I'm using
> Turbo C.
>
> Thanks for any help,
> Rick Schatzman
The following code demonstrates how to access the global environment
string. It's not the only way, nor the best, but it'll get you started.
masterenvstring is a pointer to the start of the environment list, in which
each variable is an ASCIIZ string of the format <NAME>=<VALUE>. The list
is terminated by a double null. masterenvsize is the size of the Memory
Control block that is allocated for the environment string; I didn't put
any code to deal with its manipulation, but you'll have to deal with it if
you plan on adding entries or you risk a system halt by COMMAND.COM.. fun.
/*
* Demonstrates traversal of master environment string
* Rob S. Cowan 9105.07
*/
#include <dos.h>
char *env_seekend(char far *);
void main(void)
{
union REGS in, out;
struct SREGS segs;
char far *masterenvstr;
int masterenvsize;
/*
* I don't remember if 2E is a supported function or not.. Nothing
* must be linked ahead of COMMAND.COM, or that address will be
* returned.
*/
in.x.ax = 0x352E; /* Get PSP of COMMAND.COM (sortof) */
intdosx(&in, &out, &segs);
/* Get env asciiz string : seg stored at offset 2C of PSP */
masterenvstr = MK_FP(*(unsigned *)MK_FP(segs.es, 0x2C), 0);
/* Get size of env block from MCB preceding it */
masterenvsize = (*(unsigned *)MK_FP(FP_SEG(masterenvstr) - 1, 3)) << 4;
/*
* You must take care to accommodate the memory requirements of
* the environment string. If you wish to add entries you will
* have to allocate/deallocate it with the MCB that precedes the
* environment.
*/
}
/*
* Environment strings are a list of consecutive ASCIIZ strings
* terminated by a null entry. This function will traverse to the
* end of this list and return the address of the null entry.
*/
char *env_seekend(char far *envtrav)
{
for(;;)
{
if (!*envtrav++)
if (!*envtrav)
return envtrav;
}
}
Prost,
-Rob
robc at cup.portal.com
More information about the Comp.lang.c
mailing list