home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / new / amigalibdisks / d984 / forceicon / source / forceicon.c < prev    next >
C/C++ Source or Header  |  1994-04-04  |  26KB  |  1,005 lines

  1. /*
  2. Auto:        smake    ForceIcon
  3. */
  4.  
  5. /* $Revision Header built automatically *************** (do not edit) ************
  6. **
  7. ** © Copyright by GuntherSoft
  8. **
  9. ** File             : SnakeSYS:CPrgs/Utils/ForceIcon.c
  10. ** Created on       : Wednesday, 20.10.93 15:55:50
  11. ** Created by       : Kai Iske
  12. ** Current revision : V1.0
  13. **
  14. **
  15. ** Purpose
  16. ** -------
  17. **   - Forces Disk Icons to a specified position.
  18. **     Usefull for CD-Rom users
  19. **
  20. ** Revision V1.0
  21. ** --------------
  22. ** created on Wednesday, 20.10.93 15:55:50  by  Kai Iske.   LogMessage :
  23. **     --- Initial release ---
  24. **
  25. *********************************************************************************/
  26.  
  27.  
  28. /**********************************************************************/
  29. /*                      Routines for this module                      */
  30. /**********************************************************************/
  31. static struct    FIconSema    *FindFIconSema(void);
  32. static void            RemoveFIconSema(struct FIconSema *FIconSema);
  33. static ULONG    __saveds __asm    MyGetIcon(register __a0 UBYTE *Name, register __a1 struct DiskObject *DObj, register __a2 struct FreeList *FList, register __a6 struct Library *IconBase);
  34. static ULONG    __asm        DoForce(register __a0 UBYTE *Name, register __a1 struct DiskObject *DObj, register __a2 struct FreeList *FList, register __a6 struct Library *IconBase);
  35. static ULONG    __saveds __asm    MyLock(register __d1 UBYTE *Name, register __d2 ULONG Mode, register __a6 struct DosLibrary *DOSBase);
  36. static BOOL            OpenAll(void);
  37. static void            CloseAll(void);
  38.  
  39.  
  40.  
  41.  
  42. /**********************************************************************/
  43. /*                    Functions of files included                     */
  44. /**********************************************************************/
  45.     // LoadPrefs.h
  46.  
  47. static void            LoadPrefs(struct FIconSema *FIconSema);
  48.  
  49.     // VolList.h
  50.  
  51. static BOOL            GetDevVolList(struct List *VolList);
  52. static BOOL            GetDosEntries(struct List *VolList, ULONG Mode);
  53. static void            FreeDevVolList(struct List *VolList);
  54. static void            SortList(struct List *VolList, BOOL DisplayType);
  55. static void            SortPartialList(struct List *VolList, UWORD Left, UWORD Right);
  56. static APTR            GetListEntry(struct List *List, WORD EntryNum);
  57. static BOOL            MyStrCmp(char *FromName, char *ToName);
  58.  
  59.     // Error.h
  60.  
  61. static void    __stdargs    DisplayError(LONG ErrCode, ULONG Arg1, ...);
  62.  
  63.     // PoolVec.h
  64.  
  65. static APTR            AllocVecPool(struct FIconSema *FIconSema, ULONG Size);
  66. static void            FreeVecPool(struct FIconSema *FIconSema, APTR Addr);
  67.  
  68.  
  69.  
  70.  
  71. /**********************************************************************/
  72. /*                           Library bases                            */
  73. /**********************************************************************/
  74. struct    ExecBase        *SysBase;
  75. struct    IntuitionBase        *IntuitionBase    = NULL;
  76. struct    DosLibrary        *DOSBase    = NULL;
  77. struct    Library            *IconBase    = NULL;
  78. struct    Library            *UtilityBase    = NULL;
  79. struct    Library            *IFFParseBase    = NULL;
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86. /**********************************************************************/
  87. /*                         "No-StartUp vars"                          */
  88. /**********************************************************************/
  89. static const char        _VER[]        = "\0$VER: ForceIcon "REVISION" ("REVDATE")\0";
  90. char                _ProgramName[]    = "ForceIcon";
  91. LONG                _OSERR        = 0;
  92.  
  93.  
  94.  
  95.  
  96.  
  97. /**********************************************************************/
  98. /*                           Our variables                            */
  99. /**********************************************************************/
  100. static    ULONG    __asm        (*OldGetIcon)(register __a0 UBYTE *, register __a1 struct DiskObject *, register __a2 struct FreeList *, register __a6 struct Library *);
  101. static    ULONG    __asm        (*OldLock)(register __d1 UBYTE *, register __d2 ULONG, register __a6 struct DosLibrary *);
  102. static    ULONG    __asm        (*CheckGetIcon)(register __a0 UBYTE *, register __a1 struct DiskObject *, register __a2 struct FreeList *, register __a6 struct Library *);
  103. static    ULONG    __asm        (*CheckLock)(register __d1 UBYTE *, register __d2 ULONG, register __a6 struct DosLibrary *);
  104.  
  105. static    struct    FIconSema    *FIconSema    = NULL;        // Pointer to our rendezvous semaphore
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114. /**********************************************************************/
  115. /*                      This is our main program                      */
  116. /**********************************************************************/
  117. ULONG __saveds main(void)
  118. {
  119.     struct    Process        *MyProc;
  120.     struct    WBStartup    *WBenchMsg    = NULL;
  121.     BOOL            QuitIT        = FALSE;
  122.  
  123.  
  124.  
  125.         // Get SysBase
  126.  
  127.     SysBase    = *((struct ExecBase **)0x4L);
  128.  
  129.  
  130.         // Get address of our process
  131.  
  132.     MyProc = (struct Process *)FindTask(NULL);
  133.  
  134.  
  135.  
  136.         // Determine where we were started from
  137.  
  138.     if(!MyProc->pr_CLI)
  139.     {
  140.         WaitPort(&MyProc->pr_MsgPort);
  141.         WBenchMsg = (struct WBStartup *)GetMsg(&MyProc->pr_MsgPort);
  142.     }
  143.  
  144.  
  145.  
  146.         // Don`t run under OS < 37
  147.  
  148.     if(((struct Library *)SysBase)->lib_Version >= 37)
  149.     {
  150.             // Open libraries
  151.  
  152.         if(OpenAll())
  153.         {
  154.                 // Prefs Program there ???
  155.  
  156.             if((FIconSema = FindFIconSema()))
  157.             {
  158.                 Disable();
  159.                     // Patch icon.library functions
  160.  
  161.                 OldGetIcon        = (ULONG *)SetFunction(IconBase, -0x0000002a, &MyGetIcon);
  162.  
  163.                     // Patch dos.library functions
  164.  
  165.                 OldLock            = (ULONG *)SetFunction(DOSBase, -0x00000054, &MyLock);
  166.                 Enable();
  167.  
  168.  
  169.  
  170.                     // Ok, patches placed.
  171.                     // Make all connected drives diskchange
  172.  
  173.                 {
  174.                     struct    List    ChangeList;
  175.  
  176.                     ObtainSemaphore(&FIconSema->FIconSema);
  177.  
  178.                     NewList(&ChangeList);
  179.  
  180.                         // Create list of connected devices
  181.  
  182.                     if(GetDosEntries(&ChangeList, LDF_VOLUMES))
  183.                     {
  184.                         struct    DosList        *DList;
  185.                         struct    VolEntry    *ThisEntry,
  186.                                     *ListEntry;
  187.                         struct    DevProc        *DevProc;
  188.                         char            DevName[130];
  189.                         BOOL            FoundDev,
  190.                                     DoDskCh;
  191.  
  192.                         while((ThisEntry = (struct VolEntry *)RemHead(&ChangeList)))
  193.                         {
  194.                             FoundDev    = FALSE;
  195.                             DoDskCh        = FALSE;
  196.  
  197.                                 // Find name of device this volume resides in
  198.  
  199.                             if((DList = LockDosList(LDF_DEVICES|LDF_READ)))
  200.                             {
  201.                                 while((DList = NextDosEntry(DList, LDF_DEVICES|LDF_READ)))
  202.                                 {
  203.                                     if(ThisEntry->DriverTask == DList->dol_Task && !FoundDev)
  204.                                     {
  205.                                         setmem(DevName, 130, 0);
  206.                                         strncpy(DevName, ((char *)BADDR(DList->dol_Name) + 1), *((char *)BADDR(DList->dol_Name)));
  207.                                         FoundDev    = TRUE;
  208.                                     }
  209.                                 }
  210.                                 UnLockDosList(LDF_DEVICES|LDF_READ);
  211.                             }
  212.  
  213.                                 // Found corresponding device ???
  214.  
  215.                             if(FoundDev)
  216.                             {
  217.                                     // Check whether to diskchange
  218.  
  219.                                 ListEntry    = (struct VolEntry *)FIconSema->VolumeList.lh_Head;
  220.                                 while(ListEntry->Link.ln_Succ && !DoDskCh)
  221.                                 {
  222.                                     if(ListEntry->Link.ln_Type == LDF_DEVICES)
  223.                                         DoDskCh    = (MyStrCmp(ListEntry->VolName, DevName) == 0);
  224.                                     else
  225.                                         DoDskCh    = (MyStrCmp(ListEntry->VolName, ThisEntry->VolName) == 0);
  226.  
  227.                                     ListEntry = (struct VolEntry *)ListEntry->Link.ln_Succ;
  228.                                 }
  229.  
  230.                                 if(DoDskCh)
  231.                                 {
  232.                                     strcat(DevName, ":");
  233.  
  234.                                     if(ThisEntry->DriverTask && (DevProc = GetDeviceProc(DevName, NULL)))
  235.                                     {
  236.                                         if(TypeOfMem(DevProc->dvp_Port))
  237.                                         {
  238.                                             if(DoPkt(DevProc->dvp_Port, ACTION_INHIBIT, DOSTRUE, NULL, NULL, NULL, NULL))
  239.                                                 DoPkt(DevProc->dvp_Port, ACTION_INHIBIT, DOSFALSE, NULL, NULL, NULL, NULL);
  240.                                         }
  241.                                         FreeDeviceProc(DevProc);
  242.                                     }
  243.                                 }
  244.                             }
  245.  
  246.                             FreeVecPool(FIconSema, ThisEntry);
  247.                         }
  248.                     }
  249.  
  250.                     ReleaseSemaphore(&FIconSema->FIconSema);
  251.                 }
  252.  
  253.                     // Wait for termination
  254.  
  255.                 while(!QuitIT)
  256.                 {
  257.                     Wait(SIGBREAKF_CTRL_C);
  258.  
  259.                         // Ok, we are to quit
  260.  
  261.                     QuitIT    = TRUE;
  262.  
  263.  
  264.                     Disable();
  265.  
  266.                         // Try to re-install old vectors
  267.  
  268.                     CheckGetIcon    = SetFunction(IconBase, -0x0000002a, OldGetIcon);
  269.                     CheckLock    = SetFunction(DOSBase, -0x00000054, OldLock);
  270.  
  271.                     if((CheckGetIcon != &MyGetIcon) || (CheckLock != &MyLock))
  272.                     {
  273.                         QuitIT = FALSE;
  274.  
  275.                             // Re-install patches created by someone else
  276.  
  277.                         SetFunction(IconBase, -0x0000002a, CheckGetIcon);
  278.                         SetFunction(DOSBase, -0x00000054, CheckLock);
  279.                     }
  280.  
  281.                     Enable();
  282.  
  283.                     if(!QuitIT)
  284.                     {
  285.                         if((CheckGetIcon != &MyGetIcon) && (CheckLock != &MyLock))
  286.                             DisplayError(ERR_PATCHES, NULL)