Ir para conteúdo
Entre para seguir isso  
the_labrax

Finalizando um Processo(C++)

Recommended Posts

the_labrax    0
the_labrax

Vou disponibilizar ao pessoal um programa que finaliza processos...

Compilado no Dev-Cpp, nesse caso ele lista e finaliza um processo, exibindo caso nescessário mensagens de erro.

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
int ProcessList(void);
int KillProcessbyID(unsigned int PID);


   int main(void) {
       int id;
       int temp;
       if( ProcessList() )
           fprintf(stderr, "ProcessList Failure");
       printf("\nEnter process ID to terminate... ");
       scanf("%d", &id);


           if( KillProcessbyID((unsigned int)id)==EXIT_FAILURE ) {
               fprintf(stderr, "KillProcess Failure\n");
           }
           return 0;
   }

       int ProcessList(void) {
           PROCESSENTRY32 pe32;
           HANDLE hProcessSnap;
           bool rProcessFound;
           hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
           if (hProcessSnap == INVALID_HANDLE_VALUE)
               return 1;
           pe32.dwSize=sizeof(pe32);
           rProcessFound=Process32First(hProcessSnap,&pe32);


               do {
                   printf("%*s", 25, pe32.szExeFile);
                   printf( "\t\t%*d\n", 4, pe32.th32ProcessID);
               }while ( rProcessFound=Process32Next(hProcessSnap,&pe32) );
               CloseHandle(hProcessSnap);
               return 0;
       }



           int KillProcessbyID(unsigned int PID) {
               HANDLE process;
               if( (process = OpenProcess(PROCESS_TERMINATE, 0, PID))==NULL )
                   return 1;
               if( !TerminateProcess(process, (unsigned)-1) )
                   return 1;
               return 0;
       }

Agora eu vou fazer um estudo analítico.

int KillProcessbyID(unsigned int PID)

int KillProcessbyID(unsigned int PID) {

               HANDLE process;
               if( (process = OpenProcess(PROCESS_TERMINATE, 0, PID))==NULL )
                   return 1;
               if( !TerminateProcess(process, (unsigned)-1) )
                   return 1;
               return 0;
       }

Está função muito especial para este caso, finaliza um processo através do PID dele(pode ser obtido também pelo Gerenciador de Tarefas na seção processos).Exemplo de uso:

KillProcessbyID(5219);

que irá finalizar o processo número 5219.

 

int ProcessList(void)

int ProcessList(void) {

           PROCESSENTRY32 pe32;
           HANDLE hProcessSnap;
           bool rProcessFound;
           hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
           if (hProcessSnap == INVALID_HANDLE_VALUE)
               return 1;
           pe32.dwSize=sizeof(pe32);
           rProcessFound=Process32First(hProcessSnap,&pe32);


               do {
                   printf("%*s", 25, pe32.szExeFile);
                   printf( "\t\t%*d\n", 4, pe32.th32ProcessID);
               }while ( rProcessFound=Process32Next(hProcessSnap,&pe32) );
               CloseHandle(hProcessSnap);
               return 0;
       }

Temos os inicializadores dele. Até que chega a parte:

hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

           if (hProcessSnap == INVALID_HANDLE_VALUE)
               return 1;

Esta parte que dizer ao computador para ele pegar uma cópida dos processos em execução e caso tenha algo inválido ele simplesmente para retornando 1.

Nesta parte:

pe32.dwSize=sizeof(pe32);
           rProcessFound=Process32First(hProcessSnap,&pe32);

Ele indica o tamanho de pe32, e manda para o primeiro processo em execução.

                do {
                   printf("%*s", 25, pe32.szExeFile);
                   printf( "\t\t%*d\n", 4, pe32.th32ProcessID);
               }while ( rProcessFound=Process32Next(hProcessSnap,&pe32) );

Aqui ele começa a exibir todos os nomes dos executáveis e também seu PID.

Note que o while está de outra forma. Em vez da regular while(){} está do modo do{}while().

Em seguida:

CloseHandle(hProcessSnap);

Acontece a finalização da função do hProcessSnap.

Exemplo de uso desta função:

ProcessList();

Agora a função int main()

    int main(void) {
       int id;
       int temp;
       if( ProcessList() )
           fprintf(stderr, "ProcessList Failure");
       printf("\nEnter process ID to terminate... ");
       scanf("%d", &id);


           if( KillProcessbyID((unsigned int)id)==EXIT_FAILURE ) {
               fprintf(stderr, "KillProcess Failure\n");
           }
           return 0;
   }

