elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:42  


Tema destacado: Nueva página de elhacker.net en Google+ Google+

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  [C] Funciones para manejar procesos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Funciones para manejar procesos  (Leído 562 veces)
.::DoX::.

Desconectado Desconectado

Mensajes: 4



Ver Perfil
[C] Funciones para manejar procesos
« en: 7 Octubre 2011, 02:20 »

Bueno he estado aprendiendo a trabajar en C pero por cuestiones de tiempo lo habia dejado pero ahora que tuve tiempo hice estas simples funciones para manejar procesos de Windows para practicar y aprender  :P.

Procesos.h:

Código
#ifndef __PROCESOS__
#define __PROCESOS__
 
#include <windows.h>
#include <tlhelp32.h>
 
int EnumProc();
char **ListarProc();
int obtPid(char* Proc);
int TerminarProc(char* Proc);
 
#endif

Procesos.cpp

Código
/*
Autor: .::DoX::.
Fecha: 06/10/2011 - 06:00 PM
*/

 
#include "Procesos.h"
#include <stdlib.h>
#include <string.h>
 
void wCharToChar(WCHAR *wchar, char* dest);
 
int EnumProc()
{
int i = -1;
HANDLE hSnap;
PROCESSENTRY32 Proceso;
 
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Proceso.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnap, &Proceso);
do { i++; }while(Process32Next(hSnap, &Proceso));
CloseHandle(hSnap);
 
return i;
}
 
char **ListarProc()
{
char** tmp;
char aux[260];
int i = 0;
HANDLE hSnap;
PROCESSENTRY32 Proceso;
 
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Proceso.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnap, &Proceso);
 
tmp = (char**)malloc(sizeof(char*) * EnumProc());
 
do{
wCharToChar(Proceso.szExeFile, aux);
tmp[i] = (char*)malloc(sizeof(char) * strlen(aux) + 1);
strcpy(tmp[i], aux);
i++;
}while(Process32Next(hSnap, &Proceso));
CloseHandle(hSnap);
 
return tmp;
}
 
void wCharToChar(WCHAR *wchar, char* dest)
{
while(*wchar != '\0')
*dest++ = (char)*wchar++;
*dest = '\0';
}
 
int obtPid(char* Proc)
{
 
HANDLE hSnap;
PROCESSENTRY32 Proceso;
char tmp[260];
 
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Proceso.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnap, &Proceso);
 
do {
 
wCharToChar(Proceso.szExeFile, tmp);
 
if (!strcmp(tmp, Proc))
{
CloseHandle(hSnap);
return Proceso.th32ProcessID;
}
 
} while(Process32Next(hSnap, &Proceso));
 
CloseHandle(hSnap);
return 0;
}
 
int TerminarProc(char* Proc)
{
 
HANDLE hProc;
int Pid = obtPid(Proc);
 
hProc = OpenProcess(PROCESS_TERMINATE, 0, Pid);
if (hProc)
{
if (TerminateProcess(hProc, 0))
{
CloseHandle(hProc);
return 1;
}
}
 
CloseHandle(hProc);
return 0;
 
}


Ejemplo de uso:

Código
#include "Procesos.h"
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
char **a;
 
a = ListarProc();
 
for (int i=0; i<=EnumProc(); i++)
printf("%d - Name: %s - PID: %d\n", i, a[i], obtPid(a[i]));
 
ShellExecuteA(0, NULL, "C:\\Windows\\notepad.exe", NULL, NULL, 1);
Sleep(1000);
 
if (TerminarProc("notepad.exe"))
printf("\nEl proceso se termino con exito!");
else
printf("Hubo un error al terminar el proceso!");
 
getchar();
return 0;
}

La función "ListarProc" lista todos los procesos abiertos y los almacena en un arreglo de cadenas; "obtPid" obtiene el PID del proceso que se le pase; TerminateProc termina el proceso que se le pase.

Salu2


En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: [C] Funciones para manejar procesos
« Respuesta #1 en: 7 Octubre 2011, 09:05 »

malloc sin free = memory leak.


En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
dewolo

Desconectado Desconectado

Mensajes: 83


Ver Perfil
Re: [C] Funciones para manejar procesos
« Respuesta #2 en: 7 Octubre 2011, 14:50 »

puede ser que NEW y DELETE llaman por debajo a malloc y free, me parecio haber visto eso en el depurador ....

muy weno el codes pero ponele free , mas si haces mallocs dentro de un bucle con lo cual se asigna memoria continuamente y nunca se libera y el proceso se agranda mucho, aparte cuando cerras el proceso se prduce una excepcion y el sistema operativo lo debe liberar me parece  :xD
En línea
Queta

Desconectado Desconectado

Mensajes: 250



Ver Perfil
Re: [C] Funciones para manejar procesos
« Respuesta #3 en: 7 Octubre 2011, 17:57 »

Los operadores new y delete son exclusivos de C++.

http://www.cplusplus.com/doc/tutorial/dynamic/
En línea

"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines