C & Docker & LINUX

c++ ) 특정 프로세스 종료

로픽 2019. 10. 28. 15:06
300x250
#include <Windows.h>
#include <TlHelp32.h>
#include <stdio.h>

BOOL ProcessAllKill(const char *szProcessName)
{
	//시스템 프로세스에 대한 전체 스냅샷 찍기
	HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	DWORD dwsma = GetLastError();
	HANDLE hHandle;

	DWORD dwExitCode = 0;

	//스냅샷 찍은 프로세스에 대한 실행파일 이름, 프로세스 정보, PPID에 대한 정보를 저장한 구조체
	PROCESSENTRY32 procEntry = { 0 };
	procEntry.dwSize = sizeof(PROCESSENTRY32);
	//스냅샷에 첫번째 프로세스를 검색
	Process32First(hndl, &procEntry);

	while (1)
	{
		//실행파일의 이름을 비교하여 같으면 OpenProcess 실행
		if (!strcmp(procEntry.szExeFile, szProcessName))
		{
			//존재하는 프로세스 객체 열기(모든접근, 0, PID)
			hHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, procEntry.th32ProcessID);

			//특정 프로세스의 종료 상태 검색(handle, 프로세스 상태값) - return nonzero
			if (GetExitCodeProcess(hHandle, &dwExitCode))
			{
				//특정 프로세스나 그것의 스레드 전부를 종료
				if (TerminateProcess(hHandle, dwExitCode))
				{
					return TRUE;
				}
			}
		}

		//시스템 스냅샷에 등록된 다음 프로세스에 대한 정보를 검색(스냅샷, processEntry32 구조체)
		if (!Process32Next(hndl, &procEntry))
		{
			return FALSE;
		}
	}

	return FALSE;
}

void main()
{
	if (ProcessAllKill("chrome.exe"))
		printf("성공\n");
	else
		printf("실패\n");
	return;
반응형