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

  1. #include    <stdlib.h>
  2. #include    <mem.h>
  3.  
  4. #include    "int32.h"
  5.  
  6. extern    char    _interrupt32Thunk [];
  7. extern    int    _interrupt32ThunkSize;
  8. extern    int    _I32TdsLoadLabel;
  9. extern    int    _I32TcallLabel;
  10. extern    int    _I32TchainCmp;
  11. extern    int    _I32TchainLabel;
  12. extern    int    _I32TchainOffset;
  13. extern    int    _I32TchainSel;
  14.  
  15. static int interrupt32ThunkSize =    (int)&_interrupt32ThunkSize;
  16. static int I32TdsLoadLabel =        (int)&_I32TdsLoadLabel;
  17. static int I32TcallLabel =        (int)&_I32TcallLabel;
  18. static int I32TchainCmp =        (int)&_I32TchainCmp;
  19. static int I32TchainLabel =        (int)&_I32TchainLabel;
  20. static int I32TchainOffset =        (int)&_I32TchainOffset;
  21. static int I32TchainSel =        (int)&_I32TchainSel;
  22.  
  23. #define adjust(where,what) (*(char**)(thunk + (where))) += (what)
  24. #define stampDD(where,what) *(void**)(thunk + (where)) = (what)
  25. #define stampDW(where,what) *(unsigned short *)(thunk + (where)) = (what)
  26.  
  27. void *    _makeInt32Thunk (void *proc, void *dsLoc, unsigned short chainSel, unsigned long chainOffset)
  28. {
  29.     char    *thunk;
  30.  
  31.     thunk = (char *)malloc (interrupt32ThunkSize);
  32.     if    (thunk)
  33.     {
  34.         memcpy (thunk, _interrupt32Thunk, interrupt32ThunkSize);
  35.         stampDD    (I32TdsLoadLabel, dsLoc);
  36.         stampDD    (I32TcallLabel,   (char *)(((char *)proc) - (thunk + I32TcallLabel + 4)));
  37.         adjust    (I32TchainCmp,       ((unsigned long)thunk) - ((unsigned long)_interrupt32Thunk));
  38.         adjust    (I32TchainLabel,  ((unsigned long)thunk) - ((unsigned long)_interrupt32Thunk));
  39.         stampDD    (I32TchainOffset, (void *)chainOffset);
  40.         stampDW    (I32TchainSel,       chainSel);
  41.     }
  42.  
  43.     return thunk;
  44. }
  45.  
  46.