1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-09 15:12:26 +08:00

单独剥离出来一个为windows的,增加RandNumLen为取指定长度随机数.

This commit is contained in:
guanren
2024-10-18 13:23:04 +08:00
parent 1ecb016969
commit fc5ca5e39e
6 changed files with 131 additions and 38 deletions

View File

@@ -1,3 +1,6 @@
//go:build windows
// +build windows
// Copyright 2021 dudaodong@gmail.com. All rights reserved.
// Use of this source code is governed by MIT license.
@@ -15,7 +18,6 @@ import (
"errors"
"fmt"
"github.com/duke-git/lancet/v2/validator"
"golang.org/x/sys/windows"
"io"
"io/fs"
"net/http"
@@ -25,7 +27,6 @@ import (
"sort"
"strings"
"sync"
"unsafe"
)
// FileReader is a reader supporting offset seeking and reading one
@@ -948,32 +949,3 @@ func ParallelChunkRead(filePath string, linesCh chan<- []string, chunkSizeMB, ma
return nil
}
// GetExeDllVersion 获取exe或dll文件的版本信息
func GetExeDllVersion(filePath string) (string, error) {
// 获取版本信息大小
size, err := windows.GetFileVersionInfoSize(filePath, nil)
if err != nil {
return "", fmt.Errorf("无法获取版本信息大小: %w", err)
}
// 读取版本信息
data := make([]byte, size)
err = windows.GetFileVersionInfo(filePath, 0, size, unsafe.Pointer(&data[0]))
if err != nil {
return "", fmt.Errorf("无法获取版本信息: %w", err)
}
// 查询版本信息
var fixedInfo *windows.VS_FIXEDFILEINFO
var fixedInfoLen uint32
err = windows.VerQueryValue(unsafe.Pointer(&data[0]), `\`, unsafe.Pointer(&fixedInfo), &fixedInfoLen)
if err != nil {
return "", fmt.Errorf("无法查询版本信息: %w", err)
}
// 提取版本号
major := fixedInfo.FileVersionMS >> 16
minor := fixedInfo.FileVersionMS & 0xFFFF
build := fixedInfo.FileVersionLS >> 16
revision := fixedInfo.FileVersionLS & 0xFFFF
return fmt.Sprintf("%d.%d.%d.%d", major, minor, build, revision), nil
}

View File

@@ -619,10 +619,3 @@ func TestChunkRead(t *testing.T) {
assert.Equal("Jim,21,male", lines[1])
}
func TestGetExeDllVersion(t *testing.T) {
v, err := GetExeDllVersion(`C:\Program Files\Tencent\WeChat\WeChat.exe`)
if err != nil {
t.Error(err)
}
t.Log(v)
}

81
fileutil/file_windows.go Normal file
View File

@@ -0,0 +1,81 @@
//go:build windows
package fileutil
import (
"fmt"
"syscall"
"unsafe"
)
// tagVS_FIXEDFILEINFO 参考结构体https://learn.microsoft.com/zh-cn/windows/win32/api/verrsrc/ns-verrsrc-vs_fixedfileinfo
type tagVS_FIXEDFILEINFO struct {
Signature uint32
StructVersion uint32
FileVersionMS uint32
FileVersionLS uint32
ProductVersionMS uint32
ProductVersionLS uint32
FileFlagsMask uint32
FileFlags uint32
FileOS uint32
FileType uint32
FileSubtype uint32
FileDateMS uint32
FileDateLS uint32
}
// GetExeDllVersion 获取exe或dll文件的版本信息
func GetExeDllVersion(filePath string) (string, error) {
// 加载系统dll
versionDLL := syscall.NewLazyDLL("version.dll")
getFileVersionInfoSize := versionDLL.NewProc("GetFileVersionInfoSizeW")
getFileVersionInfo := versionDLL.NewProc("GetFileVersionInfoW")
verQueryValue := versionDLL.NewProc("VerQueryValueW")
// 转换路径为UTF-16
filePathPtr, err := syscall.UTF16PtrFromString(filePath)
if err != nil {
return "", fmt.Errorf("unable to convert file path to UTF-16: %w", err)
}
// 获取version信息大小
size, _, err := getFileVersionInfoSize.Call(
uintptr(unsafe.Pointer(filePathPtr)),
0,
)
if size == 0 {
return "", fmt.Errorf("unable to obtain version information size: %v", err)
}
// 加载version信息
data := make([]byte, size)
ret, _, err := getFileVersionInfo.Call(uintptr(unsafe.Pointer(filePathPtr)), 0, size, uintptr(unsafe.Pointer(&data[0])))
if ret == 0 {
return "", fmt.Errorf("unable to obtain version information: %v", err)
}
// 查询version信息
var fixedInfo *tagVS_FIXEDFILEINFO
var fixedInfoLen uint32
u16, err := syscall.UTF16PtrFromString(`\`)
if err != nil {
return "", fmt.Errorf("unable to convert file path to UTF-16: %w", err)
}
ret, _, err = verQueryValue.Call(
uintptr(unsafe.Pointer(&data[0])),
uintptr(unsafe.Pointer(u16)),
uintptr(unsafe.Pointer(&fixedInfo)),
uintptr(unsafe.Pointer(&fixedInfoLen)),
)
if ret == 0 {
return "", fmt.Errorf("unable to query version information: %v", err)
}
// 转换结构体
major := fixedInfo.FileVersionMS >> 16
minor := fixedInfo.FileVersionMS & 0xFFFF
build := fixedInfo.FileVersionLS >> 16
revision := fixedInfo.FileVersionLS & 0xFFFF
return fmt.Sprintf("%d.%d.%d.%d", major, minor, build, revision), nil
}

View File

@@ -0,0 +1,13 @@
//go:build windows
package fileutil
import "testing"
func TestGetExeDllVersion(t *testing.T) {
v, err := GetExeDllVersion(`C:\Windows\System32\cmd.exe`)
if err != nil {
t.Error(err)
}
t.Log(v)
}