| // Copyright 2016 The Go Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style | 
 | // license that can be found in the LICENSE file. | 
 |  | 
 | package os | 
 |  | 
 | import ( | 
 | 	"internal/syscall/windows" | 
 | 	"syscall" | 
 | ) | 
 |  | 
 | func getModuleFileName(handle syscall.Handle) (string, error) { | 
 | 	n := uint32(1024) | 
 | 	var buf []uint16 | 
 | 	for { | 
 | 		buf = make([]uint16, n) | 
 | 		r, err := windows.GetModuleFileName(handle, &buf[0], n) | 
 | 		if err != nil { | 
 | 			return "", err | 
 | 		} | 
 | 		if r < n { | 
 | 			break | 
 | 		} | 
 | 		// r == n means n not big enough | 
 | 		n += 1024 | 
 | 	} | 
 | 	return syscall.UTF16ToString(buf), nil | 
 | } | 
 |  | 
 | func executable() (string, error) { | 
 | 	return getModuleFileName(0) | 
 | } |