Files
netbird/client/ui/services/debug_reveal_windows.go
Zoltan Papp 8b7ce337d8 [client] UI refactor (#6069)
Refactor UI

---------

Co-authored-by: Eduard Gert <kontakt@eduardgert.de>
Co-authored-by: braginini <bangvalo@gmail.com>
Co-authored-by: Pascal Fischer <32096965+pascal-fischer@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: riccardom <riccardomanfrin@gmail.com>
2026-06-19 09:59:28 +02:00

55 lines
1.5 KiB
Go

package services
import (
"fmt"
"os/exec"
"path/filepath"
"unsafe"
"golang.org/x/sys/windows"
)
// SW_SHOWNORMAL for ShellExecuteW's nShowCmd.
const swShowNormal = 1
var (
shell32 = windows.NewLazySystemDLL("shell32.dll")
procShellExecute = shell32.NewProc("ShellExecuteW")
)
// revealFile opens Explorer focused on path. The debug bundle is written by the
// daemon (running as SYSTEM) into C:\Windows\SystemTemp, whose ACL denies the
// logged-in user. A plain "explorer /select" can't traverse it, so we elevate
// via the ShellExecuteW "runas" verb (UAC prompt) — the elevated Explorer can
// read the folder and highlight the file.
func revealFile(path string) error {
verb, err := windows.UTF16PtrFromString("runas")
if err != nil {
return fmt.Errorf("encode verb: %w", err)
}
file, err := windows.UTF16PtrFromString("explorer.exe")
if err != nil {
return fmt.Errorf("encode file: %w", err)
}
params, err := windows.UTF16PtrFromString("/select," + path)
if err != nil {
return fmt.Errorf("encode params: %w", err)
}
// ShellExecuteW returns an HINSTANCE; a value <=32 is an error code.
ret, _, _ := procShellExecute.Call(
0,
uintptr(unsafe.Pointer(verb)),
uintptr(unsafe.Pointer(file)),
uintptr(unsafe.Pointer(params)),
0,
swShowNormal,
)
if ret <= 32 {
// Elevation declined or failed: fall back to an unelevated reveal of the
// parent directory so the user at least lands near the bundle.
return exec.Command("explorer", filepath.Dir(path)).Start() //nolint:gosec
}
return nil
}