@@ -24,17 +24,11 @@ import (
24
24
"errors"
25
25
"fmt"
26
26
"unsafe"
27
- )
28
27
29
- // Syscalls
30
- //sys _GetFileVersionInfo(filename string, reserved uint32, dataLen uint32, data *byte) (success bool, err error) [!success] = version.GetFileVersionInfoW
31
- //sys _GetFileVersionInfoSize(filename string, handle uintptr) (size uint32, err error) = version.GetFileVersionInfoSizeW
32
- //sys _VerQueryValueW(data *byte, subBlock string, pBuffer *uintptr, len *uint32) (success bool, err error) [!success] = version.VerQueryValueW
28
+ "golang.org/x/sys/windows"
29
+ )
33
30
34
- // FixedFileInfo contains version information for a file. This information is
35
- // language and code page independent. This is an equivalent representation of
36
- // VS_FIXEDFILEINFO.
37
- // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646997(v=vs.85).aspx
31
+ // Deprecated: use x/sys/windows
38
32
type FixedFileInfo struct {
39
33
Signature uint32
40
34
StrucVersion uint32
@@ -83,25 +77,20 @@ func (d VersionData) QueryValue(key string) (string, error) {
83
77
CodePage uint16
84
78
}
85
79
86
- var dataPtr uintptr
87
- var size uint32
88
- if _ , err := _VerQueryValueW ( & d [0 ], `\VarFileInfo\Translation` , & dataPtr , & size ); err != nil || size == 0 {
80
+ var langCodePage * LangAndCodePage
81
+ langCodeLen := uint32 ( unsafe . Sizeof ( * langCodePage ))
82
+ if err := windows . VerQueryValue ( unsafe . Pointer ( & d [0 ]) , `\VarFileInfo\Translation` , ( unsafe . Pointer )( & langCodePage ) , & langCodeLen ); err != nil || langCodeLen == 0 {
89
83
return "" , fmt .Errorf ("failed to get list of languages: %w" , err )
90
84
}
91
85
92
- offset := int (dataPtr - (uintptr )(unsafe .Pointer (& d [0 ])))
93
- if offset <= 0 || offset > len (d )- 1 {
94
- return "" , errors .New ("invalid address" )
95
- }
96
-
97
- l := * (* LangAndCodePage )(unsafe .Pointer (& d [offset ]))
98
-
99
- subBlock := fmt .Sprintf (`\StringFileInfo\%04x%04x\%v` , l .Language , l .CodePage , key )
100
- if _ , err := _VerQueryValueW (& d [0 ], subBlock , & dataPtr , & size ); err != nil || size == 0 {
86
+ var dataPtr uintptr
87
+ var size uint32
88
+ subBlock := fmt .Sprintf (`\StringFileInfo\%04x%04x\%v` , langCodePage .Language , langCodePage .CodePage , key )
89
+ if err := windows .VerQueryValue (unsafe .Pointer (& d [0 ]), subBlock , (unsafe .Pointer )(& dataPtr ), & size ); err != nil || langCodeLen == 0 {
101
90
return "" , fmt .Errorf ("failed to query %v: %w" , subBlock , err )
102
91
}
103
92
104
- offset = int (dataPtr - (uintptr )(unsafe .Pointer (& d [0 ])))
93
+ offset : = int (dataPtr - (uintptr )(unsafe .Pointer (& d [0 ])))
105
94
if offset <= 0 || offset > len (d )- 1 {
106
95
return "" , errors .New ("invalid address" )
107
96
}
@@ -118,38 +107,30 @@ func (d VersionData) QueryValue(key string) (string, error) {
118
107
// version-information resource. It queries the root block to get the
119
108
// VS_FIXEDFILEINFO value.
120
109
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms647464(v=vs.85).aspx
121
- func (d VersionData ) FixedFileInfo () (* FixedFileInfo , error ) {
110
+ func (d VersionData ) FixedFileInfo () (* windows. VS_FIXEDFILEINFO , error ) {
122
111
if len (d ) == 0 {
123
112
return nil , errors .New ("use GetFileVersionInfo to initialize VersionData" )
124
113
}
125
114
126
- var dataPtr uintptr
127
- var size uint32
128
- if _ , err := _VerQueryValueW ( & d [0 ], `\` , & dataPtr , & size ); err != nil {
115
+ var fixedInfo * windows. VS_FIXEDFILEINFO
116
+ fixedInfoLen := uint32 ( unsafe . Sizeof ( * fixedInfo ))
117
+ if err := windows . VerQueryValue ( unsafe . Pointer ( & d [0 ]) , `\` , ( unsafe . Pointer )( & fixedInfo ) , & fixedInfoLen ); err != nil {
129
118
return nil , fmt .Errorf ("VerQueryValue failed for \\ : %w" , err )
130
119
}
131
120
132
- offset := int (dataPtr - (uintptr )(unsafe .Pointer (& d [0 ])))
133
- if offset <= 0 || offset > len (d )- 1 {
134
- return nil , errors .New ("invalid address" )
135
- }
136
-
137
- // Make a copy of the struct.
138
- ffi := * (* FixedFileInfo )(unsafe .Pointer (& d [offset ]))
139
-
140
- return & ffi , nil
121
+ return fixedInfo , nil
141
122
}
142
123
143
124
// GetFileVersionInfo retrieves version information for the specified file.
144
125
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms647003(v=vs.85).aspx
145
126
func GetFileVersionInfo (filename string ) (VersionData , error ) {
146
- size , err := _GetFileVersionInfoSize (filename , 0 )
127
+ size , err := windows . GetFileVersionInfoSize (filename , nil )
147
128
if err != nil {
148
129
return nil , fmt .Errorf ("GetFileVersionInfoSize failed: %w" , err )
149
130
}
150
131
151
132
data := make (VersionData , size )
152
- _ , err = _GetFileVersionInfo (filename , 0 , uint32 (len (data )), & data [0 ])
133
+ err = windows . GetFileVersionInfo (filename , 0 , uint32 (len (data )), unsafe . Pointer ( & data [0 ]) )
153
134
if err != nil {
154
135
return nil , fmt .Errorf ("GetFileVersionInfo failed: %w" , err )
155
136
}
0 commit comments