home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l440 / 2.ddi / CHAP3 / DOSVER.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-25  |  1.4 KB  |  59 lines

  1. /*
  2. DOSVER.C -- set different DOS version numbers 
  3. an alternate to patching programs such as EXE2BIN
  4. */
  5.  
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <process.h>
  9. #include <dos.h>
  10.  
  11. #pragma pack(1)
  12.  
  13. void (interrupt far *old)();
  14. unsigned dosver, old_bx, old_cx;
  15.  
  16. typedef struct {
  17.     unsigned es,ds,di,si,bp,sp,bx,dx,cx,ax,ip,cs,flags;
  18.     } REG_PARAMS;
  19.  
  20. void interrupt far dos(REG_PARAMS r)
  21. {
  22.     if ((r.ax >> 8) == 0x30)
  23.     {
  24.         r.ax = dosver;
  25.         r.bx = old_bx;
  26.         r.cx = old_cx;
  27.     }
  28.     else
  29.         _chain_intr(old);
  30. }
  31.  
  32. void fail(char *s) { puts(s); exit(1); }
  33.  
  34. main(int argc, char *argv[])
  35. {
  36.     int major, minor;
  37.     
  38.     if (argc < 4)
  39.         fail("usage: dosver <major> <minor> <command...>\n\
  40. example: dosver 3 31 exe2bin devlod.exe devlod.com");
  41.  
  42.     if (! (major = atoi(argv[1])))
  43.         fail("bad version number");
  44.     if ((minor = atoi(argv[2])) < 10)       /* e.g. 3.1 to 3.10 */
  45.         minor *= 10;                        
  46.     dosver = (minor << 8) + major;
  47.     
  48.     _asm mov ax, 3000h
  49.     _asm int 21h
  50.     _asm mov old_cx, cx                     /* OEM, serial# */
  51.     _asm mov old_bx, bx
  52.     
  53.     old = _dos_getvect(0x21);               /* save INT 21h */
  54.     _dos_setvect(0x21, dos);                /* hook INT 21h */
  55.     spawnvp(P_WAIT, argv[3], &argv[3]);     /* run command */
  56.     _dos_setvect(0x21, old);                /* unhook INT 21h */
  57.     return 0;
  58. }
  59.