Newsgroup: it.comp.lang.delphi
Titolo: Avvio-Stop applicazione esterna

Ciao a tutti.
Con ShellExecute posso avviare l'applicazione B dalla A.
E' possibile anche terminarla? Se si, come?
Grazie, ciao
Gianni

 E' possibile anche terminarla? Se si, come?
Chiudere un'applicazione non č un compito banale. Dipende da che tipo di
applicazione č. Comunque, sě, in generale č possibile. La tecnica piů
brutale č quella di applicare TerminateProcess() (ci sono strade piů soft
ma decisamente piů ardue da seguire, come il "code injection", iniettando
da remoto del codice nel processo in questione ed invocando
l'ExitProcess()).
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Con ls funzione TerminateProcess, Windows interrompe tutta l'attività 
del processo di destinazione nella modalità di utente, ma non viene 
effettivamente terminato il processo di destinazione finché non si 
completa tutta l'attività specifica nella modalità kernel. Ciò significa 
che il processo di destinazione continua a esistere finché tutti suoi i 
thread hanno lasciato il kernel e si è annullato tutto I/O. 
Se mi passi il paragone è Simile a un driver di periferica che non 
rilascia un thread o che non annulla I/O. 
ExitProcess è per tale motivo da preferire.
Lascia stare roba come DLL INJECTION o SHATTER ATTACK che sono dei 
casini pazzeschi.
Ciao.
--- posted by geoForum on 
http://www.delphiedintorni.it

Andrew De La Forge ha scritto:
[...]
Devo contattare Marco Cantù per chiedergli di prendere provvedimenti
(visto che stai palesemente violando le regole di Delphi&Dintorni) o la
smetti da solo?


smetti da solo?
Hai rotto le palle lo contatto io, leggi cosa hai scritto e cosa ho 
scritto....
Sei paranoico !


>>(visto che stai palesemente violando le regole di Delphi&Dintorni) 
Potresti gentilmente spiegare in cosa consiste la violazioni a cui ti 
riferisci ? 
Quanto hai scritto č incompleto e non preciso, spero che tu non voglia 
sostenere il tuo errore attraverso un attacco personale. 
Se cosě non č ti chiedo scusa.
Ciao !


 riferisci ? 
Ok, contatto Marco.


>Ok, contatto Marco.
OK Fagli anche leggere il post così ti dice dove hai sbagliato...


Già contattato Marco, vediamo chi ha ragione....

 Ok, contatto Marco.
...che purtroppo credo sia in ferie in questi giorni. :-|
http://blog.marcocantu.com/blog/two_weeks_offline.html
Prova a contattare Paolo Rossi di Wintech Italia.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 Prova a contattare Paolo Rossi di Wintech Italia.
Grazie Marco, spero che questo liceale brufoloso si trovi una ragazza
presto.


Bravo bravo corri dalla mamma .... dopo la batosta teorica sullo stop 
dell'applicazione che ti sei bekkato !
Paolo è qui con me. Ho due ragazze, e tempi diversi da te  :-)


Lascialo stare Paolo, è un diplomato rompiscatole.... Dice un sacco di
caxxate nei post e si aspetta che gli altri lo ascoltino....
Vedi sopra è l'esempio palese.....

OK BASTA adesso contatto Peter Parker di google Italia e vediamo chi
ha ragione !
Aspettati un telegramma a casa tra 7 giorni esatti.

OK, lo lascio stare ma č poco furbo. Si č attirato il pubblico sulla 
caxxata che ha detto....


casini pazzeschi.
Come chiami la ExitProcess() per un processo sul quale non hai il 
controllo?


 controllo?
Stefano, lascialo perdere, vuole solo confondere le acque e fuorviare l'OP.
Quanto afferma nei suoi messaggi è un groviglio sconnesso di concetti
buttati lì a caso. La ExitProcess() è ovviamente invocabile solo
iniettando del codice con CreateRemoteThread(), ma la tecnica è
decisamente inadeguata per cose semplici. Il fatto è che
TerminateProcess() è una chiusura brutale (equivalente al kill del
processo effettuato da Task Manager), quindi non consente, ad esempio, di
avere una notifica per il detach delle DLL, con conseguente codice di
clean-up da parte dell'applicazione (in generale, l'applicazione non può
eseguire alcun codice di clean-up, per alcuna risorsa).


 controllo?
Punta alla memoria bekkando l'handle di processo ovvio...
HANDLE OpenProcess(
    DWORD dwDesiredAccess, // flag di accesso
    BOOL bInheritHandle, // flag di eredità dell'handle ottenuto
    DWORD dwProcessId // identificatore del processo
);
Non ascoltare Andrea Laforgia.... E fuori fase...

E' possibile anche terminarla? Se si, come?
Apri assegnando l'handle e poi fai quello che vuoi... Se devi aprire e 
chiudere piů volte con TrminateProcess impasti la macchina poii senti 
l'HD sgranocchiare e lo licenziano.... OVVIO !


 Punta alla memoria bekkando l'handle di processo ovvio...
Ovviamente hai scritto una minchiata ma evito di commentarla.
Che tempo fa a Nerviano?


Che tempo fa a Nerviano?
Il tempo di appendere il capello al chiodo caro Andrew e piantarla di 
sparare caxxate.... Guarda che la gente ormai se ne è accorta ... :-)


>Che tempo fa a Nerviano?
Assegni l'HANDLE con openprocess. LEGGI SOTTO E IMPARA !
LPVOID VirtualAllocEx(
    HANDLE hProcess, // processo su cui allocare memoria
    LPVOID lpAddress, // indirizzo di memoria in cui allocare
    DWORD dwSize, // dimensione in bytes della memoria da allocare
    DWORD flAllocationType, // tipo di allocazione
    DWORD flProtect // tipo di protezione di accesso
);
Questa funzione alloca uno spazio di memoria in un processo. Vediamo i 
parametri:
hProcess è una variabile di tipo HANDLE, viene ottenuta tramite una 
chiamata ad OpenProcess() 
lpAddress è un puntatore all'indirizzo di memoria in cui allocare lo 
spazio necessario per le nostre operazioni. Mettendo questo parametro a 
NULL sarà la funzione che si occuperà di trovare un indirizzo di memoria 
adeguato nel nostro processo bersaglio 
dwSize è la dimensione della memoria da allocare, ed è espressa in byte 
flAllocationType maschera di bit che specifica il tipo di allocazione da 
effettuare, i tipi possono essere: 
MEM_COMMIT: riserva lo spazio in memoria e inizializza la memoria fisica 
a zero 
MEM_RESERVE: riserva solamente lo spazio in memoria (non alloca spazio 
nella memoria fisica) 
MEM_TOP_DOWN: alloca la memoria all' indirizzo più alto possibile 
flProtect maschera di bit che specifica la protezione per l' accesso 
alla memoria allocata, questa variabile può assumere questi valori: 
PAGE_READONLY: permette la sola lettura in una regione di memoria, 
scrivere in quest' area genera una "access violation" 
PAGE_READWRITE: permette la lettura e la scrittura 
PAGE_EXECUTE: permette l'esecuzione (per le aree di memoria in cui 
risiedono le istruzioni) 
PAGE_EXECUTE_READ: esecuzione e lettura 
PAGE_EXECUTE_READWRITE: esecuzione lettura e scrittura 
PAGE_GUARD: usato per controllare una zona di memoria (accedendovi si 
genera una eccezione) 
PAGE_NOACCESS: disabilita qualsiasi accesso all' area di memoria 
PAGE_NOCACHE: Non permette il cache della regione di memoria (viene 
utilizzato solo dai driver) 
La funzione ritorna l' indirizzo iniziale in cui vengono allocate le 
pagine di memoria, se la funzione ha successo, altrimenti il valore NULL.


 Assegni l'HANDLE con openprocess. LEGGI SOTTO E IMPARA !
