==========================================================================


                    *********    *********    *       *
                    *            *       *    *       *
                    *            *       *    *       *
                    *********    *********    *********
                            *    *                *
                            *    *                *
                    *********    *                *



                                Version 1.0


                           by Federico Giannici


==========================================================================



SPY e` una spia delle principali funzioni AmigaDOS ed EXEC.


Il programma e` di Pubblico Dominio, puo` quindi essere copiato liberamente
e  non si e` obbligati  a pagarmi alcunche` per  il suo utilizzo (eventuali
contributi  saranno  comunque  ben  accetti).  Non  e` pero` ammessa alcuna
modifica,  vendita od  inserimento in  programmi commerciali,  senza il mio
permesso scritto. Infine non mi assumo alcuna responsabilita` per eventuali
danni provocati, direttamente o indirettamente, da SPY.





                                COSA FA SPY
                               -------------


Si puo` scegliere  quali funzioni (tra  quelle implementate) mettere  sotto
osservazione.  Da quel momento ogni chiamata  a quelle funzioni da parte di
qualsiasi programma verra` notificata all'utente.

Vengono  visualizzati  il  nome  della  funzione,  tutti  i parametri ed il
risultato dell'operazione.

I nomi vengono evidenziati con un diverso colore.

Inoltre,  spesso SPY mostra, tra parentesi,  il nome della struttura il cui
indirizzo e` stato passato  come parametro, per esempio:  Devices, Library,
Resources, ecc.. Nel caso di un Lock, viene mostrato (sempre fra parentesi)
il  nome del  file o  directory (terminante  con un  segno "/") completo di
tutto il path, corrispondente al lock.

Per quanto riguarda  i FileHandle viene  mostrato il nome  del file passato
alla  routine "Open()" al momento dell'apertura del file medesimo. Infatti,
non sono riuscito a trovare  una tecnica ortodossa (documentata) per  poter
risalire al nome del file corrispondente ad un FileHandle.
Come  soluzione parziale al problema,  SPY memorizza il nome corrispondente
ad un determinato FileHandle ad ogni chiamata ad "Open()" e lo cancella  ad
ogni  chiamata a "Close()". Quindi non viene  mostrato ne` il nome dei file
aperti  prima  di  caricare  SPY,  ne`  di quelli aperti quando la funzione
"Open()" non era intercettata.
Per  i  FileHandle  corrispondenti  alle  funzioni  "Input()"  e "Output()"
vengono mostrati rispettivamente con i nomi "<Input>" e "<Output>".
Evidentemente, se la funzione "Close()" non e` intercettata, il buffer  per
la  memorizzazione dei nomi aumenta in  continuazione, e si puo` verificare
l'eventualita`  che  il  nome  del  file  non sia piu` quello corretto. Per
evitare  tutto cio` e`  possibile azzerare il  buffer con il comando "Clear
FileHandle mem" del primo menu`.
E` chiaro che si tratta di una soluzione di ripiego. Saro` grato a chiunque
potra` suggerirmi una soluzione migliore.

Infine per le funzioni "Read()" e "Write()" viene anche mostrato il  buffer
da leggere o scrivere come una stringa di caratteri ASCII.





                                CARICAMENTO
                               -------------


SPY puo` essere caricato sia da CLI che da Workbench.
Da  CLI si ha la  possibilita` di specificare, come  parametro, il nome del
file  di  configurazione,  altrimenti  verra`  cercato  il  file di default
"spy.config".
SPY  cerca il file di configurazione  prima nella directory corrente e poi,
nel caso non lo abbia trovato, nella directory "S:".
Nel  caso  non  riuscisse  a  trovare  il  file  di  configurazione  allora
utilizzera`   quella   di   default:   intercettazione   attiva,  stampante
disattivata, tutte  le opzioni  di Preferences  attive e  tutte le funzioni
selezionate tranne "FindName()".





                                  I MENU`
                                 ---------


                                  GENERAL


ACTIVATED
Se selezionato (simbolo di selezione sulla sinistra) SPY e` attivo.


PRINTER
Se  selezionato, tutto cio` che viene mostrato nelle finestra principale di
SPY viene mandato anche alla stampante.
E` MOLTO  IMPORTANTE che  la stampante  sia effettivamente  ACCESA! In caso
contrario SPY si potrebbe bloccare, oppure, nel caso apparisse il messaggio
"Printer  Troubles - Check Printer and Cables", si potrebbe avere il blocco
di tutto il sistema (nel caso SPY stia intercettando particolari funzioni).


FUNCTIONS
Tale comando  puo` essere  selezionato, piu`  semplicemente, con  un doppio
click nella finestra principale di SPY.
Permette di accedere alla finestra di selezione delle funzioni intercettate
da  SPY. Le  funzioni attive  sono contrassegnate  dal simbolo di selezione
sulla sinistra.
In basso si possono attivare cinque comandi:

          OK: Accetta la lista di funzioni selezionate attualmente mostrata
          sul video.

          ALL:  Seleziona  tutte  le  funzioni.  C'e`  un'unica  eccezione:
          "FindName()",  perche` solitamente genera un numero molto elevato
          di chiamate (per  esempio ogni volta  che vengono usati  i menu),
          per cui occorre selezionarla esplicitamente clickandoci sopra.

          NONE: Deseleziona tutte le funzioni.

          RESTORE:  Ripristina  la  lista  di funzioni selezionate l'ultima
          volta.

          CANCEL: Chiude la finestra senza modificare la lista di  funzioni
          selezionate (viene utilizzata quella precedente).


SAVE CONFIGURATION
Viene chiesto il nome del file di configurazione da registrare.
La  configurazione  comprende  tutte  le  opzioni  di menu`, la lista delle
funzioni attive e la posizione e dimensione della finestra.


LOAD CONFIGURATION
Viene chiesto il nome del file di configurazione da utilizzare.


CLEAR FILEHANDLE MEM
Cancella il buffer di memoria dei nomi dei FileHandle (vedi "COSA FA SPY").


INFORMATIONS
Mostra  un  sotto-menu`  di   presentazione  del  programma  (SPY)   e  del
programmatore (Io!).


QUIT
Si  puo` attivare anche con il gadget di chiusura della finestra principale
di SPY.
Elimina SPY.
Prima  di  procedere  attende  che  nessun  altro  programma stia eseguendo
qualcuna delle sue funzioni sostitutive.




                                PREFERENCES

Queste  opzioni  definiscono  il  comportamento  di  SPY nel momento in cui
intercetta una chiamata ad una delle funzioni attualmente selezionate.


DESCRIPTION
Se impostato  su "Verbose"  vengono visualizzati  tutti i  parametri ed  il
valore di ritorno della funzione.
Se  impostato su  "Brief" vengono  mostrati, su  di un'unica linea, solo il
nome della funzione ed il parametro principale.


ACTIVATION
Se  impostato  su  "Failed  Only"  vengono  mostrate  solo  le chiamate che
falliscono.
Altrimenti vengono intercettate tutte le chiamate.


GO ON
Se  impostato  su  "Wait  for  GO",  una  volta  mostrata  la chiamata alla
funzione, attende una conferma da parte dell'utente.
Comincia a lampeggiare il gadget in fondo alla finestra principale di  SPY,
e  si  puo`  dare  l'ok  clickando  tale  gadget  oppure  premendo un tasto
qualunque (in quest'ultimo caso la finestra di SPY deve essere attiva).
Se  invece  si  e`  impostato  "Immediately",  SPY  non  attendera`  alcuna
conferma.


SCREENFLASH
Se  impostato su  "Activated", qualora  il programma  sia in  attesa di una
risposta  da  parte  dell'utente  (vedi  punto  precedente), ogni 2 secondi
(circa)  lampeggera`  lo  schermo,  per  informare  l'utente dello stato di
attesa (infatti, nel frattempo, il programma chiamante e` bloccato).





                                MISCELLANEA
                               -------------


La funzione "AllocMem()" viene notificata solo quando si verifica un errore
(memoria insufficiente), in  quanto  e`  chiamata molto spesso  da tutto il
sistema.


Ci  sono due casi in  cui SPY non puo`  fermarsi ad attendere l'OK da parte
dell'utente (pena il blocco del sistema):

               I) Se il  nome della MsgPort  di una chiamata  alla funzione
               "AddPort()" e` "IDCMP" (si e` aperta una finestra).

               II)  Tutte  la  chiamate  alla  funzione  "FindName()" fatte
               dall'input.device.


Per evitare problemi di overflow dello stack, vengono visualizzate solo  le
chiamate effettuate da Task con uno stack di almeno 1600 bytes.
Naturalmente  cio`  non  elimina  completamente  i problemi di overflow, in
quanto SPY non sa quanto sia effettivamente pieno lo stack.
Nel caso si verifichi un  crash del sistema, provate a  disattivare qualche
funzione fintanto che non fili tutto liscio, individuando cosi` quale e` la
funzione incriminata (talvolta e` soltanto una che manda tutto in crash).
La  scelta di 1600  bytes non e`  casuale. Infatti, il  CLI iniziale ha uno
stack di 1600 bytes  (almeno fino al sistema  operativo V1.3), anche se  al
momento  di eseguire  un comando  diventa (!?)  di 4000  bytes. Qualcuno sa
dirmi perche`?

Altri curiosi comportamenti del CLI (scoperti con SPY):

Quando il CLI deve eseguire  un comando apre la dos.library  (probabilmente
per   ottenere  l'indirizzo   DOSBase)  senza   pero`  richiuderla   con la
"CloseLibrary()". Il  contatore di  aperture della  libreria viene comunque
successivamente decrementato, probabilmente dallo stesso CLI.

Le  chiamate fatte dai comandi standard del CLI (Dir, CD, Delete, ecc.) non
vengono intercettate.  Penso che  cio` dipenda  dal fatto  che tali comandi
utilizzino  una propria libreria interna (probabilmente in BCPL) che chiama
direttamente le  routine di  sistema senza  passare dalle  jump-table delle
librerie.





                              PER CONCLUDERE
                             ----------------


Per  qualsiasi consiglio,  critica, bug,  contributo, e  soprattutto elogi,
potete contattarmi all'indirizzo che appare  nel menu del programma (e  che
per i piu` pigri riporto alla fine di queste note) oppure sulla BBS MC-Link
(06-4180440, il mio codice e` MC4080).

Buone investigazioni con SPY.




                                                  Federico Giannici

                                                  Viale Francia 4
                                                  90146 Palermo
                                                  Italy