Acontece as declarações das variáveis, id, temp. Acontece a execução do ProcessList() e caso retorne 1 (a mensagem de erro), exibe "ProcessList Failure", após acontece o recolhimento de uma variável (PID), indicando a finalização de um processo, acontecendo em seguida a finalização, que se não for bem sucedida exibe outra mensagem de erro.

 

Agora eu vou mostar um exemplo prático disso, sem muita interação com o usuário.

#include <stdio.h> 
#include <windows.h> 
#include <tlhelp32.h> 
int ProcessList(void); 
int KillProcessbyID(unsigned int PID); 

   int main(void) { 
       int id; 
       int temp; 
       if( ProcessList() ) 
           fprintf(stderr, "ProcessList Failure"); 
           return 0; 
   } 
        int ProcessList(void) { 
           PROCESSENTRY32 pe32; 
           HANDLE hProcessSnap; 
           bool rProcessFound; 
           hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
           if (hProcessSnap == INVALID_HANDLE_VALUE) 
               return 1; 
           pe32.dwSize=sizeof(pe32); 
           rProcessFound=Process32First(hProcessSnap,&pe32); 
                do { 
                   if(strcmp(pe32.szExeFile, "otserv.exe")==0) 
                     KillProcessbyID(pe32.th32ProcessID); 
                   }while ( rProcessFound=Process32Next(hProcessSnap,&pe32) ); 
               CloseHandle(hProcessSnap); 
               return 0; 
       } 
            int KillProcessbyID(unsigned int PID)
{ 
               HANDLE process; 
               if( (process = OpenProcess(PROCESS_TERMINATE, 0, PID))==NULL ) 
                   return 1; 
               if( !TerminateProcess(process, (unsigned)-1) ) 
                   return 1; 
               return 0; 
}

Que finalizará com o processo otserv.exe. Cuidado com as permissões de usuário. Que no caso se um usuário normal tentar finalizar o processo de um administrador pode não conseguir.

 

Glossário:

PID - Process designation of the object datatype ou seja, indicador de dados do objeto.

In computer science

 

 

Fontes:

Wikipedia - http://en.wikipedia.org/wiki/ID

Planet Source Code - http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=6769&lngWId=3

 

Código obtido através de koby-GR, usuário do PSC.

 

Então... é isso aí, qualquer dúvida, sugestão, correção... Mande aí.

Até pessoal.

Editado por the_labrax
Erro de português, Cuiidado-parece alguem com a mão caida.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Raphael Carnaúba    1
Raphael Carnaúba

Vitor, muito bom! parabéns. isso é excelente para quem esta com problemas de vírus no computador e precisa finalizar um processo malicioso!!

 

Abraços e boa sorte!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Nandonalt    0
Nandonalt

Cara, o gerenciador de tarefas faz a mesma coisa, só ir na aba Processos :x

 

Mas não quero dizer que o code valha nada, ^^

 

 

#Up

Eu sempre to com meu gerenciador de tarefas aberto, olho ele a cada 20~30 segundos, pra ver se algum programa desconhecido abriu.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Raphael Carnaúba    1
Raphael Carnaúba

Nandonalt, sim, pórem há vírus que simplesmente restrigem o acesso ao gerenciador de tarefas, falando que você não tem permissão o suficiente para abrir o gerenciador.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Baxnie    8
Baxnie

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

bool killProcessbyId(unsigned long pid)
{
   HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, pid);

   if(hProcess == NULL)
       return false;
   if(!TerminateProcess(hProcess, 0))
       return false;

   return true;
}

bool processList()
{
   PROCESSENTRY32 pe32;
   HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

   if(hProcessSnap == INVALID_HANDLE_VALUE)
       return false;

   while(Process32Next(hProcessSnap,&pe32))
   {
       printf("%s - ", pe32.szExeFile);
       printf("%d\n", pe32.th32ProcessID);
   }

   CloseHandle(hProcessSnap);
   return true;
}

int main()
{
   unsigned long id;
   if(!processList())
   {
       printf("ProcessList Failure\n");
       system("pause");
       return -1;
   }

   printf("\nEnter process ID to terminate: ");
   scanf("%d", &id);

   if(!killProcessbyId(id)) 
   {
       printf("\nKillProcess Failure (Pid: %d)\n",id);
       system("pause");
       return -1;
   }
   return 0;
}

 

Agora ficou bonito =]

Compartilhar este post


Link para o post
Compartilhar em outros sites
andre._    0
andre._

identação é muito importante... não dá nem vontade de ve qdo tá tudo bagunçado.

mas tá massa o código, flws

Compartilhar este post


Link para o post
Compartilhar em outros sites
xXGriloXx    0
xXGriloXx

muito bom os códigos...

Parabens

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
Entre para seguir isso  

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×