본문으로 건너뛰기

실행파일명으로 윈도 프로세스 찾기

구글링중 찾은 코드를 조금 손봤습니다. 프로세스명(실행파일명)으로 프로세스가 있는지를 체크하는 함수와 프로세스를 죽이는 함수인데..

os.FindProcess 로 Kill 하는게 윈도서도 제대로 될진 모르겠네요 ㅎㅎ

findProcessByName 까진 정상동작 확인했습니다.

Go
package main

import (
	"os"
	"strings"
	"syscall"
	"unsafe"

	"golang.org/x/sys/windows"
)

const TH32CS_SNAPPROCESS = 0x00000002

type WindowsProcess struct {
	ProcessID       int
	ParentProcessID int
	Exe             string
}

/
*	processes
/
func processes() ([]WindowsProcess, error) {
	handle, err := windows.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
	if err != nil {
		return nil, err
	}
	defer windows.CloseHandle(handle)

	var entry windows.ProcessEntry32
	entry.Size = uint32(unsafe.Sizeof(entry))
	<em>// get the first process</em>
	err = windows.Process32First(handle, &entry)
	if err != nil {
		return nil, err
	}

	results := make([]WindowsProcess, 0, 50)
	for {
		results = append(results, newWindowsProcess(&entry))

		err = windows.Process32Next(handle, &entry)
		if err != nil {
			<em>// windows sends ERROR_NO_MORE_FILES on last process</em>
			if err == syscall.ERROR_NO_MORE_FILES {
				return results, nil
			}
			return nil, err
		}
	}
}

/
*	findProcessByName
/
func findProcessByName(name string) WindowsProcess {

	processes, perr := processes()

	if perr != nil {
		return nil
	}

	for _, p := range processes {
		if strings.ToLower(p.Exe) == strings.ToLower(name) {
			return &p
		}
	}
	return nil
}

/**
	newWindowsProcess
/
func newWindowsProcess(e *windows.ProcessEntry32) WindowsProcess {
	<em>// Find when the string ends for decoding</em>
	end := 0
	for {
		if e.ExeFile[end] == 0 {
			break
		}
		end++
	}

	return WindowsProcess{
		ProcessID:       int(e.ProcessID),
		ParentProcessID: int(e.ParentProcessID),
		Exe:             syscall.UTF16ToString(e.ExeFile[:end]),
	}
}

/
*	killProcess
**/
func killProcess(name string) {
	pn := findProcessByName(name)

	if pn != nil {
		p, perr := os.FindProcess(pn.ProcessID)

		if perr == nil {
			p.Kill()
		}
	}
}