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