Taci troll, sparisci ed evita di condurre gli altri su strade sbagliate.
C'è gente che può aver bisogno di certe informazioni per scopi più nobili
rispetto al tuo rompimento continuo di coglioni con le solite cagate.
Per l'amico che ha posto inizialmente la domanda: non ascoltarlo,
VirtualAllocEx() non c'entra una benemerita cippa con quanto si sta
dicendo; 
Essendo un processo esterno, la funzione da usare è TerminateProcess()
(neanche ExitProcess() citata dal troll ha un senso in questo contesto, a
meno di non considerare il code injection nei modi citati da me, non da
lui).
Nel caso dello stesso processo, invece, può essere preferibile sempre
usare TerminateProcess(), perché a meno di conoscere lo stato dei thread
nella propria applicazione, ExitProcess() potrebbe condurre a deadlock
(come citato da MSDN: "if you do not know the state of all threads in your
process, it is better to call TerminateProcess than ExitProcess").
Per approfondimenti: it.comp.programmare.win32


SEI PROPRIO UN POVERETTO... Mi fai schifo...
Sei la peggiore feccia umana....


Non capisci cosa ho scritto e sostieni la tua cazzata....
Solo tu scrivi qui perchè i veri professionisti non scriverebbero mai 
qui... 
Ma ti rendi conto che nessuno ti ascolta ??


 Essendo un processo esterno, la funzione da usare è TerminateProcess()
In effetti ho usato questa e ho risolto come desideravo il mio problema. 
Grazie
Gianni 

 Sei la peggiore feccia umana....
Ah ah ah... quanto rosica :-P... 
Guarda, il farti schifo mi rende orgoglioso :-)


