|  | // 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) | 
|  | } |