home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pcresour / 1989_05 / uitest.c < prev    next >
Text File  |  1989-02-07  |  4KB  |  130 lines

  1. /* This program will test the DOS shell core program  */
  2. /* Written for Microsoft C, Quick C, and Turbo C      */
  3.  
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <dos.h>
  8. #include <conio.h>
  9. #define MSC 1                /* Set to 0 for Turbo C /*                                              
  10. #if MSC                      /* Smooth differences between compilers */
  11. #pragma pack(1)
  12. #define MAKE_FP(ptr,seg,off) {FP_SEG(ptr) = seg; FP_OFF(ptr) = off;}
  13. #else
  14. #define MAKE_FP(ptr,seg,off) {ptr = MK_FP(seg,off);}
  15. #endif
  16.  
  17.  
  18.  
  19. int  far *IACA;               /* Inter-Application Communication Area */
  20. char far *exec_tail;          /* Command tail buffer */
  21. char far *exec_path;          /* Program name buffer */
  22. char far *ui_buf;             /* Buffer for status data between runs */
  23. int  far *exec_code;          /* Buffer for command code */                                       
  24. unsigned seg_addr, off_addr;
  25. int far *exec_count;          /* We'll count the number of times this */
  26.                               /* program is invoked */
  27. #define EXIT     0            /* List of command codes */                                         
  28. #define RESET    1
  29. #define CMD_EXEC 2
  30. #define DIR_CMD  3
  31. #define SHELL    4
  32. #define ENVR     5
  33. #define PAUSE    0x80
  34.  
  35. void do_exit(void);            /* Function prototypes */                                           
  36. void do_cmd_exec(void);
  37. void do_dir_exec(void);
  38. void do_shell(void);
  39. void ch_dir(void);
  40. void change_env(char *s);
  41.  
  42. void main(void)                 /* Execution starts here */                                     
  43. {
  44.         int ch;
  45.         char *s;
  46.  
  47.         MAKE_FP(IACA,0,0x4f0);  /* Address of IACA */                                                      
  48.  
  49.         seg_addr = *IACA++;     /* Get segment of all buffers  */                                                                                                   
  50.                                 /* Add offsets of each buffer: */
  51.         MAKE_FP(exec_path, seg_addr, *IACA++);
  52.         MAKE_FP(exec_tail, seg_addr, *IACA++);
  53.         MAKE_FP(ui_buf,    seg_addr, *IACA++);
  54.         MAKE_FP(exec_code, seg_addr, *IACA);
  55.         exec_count = (int far *)ui_buf;
  56.  
  57.         puts("Current environment: ");
  58.         for(ch = 0;*environ[ch];ch++)
  59.                 printf("%s\n",environ[ch]);
  60.         
  61.         puts("\n\n\n Shell Core Tester");
  62.         printf("\t\t%d executions in this session\n",(*exec_count)++);
  63.         puts("");
  64.  
  65.  
  66.         puts("\t1. Exit the program");
  67.         puts("\t2. Execute via Command.Com");
  68.         puts("\t3. Execute directly");
  69.         puts("\t4. Shell to Command.Com");
  70.         puts("\t5. SET XYZ=1 2 3");
  71.         puts("\t6. SET XYZ=4 5 6");
  72.         puts("\t7. SET XYZ=");
  73.         printf("\t    Your choice ==>");
  74.         do {
  75.                 ch = getch();
  76.                 } while (ch < '1' || ch > '7');
  77.         switch(ch) {
  78.                 case '1': do_exit(); break;
  79.                 case '2': do_cmd_exec(); break;
  80.                 case '3': do_dir_exec(); break;
  81.                 case '4': do_shell();    break;
  82.                 case '5': s = "XYZ=1 2 3";
  83.                                          change_env(s); break;
  84.                 case '6': s = "XYZ=4 5 6";
  85.                                          change_env(s); break;
  86.                 case '7': s = "XYZ=";
  87.                                          change_env(s); break;
  88.                 }
  89. }
  90.  
  91.  
  92. void do_exit(void)
  93. {
  94.         *exec_code = EXIT;
  95.         exit(0);
  96. }
  97.  
  98. void do_cmd_exec()
  99. {
  100.         char *cp;
  101.         cp = "DIR";
  102.         while(*exec_tail++ = *cp++);
  103.         *exec_code = (CMD_EXEC | PAUSE);
  104.         exit(0);
  105. }
  106.  
  107. void do_dir_exec(void)
  108. {
  109.         char *cp;
  110.         cp = "C:\\BIN\\PMAP.EXE";   /* Put name of any utility here */
  111.         while (*exec_path++ = *cp++);
  112.         *exec_code = DIR_CMD;
  113.         exit(0);
  114. }
  115.  
  116. void do_shell(void)
  117. {
  118.         *exec_code = (SHELL | PAUSE);
  119.         exit(0);
  120. }
  121.  
  122.  
  123. void change_env(char *s)
  124. {
  125.         while(*exec_tail++ = *s++);
  126.         *exec_code = ENVR;
  127.         exit(0);
  128. }
  129.  
  130.