Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to effectively kill a process in C++ (Win32)?

Tags:

I am currently writing a very lightweight program so I have to use C++ since it is not bound to .NET framework which drastically increases size of the program.

I need to be able to terminate process and to do that I need to get a process handle. Unfortuanately I haven't figured how to do that yet.

P.S. I know that to kill a process you have to use TerminateProcess.

like image 362
Kristina Brooks Avatar asked Dec 16 '09 18:12

Kristina Brooks


People also ask

How kill a process in Windows C++?

If you know the pid, you can open a handle to the process using OpenProcess(). Then you can terminate the process using TerminateProcess().

How do you stop a process in CMD?

Ctrl + C should stop a program running from the command prompt, similar to linux. /F will force termination of the process, /IM means you're going to provide the running executable that you want to end, thus process.exe is the process to end.

How do you terminate a process?

Usually to stop a process, you start task manager, select the Processes tab, select the process and click "End Process" however you can also accomplish the same from the command prompt using 2 Resource Kit utilities.


1 Answers

The PID you need for OpenProcess() is not normally easy to get a hold of. If all you got is a process name then you need to iterate the running processes on the machine. Do so with CreateToolhelp32Snapshot, followed by Process32First and loop with Process32Next. The PROCESSENTRY32.szExeFile gives you the process name (not path!), th32ProcessID gives you the PID.

The next consideration is that the process may appear more than once. And there's a chance that the same process name is used for very different programs. Like "Setup". If you don't just want to kill them all, you'll need to try to obtain some runtime info from them. Window caption bar text, perhaps. GetProcessImageFileName() can give you the path to the .exe. It uses the native kernel format, you'd need QueryDosDevice to map a disk drive device name to a drive letter.

The next consideration is the rights you ask for in OpenProcess(). You are unlikely to get PROCESS_ALL_ACCESS, all you need is PROCESS_TERMINATE. Although that's privileged as well. Ensure the account you use to run your program can obtain that right.

like image 63
Hans Passant Avatar answered Sep 18 '22 12:09

Hans Passant