Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: .::DoX::. en 7 Octubre 2011, 02:20 am



Título: [C] Funciones para manejar procesos
Publicado por: .::DoX::. en 7 Octubre 2011, 02:20 am
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
  1. #ifndef __PROCESOS__
  2. #define __PROCESOS__
  3.  
  4. #include <windows.h>
  5. #include <tlhelp32.h>
  6.  
  7. int EnumProc();
  8. char **ListarProc();
  9. int obtPid(char* Proc);
  10. int TerminarProc(char* Proc);
  11.  
  12. #endif

Procesos.cpp

Código
  1. /*
  2. Autor: .::DoX::.
  3. Fecha: 06/10/2011 - 06:00 PM
  4. */
  5.  
  6. #include "Procesos.h"
  7. #include <stdlib.h>
  8. #include <string.h>
  9.  
  10. void wCharToChar(WCHAR *wchar, char* dest);
  11.  
  12. int EnumProc()
  13. {
  14. int i = -1;
  15. HANDLE hSnap;
  16. PROCESSENTRY32 Proceso;
  17.  
  18. hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  19. Proceso.dwSize = sizeof(PROCESSENTRY32);
  20. Process32First(hSnap, &Proceso);
  21. do { i++; }while(Process32Next(hSnap, &Proceso));
  22. CloseHandle(hSnap);
  23.  
  24. return i;
  25. }
  26.  
  27. char **ListarProc()
  28. {
  29. char** tmp;
  30. char aux[260];
  31. int i = 0;
  32. HANDLE hSnap;
  33. PROCESSENTRY32 Proceso;
  34.  
  35. hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  36. Proceso.dwSize = sizeof(PROCESSENTRY32);
  37. Process32First(hSnap, &Proceso);
  38.  
  39. tmp = (char**)malloc(sizeof(char*) * EnumProc());
  40.  
  41. do{
  42. wCharToChar(Proceso.szExeFile, aux);
  43. tmp[i] = (char*)malloc(sizeof(char) * strlen(aux) + 1);
  44. strcpy(tmp[i], aux);
  45. i++;
  46. }while(Process32Next(hSnap, &Proceso));
  47. CloseHandle(hSnap);
  48.  
  49. return tmp;
  50. }
  51.  
  52. void wCharToChar(WCHAR *wchar, char* dest)
  53. {
  54. while(*wchar != '\0')
  55. *dest++ = (char)*wchar++;
  56. *dest = '\0';
  57. }
  58.  
  59. int obtPid(char* Proc)
  60. {
  61.  
  62. HANDLE hSnap;
  63. PROCESSENTRY32 Proceso;
  64. char tmp[260];
  65.  
  66. hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  67. Proceso.dwSize = sizeof(PROCESSENTRY32);
  68. Process32First(hSnap, &Proceso);
  69.  
  70. do {
  71.  
  72. wCharToChar(Proceso.szExeFile, tmp);
  73.  
  74. if (!strcmp(tmp, Proc))
  75. {
  76. CloseHandle(hSnap);
  77. return Proceso.th32ProcessID;
  78. }
  79.  
  80. } while(Process32Next(hSnap, &Proceso));
  81.  
  82. CloseHandle(hSnap);
  83. return 0;
  84. }
  85.  
  86. int TerminarProc(char* Proc)
  87. {
  88.  
  89. HANDLE hProc;
  90. int Pid = obtPid(Proc);
  91.  
  92. hProc = OpenProcess(PROCESS_TERMINATE, 0, Pid);
  93. if (hProc)
  94. {
  95. if (TerminateProcess(hProc, 0))
  96. {
  97. CloseHandle(hProc);
  98. return 1;
  99. }
  100. }
  101.  
  102. CloseHandle(hProc);
  103. return 0;
  104.  
  105. }


Ejemplo de uso:

Código
  1. #include "Procesos.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7. char **a;
  8.  
  9. a = ListarProc();
  10.  
  11. for (int i=0; i<=EnumProc(); i++)
  12. printf("%d - Name: %s - PID: %d\n", i, a[i], obtPid(a[i]));
  13.  
  14. ShellExecuteA(0, NULL, "C:\\Windows\\notepad.exe", NULL, NULL, 1);
  15. Sleep(1000);
  16.  
  17. if (TerminarProc("notepad.exe"))
  18. printf("\nEl proceso se termino con exito!");
  19. else
  20. printf("Hubo un error al terminar el proceso!");
  21.  
  22. return 0;
  23. }

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


Título: Re: [C] Funciones para manejar procesos
Publicado por: Eternal Idol en 7 Octubre 2011, 09:05 am
malloc sin free = memory leak.


Título: Re: [C] Funciones para manejar procesos
Publicado por: dewolo en 7 Octubre 2011, 14:50 pm
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


Título: Re: [C] Funciones para manejar procesos
Publicado por: Queta en 7 Octubre 2011, 17:57 pm
Los operadores new y delete son exclusivos de C++.

http://www.cplusplus.com/doc/tutorial/dynamic/ (http://www.cplusplus.com/doc/tutorial/dynamic/)