Newsgroup: it.comp.programmare.win32
Titolo: Thread remoti e hooks (non corto)

Ok.
Con la tecnica degli hook sono riuscito ad installare un thread remoto (?).
Ora ho altri dubbi e problemi. Riassumendo, ho creato una DLL che contiene:
-Un thread da eseguire su vari processi, molto breve e che termina quasi
subito. Per sapere se il thread funziona, gli faccio stampare su file una
stringa "Wow!, Sono attivo" ed il PID del processo.
-Una Hook procedure, che non fa altro che far partire il thread.
-una funzione (installa), che installa l'hook.
-una dllmain, che fa ben poco, a parte scrivere su file che è partita.
-sempre nella dllmain, all'uscita rimuove l'hook, se non è già stato fatto.
Ora la mia idea è questa:
- io carico la DLL, che contiene una variabile static hHook inizializzata a
zero, e la dll scrive su file.
- da un solo programma (quello che uso per testare la dll), faccio partire
la funzione intalla, che crea l'hook.
- appena un processo riceve il messaggio giusto, parte il thread, che scrive
su file.
- finchè l'hook resta attivo, viene creato un thread per ogni processo che
riceve un messaggio.
- ogni processo che riceve un messaggio, deve caricarsi la DLL per "vedere"
il codice di Hook e del thread, poi può rilasciare la dll
- ogni thread, e hook relativo, si trova nello spazio di indirizzamento del
processo interessato, quindi con dati diversi per ogni istanza della DLL
Il mio programma per ora ha un bel comportamento: carica la DLL, carica
l'hook, chiama il thread, poi si pianta, e se non sono attento devo poi
resettare il PC. :-)))
Guardando però il codice, ho dei piccoli dubbi riguardanti certe funzioni:
- All'interno dell'Hook, devo eseguire una chiamata a CallNextHookEx che
vuole un parametro contenente un handle all'Hook, che però conosce solo la
procedura Installa, all'interno dello spazio di indirizzamento del programma
che ha installato l'hook :-( Quando la hook procedure viene chiamata
all'interno dello spazio di indirizzamento di altri processi, caricano di
nuovo la DLL e pertanto porranno a zero tale variabile? Come si fa a
risolvere? Devo forse creare un oggetto di sistema?
- Nel thread, riesco facilmente a trovare il PID del processo ospite. Cosa
me ne faccio? Io vorrei, magari, stampare il nome del programma, o perlomeno
quacosa di più utile di un numero.
- Quando installo l'hook, questo non viene subito eseguito da tutti i
processi. Devo mandare un messaggio ad essi?
- Che tipo di hook devo installare? Per ora uso il tipo WH_CBT. Il mio
intento sarebbe di installare il thread su tutti i processi attivi e poi
mantenerlo attivo solo su quello/i che mi interessa, non su tutti.
Ho deciso di usare la tecnica degli hook perchè lo sviluppo dovrò farlo su
W95, anche se poi sarà eseguito su NT. E vorrei poter debuggare un po' il
programma prima di usarlo davvero, tanto più che sono agli inizi...
Grazie e scusate anche il post lungo.
Buon Natale, e felice anno nuovo a tutti!
--
Alessandro Monti

 programma prima di usarlo davvero, tanto più che sono agli inizi...
Ti converebbe senza dubbio usare NT, anche perche` con le
tecniche specifiche di NT il problema del processo cui il
tuo hook potrebbe non agganciarsi non si applica.
Attento a un dettaglio: DllMain e` un punto "fragile" per
fare operazioni di sistema.  Come minimo, se fai partire
un thread da li`, usa prima DisableThreadLibraryCalls per
evitare problemi.  Meglio sarebbe lavorare, se puoi,
nella tua hook procedure, che e` chiamata in situazioni
piu` stabili.  Il testo di Richter "Advanced Windows
Programming" (MS Press/Mondadori Informatica) spiega
benissimo tutti questi particolari.
Alex

 Programming" (MS Press/Mondadori Informatica) spiega
Lo metto nella lista insieme al Petzold.
Grazie per la pazienza
--
Alessandro Monti

 desktop? Sembrerebbe il caso di farmi una funzioncina...
Sembra piu` comodo usare l'API GetDesktopWindow, che
ha gia` fatto mamma Microsoft per te:-).
Alex

 ha gia` fatto mamma Microsoft per te:-).
'Azz...
Ho già detto che sono ancora un pollastro...
Ma già che c'era, MS non poteva mettere pure 'sta funzione nell'help, alla
voce "Desktop"?
Ho trovato di tutto, ma non una cosa semplice come GetDesktopWindow. Dovrò
stamparmi l'elenco delle funzioni che iniziano con Get :-)
Grazie ancora e buon anno. Io domani parto per il mare, e il PC lo lascio a
casa ;-))))
--
Alessandro Monti