----- Original Message ----- From: "Vesselin Bontchev" <[EMAIL PROTECTED]> To: "Palm Developer Forum" <[email protected]> Sent: Thursday, March 24, 2005 4:03 AM Subject: Re: How to intercept application launching?
> > The real problem is that HackMaster was created because > > the trap redirection can cause the device to become unstable > > if multiple apps try to hook into the same trap - I can't > > remember if the instability occurs immediately or if the problem > > is related to removing your hack. Anyway. If you're going to > > do this it's very important that you also implement logic to > > search for third party hack managers and refuse to run if one > > is installed (because you're messing with the same infrastructure > > they are). You will also need to give a loud warning to the user > > that your hack cannot be used in conjunction with any other > > hack. Annoying, but it's the only option - one hack per device > > or only use HackMaster compatible apps. > > OK, I have researched the issue and here is what I've found. > > Intercepting system traps in PalmOS is pretty much like intercepting interrupts with a TSR program in MS-DOS (yes, I am old enough to have done that). The problem occurs when your program is uninstalled after a program (installed after yours) has intercepted the same thing. Here is what happens. > > Normally, when you call a system trap, the call goes to the original code in PalmOS, thought a table containing the addresses of the various traps. > > When your application, let's call it First, intercepts that system trap and an application calls it, the call goes like this: > > First->Original > > That's because at installation time your application obtained the address of the original call, saved it somewhere and replaced it with its own address. This way when an application calls this system trap, your program receives control. It does its thing and chains to the original system trap by calling the address it has saved. > > Now, suppose that a second application (imaginatively named Second) is installed and that it intercepts the same system trap using the same method. Then, when an application calls this system trap, the call goes like this: > > Second->First->Original > > So far, so good. If, at this point, the user uninstalls the Second application, everything will be fine (provided that the application remembers to restore the address of the system trap it has intercepted). The problem will occur if the user removes the *First* application while the Second one is still present and active. The First application knows where the original address of the system trap is, and it can even determine that somebody after it has intercepted the same system trap (by intercepting SysSetTrapAddress) - but it has no way of knowing where that somebody has saved the address of the system trap at installation time. So, if at this point the Frist application is removed, we get > > Second->[never-never-land]->Original > > In other words, the chain breaks. As soon as some application calls the intercepted system trap, the Second application will receive control. It will do its thing and chain to what it thinks was the original address - except that now it points to a place that doesn't contain the program it used to contain. > > Now, in MS-DOS, TSR programs usually did not try to uninstall themselves. Even those that did, usually left a small stub in memory that did the interrupt vector chaining. Unfortunately, that's not an option under PalmOS - there, if you delete an application with the memory manager, it is gone; all of it. > > Third-party hack managers aside, I see only three possible solutions: > > 1) An application can refuse to uninstall itself, if it detects that another application has intercepted the same system traps it has intercepted - that's relatively easy to implement. However, this will frustrate the user a lot, given that s/he probably won't know what these other applications are, in order to remove them. > > 2) When uninstalling itself, an application could disable all other applications that have intercepted the same system trap after it. Unfortunately, it has no way of knowing where exactly they remember that they are intercepting something, so they will still "think" (i.e., tell the user) that they are active - but will, in fact, be disabled. > > 3) By intercepting SysSetTrapAddress, the application can detect if some other application is trying to intercept one of the system traps it has intercepted. When this happens, it can disable itself by restoring the original system trap address, effectively removing itself from the chain. > > Neither of these solutions is good enough, but at least they avoid the crashing problems that would otherwise occur. > > Regards, > Vesselin > -- > For information on using the Palm Developer Forums, or to unsubscribe, please see http://www.palmos.com/dev/support/forums/ -- For information on using the Palm Developer Forums, or to unsubscribe, please see http://www.palmos.com/dev/support/forums/
