aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/conf/path_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'conf/path_windows.go')
-rw-r--r--conf/path_windows.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/conf/path_windows.go b/conf/path_windows.go
new file mode 100644
index 00000000..0ee3fc73
--- /dev/null
+++ b/conf/path_windows.go
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
+ */
+
+package conf
+
+import (
+ "errors"
+ "golang.org/x/sys/windows"
+ "os"
+ "path/filepath"
+ "unsafe"
+)
+
+//sys coTaskMemFree(pointer uintptr) = ole32.CoTaskMemFree
+//sys shGetKnownFolderPath(id *windows.GUID, flags uint32, token windows.Handle, path **uint16) (err error) [failretval!=0] = shell32.SHGetKnownFolderPath
+var folderIDLocalAppData = windows.GUID{0xf1b32785, 0x6fba, 0x4fcf, [8]byte{0x9d, 0x55, 0x7b, 0x8e, 0x7f, 0x15, 0x70, 0x91}}
+
+const kfFlagCreate = 0x00008000
+
+var cachedConfigFileDir string
+
+func resolveConfigFileDir() (string, error) {
+ if cachedConfigFileDir != "" {
+ return cachedConfigFileDir, nil
+ }
+ processToken, err := windows.OpenCurrentProcessToken()
+ if err != nil {
+ return "", err
+ }
+ defer processToken.Close()
+ var path *uint16
+ err = shGetKnownFolderPath(&folderIDLocalAppData, kfFlagCreate, windows.Handle(processToken), &path)
+ if err != nil {
+ return "", err
+ }
+ defer coTaskMemFree(uintptr(unsafe.Pointer(path)))
+ root := windows.UTF16ToString((*[windows.MAX_LONG_PATH + 1]uint16)(unsafe.Pointer(path))[:])
+ if len(root) == 0 {
+ return "", errors.New("Unable to determine configuration directory")
+ }
+ c := filepath.Join(root, "WireGuard", "Configurations")
+ err = os.MkdirAll(c, os.ModeDir|0700)
+ if err != nil {
+ return "", err
+ }
+ cachedConfigFileDir = c
+ return cachedConfigFileDir, nil
+}