home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -seriously_amiga- / hardware / disksafe / extras / resetlist.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-23  |  5.3 KB  |  148 lines

  1. /*****************************************************************
  2.  ** ResetHandlers                                               **
  3.  **                                                             **
  4.  ** Shows the installed reset handlers.                **
  5.  ** Version 1.00 April 8th, 1998  © Thomas Richter (thor)    **
  6.  **-------------------------------------------------------------**
  7.  ** Be warned! I would call this a !!! Hack !!!                   **
  8.  *****************************************************************/
  9.  
  10. #include <exec/types.h>
  11. #include <exec/execbase.h>
  12. #include <exec/memory.h>
  13. #include <exec/interrupts.h>
  14. #include <exec/ports.h>
  15. #include <exec/io.h>
  16. #include <devices/keyboard.h>
  17. #include <dos/dos.h>
  18.  
  19. #include <proto/exec.h>
  20. #include <proto/dos.h>
  21.  
  22. #include <string.h>
  23.  
  24. static char version[]="$VER: ResetList 1.00 (8.4.98)";
  25.  
  26. struct ResetSaveback {
  27.         struct ResetSaveback   *next,*pred;
  28.         BYTE                    pri;
  29.         UBYTE                   reserved;
  30.         char                   *name;
  31.         void                   *data;
  32.         void                   *code;
  33. };
  34.  
  35. int main(void);
  36. int PrintResetHandlers(void);
  37. int ListResetHandlers(struct Interrupt *irq);
  38. int DummyHandler(void);
  39.  
  40. struct DosLibrary *DOSBase;
  41.  
  42. int main(void)
  43. {
  44. int rc=20;
  45.  
  46.         if (DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",37L)) {
  47.                 rc=PrintResetHandlers();
  48.  
  49.                 CloseLibrary((struct Library *)DOSBase);
  50.         }
  51.  
  52.         return rc;
  53. }
  54.  
  55.  
  56. int ListResetHandlers(struct Interrupt *base)
  57. {
  58. struct Interrupt *irq;
  59. struct ResetSaveback *rsb;
  60. ULONG len;
  61. int rc=0;
  62. struct List reslist;
  63.  
  64.  
  65.         NewList(&reslist);
  66.         Forbid();
  67.         irq=base;
  68.         while(irq->is_Node.ln_Pred)
  69.                 irq=(struct Interrupt *)(irq->is_Node.ln_Pred);
  70.  
  71.         for(irq=(struct Interrupt *)(irq->is_Node.ln_Succ);irq->is_Node.ln_Succ;irq=(struct Interrupt *)(irq->is_Node.ln_Succ)) {
  72.                 if (irq!=base) {
  73.                         len=strlen(irq->is_Node.ln_Name)+1+sizeof(struct ResetSaveback);
  74.                         if (rsb=AllocVec(len,MEMF_PUBLIC)) {
  75.                                 rsb->pri=irq->is_Node.ln_Pri;
  76.                                 rsb->code=(void *)irq->is_Code;
  77.                                 rsb->data=irq->is_Data;
  78.                                 rsb->name=(char *)(rsb+1);
  79.                                 strcpy(rsb->name,irq->is_Node.ln_Name);
  80.                                 AddTail(&reslist,(struct Node *)rsb);
  81.                         } else  rc=5;
  82.                 }
  83.         }
  84.  
  85.         Permit();
  86.         if (rc) {
  87.                 Printf("ResetList: Out of memory.\n");
  88.         } else {
  89.                 Printf("List of installed reset handlers:\n\n");
  90.                 while(rsb=(struct ResetSaveback *)RemHead(&reslist)) {
  91.                         Printf("Pri : %3ld  Code : 0x%08lx  Data : 0x%08lx  Name : %s\n",rsb->pri,rsb->code,rsb->data,rsb->name);
  92.                         FreeVec(rsb);
  93.                 }
  94.         }
  95.  
  96.         while(rsb=(struct ResetSaveback *)RemHead(&reslist)) {
  97.                 FreeVec(rsb);
  98.         }
  99.  
  100.         return rc;
  101. }
  102.  
  103.  
  104. int DummyHandler(void)
  105. {
  106.         return 0;
  107. }
  108.  
  109. int PrintResetHandlers(void)
  110. {
  111. struct IOStdReq *iostd;
  112. struct MsgPort *port;
  113. struct Interrupt *irq;
  114. int rc=10;
  115.  
  116.         if (irq=AllocMem(sizeof(struct Interrupt),MEMF_PUBLIC|MEMF_CLEAR)) {
  117.                 if (port=CreateMsgPort()) {
  118.                         if (iostd=(struct IOStdReq *)CreateIORequest(port,sizeof(struct IOStdReq))) {
  119.                                 if (!OpenDevice("keyboard.device",0,(struct IORequest *)iostd,0)) {
  120.                                         irq->is_Node.ln_Type=NT_INTERRUPT;
  121.                                         irq->is_Node.ln_Pri=-32;
  122.                                         irq->is_Node.ln_Name="ResetList.Interrupt";
  123.                                         irq->is_Code=(void (*)())&DummyHandler;
  124.                                         iostd->io_Command=KBD_ADDRESETHANDLER;
  125.                                         iostd->io_Data=(void *)irq;
  126.                                         iostd->io_Length=sizeof(struct Interrupt);
  127.                                         if (!DoIO((struct IORequest *)iostd)) {
  128.                                                 ListResetHandlers(irq);
  129.  
  130.                                                 iostd->io_Command=KBD_REMRESETHANDLER;
  131.                                                 if (DoIO((struct IORequest *)iostd)) {
  132.                                                         Printf("ResetList: ALERT! Can't remove dummy reset handler.\n");
  133.                                                         return 20;
  134.                                                 } else rc=0;
  135.                                         } else Printf("ResetList: Can't install dummy reset handler.\n");
  136.                                         CloseDevice((struct IORequest *)iostd);
  137.                                 } else Printf("ResetList: Can't open keyboard.device.\n");
  138.                                 DeleteIORequest((struct IORequest *)iostd);
  139.                         } else Printf("ResetList: Can't build IORequest.\n");
  140.                         DeleteMsgPort(port);
  141.                 } else Printf("ResetList: Can't build MsgPort.\n");
  142.                 FreeMem(irq,sizeof(struct Interrupt));
  143.         } else Printf("ResetList: Can't build Interrupt.\n");
  144.  
  145.         return rc;
  146. }
  147.  
  148.