Ver la Versión Completa : mostrar/suspender/resumir/matar/thread de otro proceso hecho en delphi
force1758
24-09-2014, 16:15:33
Hola amigo de Clubdelphi Como les va, Bueno Vuelvo Por aqui para ver si me dan ayuda o alguna idea para mi programa que deseo hacer, Es de como puedo obtener Los threads de otro Proceso en ejecucion y mostrarlos en un listbox desde alli poder pausarlo , resumirlo o matarlos el TID de ese thread he buscado por todo san google y no tengo ni idea como empesar .para lo que no tenga idea que es lo que quiero hacer
http://es.tinypic.com/view.php?pic=11vi0bc&s=6#.VCLH-Vd9JDh
http://oi46.tinypic.com/11vi0bc.jpg
ese seria un ejemplo que lo hace con processExplorer pero yo quisiera hacerlo bajo este lenguaje (Delphi), Bueno si Mas Nada que decir y esperar que me ayuden en esto que estoy Buscando los dejo:...
Gracias Saludos
mamcx
24-09-2014, 16:54:32
Cual es el objetivo de eso? Que quieres lograr?
force1758
24-09-2014, 17:28:07
Cual es el objetivo de eso? Que quieres lograr?
hola y gracias por responder tan pronto ,Bueno mi objetivo es obtener una herramienta que me permita ver los TID de cualquier proceso de windows e ir comprobando Que funcion Cumple o vulneravilidades que tiene cuando se pausa o se elimina ese trhead ,se que con processexplore , y processhack se puede hacer tambien lo mismo , pero yo quiero compilar el mio propio pero solo esa parte de ver los trheads que estan en ejecucion de ese proceso y asi pausarlo , resumindolo o eliminandolo....
gracias Saludos
escafandra
24-09-2014, 19:01:39
La forma de hacer una lista de threads de un proceso PID, es esta:
HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
THREADENTRY32 te32 = {sizeof(te32)};
hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
if(hThreadSnap != INVALID_HANDLE_VALUE && Thread32First( hThreadSnap, &te32)){
do{
if(te32.th32OwnerProcessID == PID) // Si el hilo corresponde con el ID del proceso que me interesa...
{
te32.th32ThreadID; // aquí están los ThreadID encontrados
}
}while(Thread32Next(hThreadSnap, &te32 ) );
}
CloseHandle( hThreadSnap );
Lo siguiente será abrir el hilo OpenThread (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684335%28v=vs.85%29.aspx)con el ID encontrado y realizar lo que pretendes con él.
Saludos.
force1758
24-09-2014, 23:05:04
gracias mi amigo escafandra por darme una idea de como comenzar bueno e solucionado de ver los TID en una lista ahora seria como aria para ver (start Adress) , (como se Ve en la imagen de arriba) para ver los modulos de esas TID y asi tambien como aria para pausarlo , reanudarlo y terminarlo Bueno colocare el codigo que utilize y asi se expanda mas este hilo hasta finiquitar este proyecto que a muchos de seguro le servira:
procedure GetThreadList;
var
hThreadSnap, hThread: THandle;
te32: tagTHREADENTRY32;
dwPID: DWORD;
hProcess: THandle;
szFileName: array[0..MAX_PATH] of Char;
dwLen: DWORD;
PID: Integer;
begin
form1.ListBox1 .Clear;
hThreadSnap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if hThreadSnap = INVALID_HANDLE_VALUE then Exit;
try
PID:= 0;
if GetProcessID( form1.Edit1.Text ,PID, 1) then
dwPID := (PID);
te32.dwSize := SizeOf(THREADENTRY32);
if not Thread32First(hThreadSnap, te32) then Exit;
repeat
if te32.th32OwnerProcessID = dwPID then
begin
hThread := OpenThread(THREAD_ALL_ACCESS, False, te32.th32ThreadID);
form1.ListBox1.Items.AddObject(IntToStr(te32.th32ThreadID),TObject(hThread));
end;
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, False,te32.th32OwnerProcessID);
if hProcess <> 0 then
begin
dwLen := GetModuleFileName(hProcess, szFileName, MAX_PATH);
CloseHandle(hProcess);
// use szFileName up to dwLen characters as needed...
end;
until not Thread32Next(hThreadSnap, te32);
finally
CloseHandle(hThreadSnap);
end;
end;Gracias Saludos
escafandra
25-09-2014, 02:32:38
ResumeThread (http://msdn.microsoft.com/en-us/library/windows/desktop/ms685086%28v=vs.85%29.aspx)
SuspendThread (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686345%28v=vs.85%29.aspx)
TerminateThread (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686717%28v=vs.85%29.aspx)
Saludos.
force1758
25-09-2014, 04:39:50
ResumeThread (http://msdn.microsoft.com/en-us/library/windows/desktop/ms685086%28v=vs.85%29.aspx)
SuspendThread (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686345%28v=vs.85%29.aspx)
TerminateThread (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686717%28v=vs.85%29.aspx)
Saludos.
Gracias pero mi duda seria como aria el codigo ya que no se encuentra informacion sobre resumethread , suspendThread,Terminatethread he estado leyendo mucho y no consigo lo que mas quiero que son resumen ,suspendthread... Espero que alguien mas aporte sus conocimiento en el tema::.
Gracias Saludos
Casimiro Notevi
25-09-2014, 10:27:19
Pero si son enlaces con la descripción y ejemplos :confused:
escafandra
25-09-2014, 10:46:01
Casimiro te respondió.
Por favor, pon la "h" al verbo hacer.
Saludos.
Neftali [Germán.Estévez]
25-09-2014, 13:02:18
Como alternativa (y para llevar la contraria :D) para acceder a los threads de un proceso puedes utilizar WMI.
WMI posee la clase WIN32_Thread (http://msdn.microsoft.com/en-us/library/aa394494(v=vs.85).aspx) que justamente te devuelve eso.
Puedes utilizar consultas como estas para obtener los threads a partir de un ProcessID:
select * from WIN32_Thread where processHandle=2856
select Handle, Priority, ProcessHandle,ThreadState from WIN32_Thread where processHandle=2856
Utilizando uno de los ejemplos que hay sobre WMI (http://terawiki.clubdelphi.com/Delphi/Ejemplos/Win-API/?download=Informacion_Usuarios_Grupos_WMI.zip) en el FTP del club y modificando poca cosa puedes obtener los threads y todo la información sobre ellos.
Imagen:
http://s26.postimg.org/6hxnqz2x5/Captura_205.png
He subido el código del proyecto al FTP (http://terawiki.clubdelphi.com/Delphi/Ejemplos/Win-API/?download=Threads+de+un+proceso+WMI.zip).
Un saludo.
Casimiro Notevi
25-09-2014, 13:39:24
Puedes utilizar consultas como estas para obtener los threads a partir de un ProcessID:
select * from WIN32_Thread where processHandle=2856
select Handle, Priority, ProcessHandle,ThreadState from WIN32_Thread where processHandle=2856
¿Es una consulta a una base de datos de qué tipo y cuál es?
Neftali [Germán.Estévez]
25-09-2014, 13:48:14
¿Es una consulta a una base de datos de qué tipo y cuál es?
Es una "consulta" a WMI (Windows management Instrumentation) (http://msdn.microsoft.com/en-us/library/aa394582(v=vs.85).aspx)
Le llamamos consultas, porque Microsoft ha montado las llamadas con la estructura de SQL; En realidad con WQL (SQL for WMI) (http://msdn.microsoft.com/en-us/library/aa394606(v=vs.85).aspx). De esta forma las llamadas a WMI se pueden hacer de forma similar a las llamadas SQL a una base de Datos.
¿A eso te referías?
Casimiro Notevi
25-09-2014, 13:56:13
Sí, gracias, es que me ha resultado curioso :)
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.