home *** CD-ROM | disk | FTP | other *** search
/ Phoenix CD 2.0 / Phoenix_CD.cdr / 01e / msjall.zip / MSJV3-5.ZIP / MSCTSR.ZIP / HOOK.C next >
C/C++ Source or Header  |  1988-08-31  |  1KB  |  42 lines

  1.  
  2. /* Figure 2. A simple program that hooks a vector and then chains to the
  3. /* original handler. */
  4.  
  5.    #include <dos.h>
  6.  
  7.    #define DOS_INT 0x21
  8.  
  9.    void far interrupt newint21();            /* DOS */
  10.  
  11. /* Note: Original MSJ code had a typo in the following line of code -
  12.          oldint21 is correct, not oldin21 as in the article figure */
  13.  
  14.    void (interrupt far * oldint21)();
  15.    unsigned long syscalls = 0;
  16.  
  17.    void interrupt far newint21(es,ds,di,si,bp,sp,bx,dx,cx,ax,
  18.                                ip,cs,flags)
  19.    unsigned es, ds, di, si, bp, sp, bx, dx, cx, ax, ip, cs, flags;
  20.    {
  21.          syscalls++;
  22.          _chain_intr(oldint21);
  23.    }
  24.  
  25.    main()
  26.    {
  27.          /* save old int21 vector */
  28.          oldint21 = _dos_getvect(DOS_INT);
  29.          _dos_setvect(DOS_INT, newint21);
  30.  
  31. /* Note : the printf in the following line is not in the original
  32.           MSJ code - will return 2 syscalls, rather than 1 as per 
  33.       the article */
  34.  
  35.      printf("Waiting for you ... please hit a key\n\n"); 
  36.          getch();
  37.          printf("%lu syscalls\n", syscalls);
  38.          /* restore old int21 vector */
  39.          _dos_setvect(DOS_INT, oldint21);
  40.      exit(0);
  41.    }
  42.