home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 4
/
FreshFish_May-June1994.bin
/
new
/
amigalibdisks
/
d984
/
forceicon
/
source
/
forceicon.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-04
|
26KB
|
1,005 lines
/*
Auto: smake ForceIcon
*/
/* $Revision Header built automatically *************** (do not edit) ************
**
** © Copyright by GuntherSoft
**
** File : SnakeSYS:CPrgs/Utils/ForceIcon.c
** Created on : Wednesday, 20.10.93 15:55:50
** Created by : Kai Iske
** Current revision : V1.0
**
**
** Purpose
** -------
** - Forces Disk Icons to a specified position.
** Usefull for CD-Rom users
**
** Revision V1.0
** --------------
** created on Wednesday, 20.10.93 15:55:50 by Kai Iske. LogMessage :
** --- Initial release ---
**
*********************************************************************************/
/**********************************************************************/
/* Routines for this module */
/**********************************************************************/
static struct FIconSema *FindFIconSema(void);
static void RemoveFIconSema(struct FIconSema *FIconSema);
static ULONG __saveds __asm MyGetIcon(register __a0 UBYTE *Name, register __a1 struct DiskObject *DObj, register __a2 struct FreeList *FList, register __a6 struct Library *IconBase);
static ULONG __asm DoForce(register __a0 UBYTE *Name, register __a1 struct DiskObject *DObj, register __a2 struct FreeList *FList, register __a6 struct Library *IconBase);
static ULONG __saveds __asm MyLock(register __d1 UBYTE *Name, register __d2 ULONG Mode, register __a6 struct DosLibrary *DOSBase);
static BOOL OpenAll(void);
static void CloseAll(void);
/**********************************************************************/
/* Functions of files included */
/**********************************************************************/
// LoadPrefs.h
static void LoadPrefs(struct FIconSema *FIconSema);
// VolList.h
static BOOL GetDevVolList(struct List *VolList);
static BOOL GetDosEntries(struct List *VolList, ULONG Mode);
static void FreeDevVolList(struct List *VolList);
static void SortList(struct List *VolList, BOOL DisplayType);
static void SortPartialList(struct List *VolList, UWORD Left, UWORD Right);
static APTR GetListEntry(struct List *List, WORD EntryNum);
static BOOL MyStrCmp(char *FromName, char *ToName);
// Error.h
static void __stdargs DisplayError(LONG ErrCode, ULONG Arg1, ...);
// PoolVec.h
static APTR AllocVecPool(struct FIconSema *FIconSema, ULONG Size);
static void FreeVecPool(struct FIconSema *FIconSema, APTR Addr);
/**********************************************************************/
/* Library bases */
/**********************************************************************/
struct ExecBase *SysBase;
struct IntuitionBase *IntuitionBase = NULL;
struct DosLibrary *DOSBase = NULL;
struct Library *IconBase = NULL;
struct Library *UtilityBase = NULL;
struct Library *IFFParseBase = NULL;
/**********************************************************************/
/* "No-StartUp vars" */
/**********************************************************************/
static const char _VER[] = "\0$VER: ForceIcon "REVISION" ("REVDATE")\0";
char _ProgramName[] = "ForceIcon";
LONG _OSERR = 0;
/**********************************************************************/
/* Our variables */
/**********************************************************************/
static ULONG __asm (*OldGetIcon)(register __a0 UBYTE *, register __a1 struct DiskObject *, register __a2 struct FreeList *, register __a6 struct Library *);
static ULONG __asm (*OldLock)(register __d1 UBYTE *, register __d2 ULONG, register __a6 struct DosLibrary *);
static ULONG __asm (*CheckGetIcon)(register __a0 UBYTE *, register __a1 struct DiskObject *, register __a2 struct FreeList *, register __a6 struct Library *);
static ULONG __asm (*CheckLock)(register __d1 UBYTE *, register __d2 ULONG, register __a6 struct DosLibrary *);
static struct FIconSema *FIconSema = NULL; // Pointer to our rendezvous semaphore
/**********************************************************************/
/* This is our main program */
/**********************************************************************/
ULONG __saveds main(void)
{
struct Process *MyProc;
struct WBStartup *WBenchMsg = NULL;
BOOL QuitIT = FALSE;
// Get SysBase
SysBase = *((struct ExecBase **)0x4L);
// Get address of our process
MyProc = (struct Process *)FindTask(NULL);
// Determine where we were started from
if(!MyProc->pr_CLI)
{
WaitPort(&MyProc->pr_MsgPort);
WBenchMsg = (struct WBStartup *)GetMsg(&MyProc->pr_MsgPort);
}
// Don`t run under OS < 37
if(((struct Library *)SysBase)->lib_Version >= 37)
{
// Open libraries
if(OpenAll())
{
// Prefs Program there ???
if((FIconSema = FindFIconSema()))
{
Disable();
// Patch icon.library functions
OldGetIcon = (ULONG *)SetFunction(IconBase, -0x0000002a, &MyGetIcon);
// Patch dos.library functions
OldLock = (ULONG *)SetFunction(DOSBase, -0x00000054, &MyLock);
Enable();
// Ok, patches placed.
// Make all connected drives diskchange
{
struct List ChangeList;
ObtainSemaphore(&FIconSema->FIconSema);
NewList(&ChangeList);
// Create list of connected devices
if(GetDosEntries(&ChangeList, LDF_VOLUMES))
{
struct DosList *DList;
struct VolEntry *ThisEntry,
*ListEntry;
struct DevProc *DevProc;
char DevName[130];
BOOL FoundDev,
DoDskCh;
while((ThisEntry = (struct VolEntry *)RemHead(&ChangeList)))
{
FoundDev = FALSE;
DoDskCh = FALSE;
// Find name of device this volume resides in
if((DList = LockDosList(LDF_DEVICES|LDF_READ)))
{
while((DList = NextDosEntry(DList, LDF_DEVICES|LDF_READ)))
{
if(ThisEntry->DriverTask == DList->dol_Task && !FoundDev)
{
setmem(DevName, 130, 0);
strncpy(DevName, ((char *)BADDR(DList->dol_Name) + 1), *((char *)BADDR(DList->dol_Name)));
FoundDev = TRUE;
}
}
UnLockDosList(LDF_DEVICES|LDF_READ);
}
// Found corresponding device ???
if(FoundDev)
{
// Check whether to diskchange
ListEntry = (struct VolEntry *)FIconSema->VolumeList.lh_Head;
while(ListEntry->Link.ln_Succ && !DoDskCh)
{
if(ListEntry->Link.ln_Type == LDF_DEVICES)
DoDskCh = (MyStrCmp(ListEntry->VolName, DevName) == 0);
else
DoDskCh = (MyStrCmp(ListEntry->VolName, ThisEntry->VolName) == 0);
ListEntry = (struct VolEntry *)ListEntry->Link.ln_Succ;
}
if(DoDskCh)
{
strcat(DevName, ":");
if(ThisEntry->DriverTask && (DevProc = GetDeviceProc(DevName, NULL)))
{
if(TypeOfMem(DevProc->dvp_Port))
{
if(DoPkt(DevProc->dvp_Port, ACTION_INHIBIT, DOSTRUE, NULL, NULL, NULL, NULL))
DoPkt(DevProc->dvp_Port, ACTION_INHIBIT, DOSFALSE, NULL, NULL, NULL, NULL);
}
FreeDeviceProc(DevProc);
}
}
}
FreeVecPool(FIconSema, ThisEntry);
}
}
ReleaseSemaphore(&FIconSema->FIconSema);
}
// Wait for termination
while(!QuitIT)
{
Wait(SIGBREAKF_CTRL_C);
// Ok, we are to quit
QuitIT = TRUE;
Disable();
// Try to re-install old vectors
CheckGetIcon = SetFunction(IconBase, -0x0000002a, OldGetIcon);
CheckLock = SetFunction(DOSBase, -0x00000054, OldLock);
if((CheckGetIcon != &MyGetIcon) || (CheckLock != &MyLock))
{
QuitIT = FALSE;
// Re-install patches created by someone else
SetFunction(IconBase, -0x0000002a, CheckGetIcon);
SetFunction(DOSBase, -0x00000054, CheckLock);
}
Enable();
if(!QuitIT)
{
if((CheckGetIcon != &MyGetIcon) && (CheckLock != &MyLock))
DisplayError(ERR_PATCHES, NULL)