38 lines
711 B
Go
38 lines
711 B
Go
|
// +build windows
|
||
|
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"path/filepath"
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
shell = syscall.MustLoadDLL("Shell32.dll")
|
||
|
getFolderPath = shell.MustFindProc("SHGetFolderPathW")
|
||
|
)
|
||
|
|
||
|
const CSIDL_APPDATA = 26
|
||
|
|
||
|
func configFile() (string, error) {
|
||
|
dir, err := configDir()
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
return filepath.Join(dir, "packer.config"), nil
|
||
|
}
|
||
|
|
||
|
func configDir() (string, error) {
|
||
|
b := make([]uint16, syscall.MAX_PATH)
|
||
|
|
||
|
// See: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85).aspx
|
||
|
r, _, err := getFolderPath.Call(0, CSIDL_APPDATA, 0, 0, uintptr(unsafe.Pointer(&b[0])))
|
||
|
if uint32(r) != 0 {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
return syscall.UTF16ToString(b), nil
|
||
|
}
|