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

  1. /*
  2. FUNC0E32.C -- take over INT 21h Function 0Eh; return 32 in AL
  3.  
  4. cl func0e32.c
  5. func0e32 lastdrv
  6. */
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <process.h>
  11. #include <dos.h>
  12.  
  13. #pragma pack(1)
  14.  
  15. typedef struct {
  16. #ifdef __TURBOC__
  17.     unsigned bp,di,si,ds,es,dx,cx,bx,ax;
  18. #else
  19.     unsigned es,ds,di,si,bp,sp,bx,dx,cx,ax;     /* same as PUSHA */
  20. #endif
  21.     unsigned ip,cs,flags;
  22.     } REG_PARAMS;
  23.  
  24. void interrupt far dos(REG_PARAMS r);
  25.  
  26. void (interrupt far *old)();
  27. unsigned long calls = 0;
  28. unsigned long changed = 0;
  29.  
  30. void fail(char *s) { puts(s); exit(1); }
  31.  
  32. main(int argc, char *argv[])
  33. {
  34.     if (argc < 2)
  35.         fail("usage: func0e32 [program name] <args...>");
  36.     
  37.     /* hook INT 21 */
  38.     old = _dos_getvect(0x21);
  39.     _dos_setvect(0x21, dos);
  40.  
  41.     /* run command */
  42.     spawnvp(P_WAIT, argv[1], &argv[1]);
  43.     
  44.     /* unhook INT 21h */
  45.     _dos_setvect(0x21, old);
  46.     printf("\n%lu DOS calls\n", calls);
  47.     printf("%lu changed\n", changed);
  48. }
  49.  
  50. void interrupt far dos(REG_PARAMS r)
  51. {
  52.     calls++;
  53.     if ((r.ax >> 8) == 0x0E)
  54.     {
  55.         (*old)();
  56.         r.ax = 0x0E00 + 32;
  57.         changed++;
  58.     }
  59.     else
  60.         _chain_intr(old);
  61. }
  62.