1// Copyright 2016 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package os
6
7import (
8	"internal/syscall/windows"
9	"syscall"
10)
11
12func getModuleFileName(handle syscall.Handle) (string, error) {
13	n := uint32(1024)
14	var buf []uint16
15	for {
16		buf = make([]uint16, n)
17		r, err := windows.GetModuleFileName(handle, &buf[0], n)
18		if err != nil {
19			return "", err
20		}
21		if r < n {
22			break
23		}
24		// r == n means n not big enough
25		n += 1024
26	}
27	return syscall.UTF16ToString(buf), nil
28}
29
30func executable() (string, error) {
31	return getModuleFileName(0)
32}
33