/** ** ** FINDENV -- A utility for finding the active DOS environment ** ** Version 1.1 05/26/90 (for Microsoft C Version 5.1) ** Copyright (c) D. E. Ekman 1990. All rights reserved. ** ** FINDENV locates the active DOS environment. This is the copy used by the ** current DOS shell (usually COMMAND.COM), and the one that the shell ** passes to programs that it invokes. After finding the active environment, ** FINDENV prints the segment location (in Hex), the size, the amount used, ** and the remaining space in the environment (all in decimal bytes). It then ** prints the contents of the environment for inspection. ** ** This program forms the basis for other programs that may change the active ** environment. For example, it provides a means of generating PATH statements ** that are not limited by the 128-byte size of the command buffer. ** **/ #include #include main() { unsigned envseg, envsize, envinuse; int count; char far *ptr; getsysenv(&envseg, &envsize, &envinuse); printf("\nThe Ekman Utility FINDENV, V1.1\n"); printf("Copyright (c) Donald E. Ekman 1990. All rights reserved.\n"); printf("\nThe active environment begins at %X:0 (Hex).\n",envseg); printf("The size of the environment is %d bytes,\n",envsize); printf(" of which %d bytes are used,",envinuse); printf(" leaving %d bytes free.\n\n",(envsize-envinuse)); printf("Environment contents:\n\n"); ptr = (char far *) ((long) envseg << 16); for (count=0; count= 30)) { *envseg = temp; } else { ptr = (unsigned far *) (((long) (dospsp-1) << 16) | 3); *envseg = dospsp + (*ptr) + 1; } ptr = (unsigned far *) (((long) ((*envseg)-1) << 16) | 3); *envsize = 16*(*ptr); *envinuse = computeenvinuse(*envsize, *envseg); return(0); } unsigned getdospsp() { unsigned temp, temp1; unsigned far *ptr; ptr = (unsigned far *) (((long) _psp << 16) | 0x16); temp = *ptr; while(1) { ptr = (unsigned far *) (((long) temp << 16) | 0x16); temp1 = *ptr; if((!temp1) || (temp1 == temp)) return(temp); else temp = temp1; } } unsigned computeenvinuse(envsize, envseg) unsigned envsize, envseg; { unsigned j; unsigned far *ptr; for(j=0; j<=(envsize-3); j++) { ptr = (unsigned far *) (((long) envseg << 16) | j); if(*ptr == 0) { return(j+2); } } return(envsize); }