// GetProcessByFileName returns the process with the given file name. // If multiple processes have the same filename, the first process // enumerated by this function is returned. func GetProcessByFileName(fileName string) (Process, error) { // Read in process ids PIDs := make([]uint32, 1024) var bytesRead uint32 = 0 ok := w32.EnumProcesses(PIDs, uint32(len(PIDs)), &bytesRead) if !ok { panic("Error Enumerating processes.") } // Loop over pids, // Divide bytesRead by sizeof(uint32) to get how many processes there are. for i := uint32(0); i < (bytesRead / 4); i++ { // Make sure to skip over the system process with PID 0 if PIDs[i] == 0 { continue } // Check if its the process if getFileNameByPID(PIDs[i]) == fileName { hnd, ok := w32.OpenProcess(PROCESS_ALL_ACCESS, false, PIDs[i]) if !ok { return Process{}, errors.New(fmt.Sprintf("Error while opening process %d", PIDs[i])) } return Process{ProcPlatAttribs: ProcPlatAttribs{Handle: hnd}, PID: uint64(PIDs[i])}, nil } } // Couldn't find process, return an error return Process{}, errors.New("Couldn't find process with name " + fileName) }
//getFileNameByPID returns a file name given a PID. func getFileNameByPID(pid uint32) string { var fileName string = `<Unknown File>` //Open process hnd, ok := w32.OpenProcess(w32.PROCESS_QUERY_INFORMATION, false, pid) if !ok { return fileName } defer w32.CloseHandle(hnd) //Get file path path, ok := w32.GetProcessImageFileName(hnd) if !ok { return fileName } //Split file path to get file name _, fileName = filepath.Split(path) return fileName }