aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/version/version_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'version/version_windows.go')
-rw-r--r--version/version_windows.go55
1 files changed, 16 insertions, 39 deletions
diff --git a/version/version_windows.go b/version/version_windows.go
index b8775b7d..b583d160 100644
--- a/version/version_windows.go
+++ b/version/version_windows.go
@@ -6,11 +6,8 @@
package version
import (
- "errors"
- "fmt"
"os"
"runtime"
- "strings"
"unsafe"
"golang.org/x/sys/windows"
@@ -20,31 +17,12 @@ import (
//sys GetFileVersionInfo(filename *uint16, zero uint32, size uint32, block *byte) (err error) = version.GetFileVersionInfoW
//sys VerQueryValue(block *byte, section *uint16, value **byte, size *uint32) (err error) = version.VerQueryValueW
-type vsFixedFileInfo struct {
- Signature uint32
- StrucVersion uint32
- FileVersionMS uint32
- FileVersionLS uint32
- ProductVersionMS uint32
- ProductVersionLS uint32
- FileFlagsMask uint32
- FileFlags uint32
- FileOS uint32
- FileType uint32
- FileSubtype uint32
- FileDateMS uint32
- FileDateLS uint32
-}
-
-const vsFixedFileInfoSignature = 0xFEEF04BD
-
-var cachedVersion string
+var cachedVersion, cachedName string
-func RunningVersion() string {
- if len(cachedVersion) != 0 {
- return cachedVersion
+func RunningNameVersion() (name, version string) {
+ if len(cachedVersion) != 0 || len(cachedName) != 0 {
+ return cachedName, cachedVersion
}
- key16 := []uint16{'\\', 0x00}
self, err := os.Executable()
if err != nil {
panic(err)
@@ -63,22 +41,21 @@ func RunningVersion() string {
if err != nil {
panic(err)
}
- var fixedFileInfo *vsFixedFileInfo
- err = VerQueryValue(&buffer[0], &key16[0], (**byte)(unsafe.Pointer(&fixedFileInfo)), &size)
+
+ var val16 *uint16
+ err = VerQueryValue(&buffer[0], windows.StringToUTF16Ptr(`\StringFileInfo\040904b0\ProductName`), (**byte)(unsafe.Pointer(&val16)), &size)
if err != nil {
panic(err)
}
- if uintptr(size) < unsafe.Sizeof(vsFixedFileInfo{}) || fixedFileInfo == nil || fixedFileInfo.Signature != vsFixedFileInfoSignature {
- panic(errors.New("Incorrect return of VS_FIXEDFILEINFO"))
- }
- version := fmt.Sprintf("%d.%d.%d.%d", (fixedFileInfo.FileVersionMS>>16)&0xffff, (fixedFileInfo.FileVersionMS>>0)&0xffff, (fixedFileInfo.FileVersionLS>>16)&0xffff, (fixedFileInfo.FileVersionLS>>0)&0xffff)
- runtime.KeepAlive(buffer) // The win32 API aliases it in fixedFileInfo, but Go doesn't know that.
- if strings.HasSuffix(version, ".0") {
- version = version[:len(version)-2]
- }
- if strings.HasSuffix(version, ".0") {
- version = version[:len(version)-2]
+ name = windows.UTF16ToString((*[(1 << 30) - 1]uint16)(unsafe.Pointer(val16))[:size])
+ err = VerQueryValue(&buffer[0], windows.StringToUTF16Ptr(`\StringFileInfo\040904b0\ProductVersion`), (**byte)(unsafe.Pointer(&val16)), &size)
+ if err != nil {
+ panic(err)
}
+ version = windows.UTF16ToString((*[(1 << 30) - 1]uint16)(unsafe.Pointer(val16))[:size])
+ runtime.KeepAlive(buffer)
+
+ cachedName = name
cachedVersion = version
- return version
+ return
}