home *** CD-ROM | disk | FTP | other *** search
/ PC Media 4 / PC MEDIA CD04.iso / share / prog / int32 / t.c < prev   
Encoding:
C/C++ Source or Header  |  1994-07-23  |  2.2 KB  |  123 lines

  1. #include    <stdio.h>
  2. #include    <dos.h>
  3.  
  4. #include    "int32.h"
  5.  
  6. typedef    unsigned long    uint32;
  7. typedef    void        (*vfp)    (void);
  8.  
  9. unsigned short fooDS;
  10.  
  11. long    int21Cnt;
  12.  
  13. typedef struct    Int21Regs
  14. {
  15.     uint32    ebp;
  16.     uint32    edi;
  17.     uint32    esi;
  18.     uint32     ds;
  19.     uint32     es;
  20.     uint32    edx;
  21.     uint32    ecx;
  22.     uint32    ebx;
  23.     uint32    eax;
  24.     uint32    eip;
  25.     uint32     cs;
  26.     uint32    flags;
  27. }    Int21Regs;
  28.  
  29. Int21Regs    regs [10000];
  30.  
  31. int cdecl foo (uint32    ebp,
  32.            uint32    edi,
  33.            uint32    esi,
  34.            uint32     ds,
  35.            uint32     es,
  36.            uint32    edx,
  37.            uint32    ecx,
  38.            uint32    ebx,
  39.            uint32    eax,
  40.            uint32    eip,
  41.            uint32     cs,
  42.            uint32    flags)
  43. {
  44.     if    (int21Cnt < 10000)
  45.     {
  46.         Int21Regs    *r;
  47.  
  48.         r = ®s [int21Cnt];
  49.         r->ebp    = ebp;
  50.         r->edi    = edi;
  51.         r->esi    = esi;
  52.         r-> ds    =  ds;
  53.         r-> es    =  es;
  54.         r->edx    = edx;
  55.         r->ecx    = ecx;
  56.         r->ebx    = ebx;
  57.         r->eax    = eax;
  58.         r->eip    = eip;
  59.         r-> cs    =  cs;
  60.         r->flags= flags;
  61.         int21Cnt++;
  62.     }
  63.  
  64.     return 1;
  65. }
  66.  
  67. void main (void)
  68. {
  69.     vfp        thunk;
  70.     int        i;
  71.     union    REGS    inregs;
  72.     unsigned short    old21CS;
  73.     unsigned long    old21EIP;
  74.  
  75.     fooDS = _DS;
  76.  
  77.     inregs.x.eax    = 0x204;
  78.     inregs.x.ebx    = 0x21;
  79.     int386 (0x31, &inregs, &inregs);
  80.     old21CS        = (unsigned short)inregs.x.ecx;
  81.     old21EIP    =           inregs.x.edx;
  82.  
  83.            thunk = _makeInt32Thunk (foo, &fooDS, old21CS, old21EIP);
  84.  
  85.     inregs.x.eax    = 0x205;
  86.     inregs.x.ebx    = 0x21;
  87.     inregs.x.ecx    = _CS;
  88.     inregs.x.edx    = thunk;
  89.     int386 (0x31, &inregs, &inregs);
  90.  
  91.     printf ("This is a test.\n");
  92.     printf ("There are three printfs.\n");
  93.     printf ("How many int 21's, I wonder?\n");
  94.  
  95.     inregs.x.eax    = 0x205;
  96.     inregs.x.ebx    = 0x21;
  97.     inregs.x.ecx    = old21CS;
  98.     inregs.x.edx    = old21EIP;
  99.     int386 (0x31, &inregs, &inregs);
  100.  
  101.     printf ("\nInterrupt 21h log:\n\n");
  102.  
  103.     for    (i = 0; i < int21Cnt; i++)
  104.     {
  105.         printf ("EAX = %08lx  EBX = %08lx  ECX = %08lx  EDX = %08lx\n"
  106.             "EDI = %08lx  ESI = %08lx  EBP = %08lx\n"
  107.             "EIP = %08lx   CS = %08x   DS = %08x   ES = %08x\n",
  108.             regs [i].eax,
  109.             regs [i].ebx,
  110.             regs [i].ecx,
  111.             regs [i].edx,
  112.             regs [i].edi,
  113.             regs [i].esi,
  114.             regs [i].ebp,
  115.             regs [i].eip,
  116.             regs [i]. cs,
  117.             regs [i]. ds,
  118.             regs [i]. es);
  119.         printf ("-------------------------------------------------------\n");
  120.     }
  121. }
  122.  
  123.