LPVOID VirtualAllocEx(
Io ho chiesto come fai ad usare la ExitProcess() da un altro processo, 
non la VirtualAllocEx(). L'unico parametro che passi ad ExitProcess() è 
il codice di ritorno del processo - AFAIK non gli puoi passare un handle 
di processo. Quindi una volta che hai chiamato OpenProcess(), come fai a 
chiamare ExitProcess() per quel processo?
A questo punto o dimostri che si può fare - e come - o altrimenti 
dimostri che fin qui hai purtroppo solo sparato scemenze.


Apri assegnando l'handle e poi fai quello che vuoi... Se devi aprire e 
Quello che vuoi fino ad un certo punto... per favore, facci un esempio 
di come usi ExitProcess() con l'handle di un altro processo. Siamo solo 
qui in attesa.


Ah ah ah... quanto rosica :-P... 
Chi non risica non rosica... Effettivamente mi fai un po' senso come il 
criceto di mia zia....
TerminateProcess č roba da gente che non ha conoscenza delle API e non 
vuole incasinarsi.... Ma č sbagliato....
Se deve aprire e chiudere piů volte l'applicazione lo licenziano !


 Se deve aprire e chiudere piů volte l'applicazione lo licenziano !
Io apro e chiudo le applicazioni con il MOD1


Grazie
OK, prima di stappare la bottiglia di champagne prova ad aprire e 
chiudere per 10 volte e mi dai un'occhiatina al TASK MANAGER. cosě ci 
facciamo insieme una risata....


 vuole incasinarsi.... Ma è sbagliato....
Bene, allora tu che invece pontifichi e che hai conoscenza delle API,
facci vedere come fai. Pendiamo dalle tue labbra. Dai, siamo tutti
orecchie, o sei forse solo buono a tirare merda sugli altri? Tira fuori la
soluzione, avanti.
Siamo qui che aspettiamo...


Fai una caxxata MEGAGALATTICA con TerminateProcess e LO SAI anche 
dai....!
Devi fare cosě....
Prova questa sintassi anche lanciata in un file.bat
ESEMPIO 
TASKKILL /IM mioprocesso.exe
SINTASSI:
TASKKILL [/S system [/U username [/P [password]]]]
         { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T]
Description:
    This command line tool can be used to end one or more processes.
    Processes can be killed by the process id or image name.
Parameter List:
    /S    system           Specifies the remote system to connect to.
    /U    [domain\]user    Specifies the user context under which
                           the command should execute.
    /P    [password]       Specifies the password for the given
                           user context. Prompts for input if omitted.
    /F                     Specifies to forcefully terminate
                           process(es).
    /FI   filter           Displays a set of tasks that match a
                           given criteria specified by the filter.
    /PID  process id       Specifies the PID of the process that
                           has to be terminated.
    /IM   image name       Specifies the image name of the process
                           that has to be terminated. Wildcard '*'
                           can be used to specify all image names.
    /T                     Tree kill: terminates the specified process
                           and any child processes which were started by 
it.
    /?                     Displays this help/usage.



Grazie del consiglio, ma in effetti mi ero già preoccupato di verificarlo e, 
se non ci sono altre verifiche che mi vuoi suggerire, io stapperei....
Gianni

Magari fai una visitina sul sito di zio Bill e vedi che problemi dà.
Vedi :
Con la funzione TerminateProcess, Windows interrompe tutta l'attività 
del processo di destinazione nella modalità di utente, ma non viene 
effettivamente terminato il processo di destinazione finché non si 
completa tutta l'attività specifica nella modalità kernel. Ciò significa 
che il processo di destinazione continua a esistere finché tutti suoi i 
thread hanno lasciato il kernel e si è annullato tutto I/O. 
Se mi passi il paragone è Simile a un driver di periferica che non 
rilascia un thread o che non annulla I/O. 
Quindi la strada più corretta è EXITPROCESS con DLL-INJ
Attenzione anche ai PRIVILEGI
Per by passare rotture di scatole ti consiglio TASKKILL (verifica W2K)
ESEMPIO :
TASKKILL /IM mioprocesso.exe
SINTASSI:










    /?                     Displays this help/usage
--- posted by geoForum on 
http://www.delphiedintorni.it

 se non ci sono altre verifiche che mi vuoi suggerire, io stapperei....
Lascialo perdere.


 Devi fare così....
No, amico, ora ci fai vedere come fai con ExitProcess(), lo avevi detto tu
che si poteva usare. Che fai furbastro? ti affidi ad applicazioni esterne
(e che peraltro usando TerminateProcess)?
Attendiamo il tuo codice che ci illumini, trollino, che fai scappi?
Dai, avanti, posta la soluzione con OpenProcess() e ExitProcess(), dai
dai, attendiamo frementi, così oggi impariamo qualcosa di nuovo.


Per by passare rotture di scatole ti consiglio TASKKILL (verifica W2K)
Ahhhh, comodissimo usare un exe esterno per chiamare TerminateProcess
()...


>dai, attendiamo frementi, così oggi impariamo qualcosa di nuovo.
Non riesce a trovarla su Google... adesso starà provando con Yahoo e 
Arianna <g>


 Arianna <g>
:-D


>Ahhhh, comodissimo usare un exe esterno per chiamare TerminateProcess
Caro Stefano F cioè pseudonimo di Andrea sei un cocozzo perchè dici una 
minchiata grande come una CASA....
Nessun exe, è una chiamata di sistema...


Anche tu, magari:
Già fatto ZAPPETTONE leggi e impara l'inglese.... STEFANO F = ANDREA 
LAFORGIA
FECCIA del NG !!! Ha,ha,ha....


Poveri coglioni....
QUANDO SONO DUE DIPLOMATI CAZZUTI COME LORO FANNO PROPRIO RIDERE...
Non sanno un cazzo e fanno i fighi...


Nessun exe, č una chiamata di sistema...
Dici eh? vediamo che viene fuori sulla mia macchina con un bel "dir
task*" nella cartella di sistema:
Directory di C:\WINDOWS\system32
30/08/2004  22.00            74.752 taskkill.exe
30/08/2004  22.00            74.240 tasklist.exe
30/08/2004  22.00            15.360 taskman.exe
30/08/2004  22.00           139.264 taskmgr.exe
Hmmm... ritenta trollino, sarai piů fortunato ;-)

LAFORGIA
Eh no trollino, mi spiace ma non sono polimorfico, al contrario di te.
Hai proprio incontrato due persone diverse che ti rinfacciano le
cagate che scrivi. Scontento? Eeeeeh, prima o poi doveva capitare :-)

Non sanno un cazzo e fanno i fighi...
Allora insegnaci, trollino: stiamo aspettando la tua soluzione... e la
stiamo aspettando da un bel pezzo.  Dai, dai, forza, visto che non
sappiamo un cazzo e facciamo i fighi insegnaci qualcosa.
Le cose sono due:
1) posti la tua soluzione (e non fare il furbetto con gli exe esterni
che ti scopriamo subito, sai?);
2) sparisci dal ng;
Qualunque delle due ci va bene ;-)