mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-13 17:29:46 +08:00
75 lines
2.0 KiB
Go
75 lines
2.0 KiB
Go
package db
|
||
|
||
import (
|
||
"debug/pe"
|
||
"fmt"
|
||
"runtime"
|
||
"strings"
|
||
)
|
||
|
||
const (
|
||
peMachineI386 uint16 = 0x014c
|
||
peMachineAmd64 uint16 = 0x8664
|
||
peMachineArm64 uint16 = 0xaa64
|
||
)
|
||
|
||
func windowsMachineLabel(machine uint16) string {
|
||
switch machine {
|
||
case peMachineI386:
|
||
return "windows-386"
|
||
case peMachineAmd64:
|
||
return "windows-amd64"
|
||
case peMachineArm64:
|
||
return "windows-arm64"
|
||
default:
|
||
return fmt.Sprintf("windows-unknown(0x%04x)", machine)
|
||
}
|
||
}
|
||
|
||
func expectedWindowsMachineForGoArch(goarch string) (uint16, string, bool) {
|
||
switch strings.ToLower(strings.TrimSpace(goarch)) {
|
||
case "386":
|
||
return peMachineI386, "windows-386", true
|
||
case "amd64":
|
||
return peMachineAmd64, "windows-amd64", true
|
||
case "arm64":
|
||
return peMachineArm64, "windows-arm64", true
|
||
default:
|
||
return 0, "", false
|
||
}
|
||
}
|
||
|
||
func validateWindowsExecutableMachine(pathText string) error {
|
||
file, err := pe.Open(pathText)
|
||
if err != nil {
|
||
return fmt.Errorf("无法识别为有效的 Windows 可执行文件:%w", err)
|
||
}
|
||
defer file.Close()
|
||
|
||
expectedMachine, expectedLabel, ok := expectedWindowsMachineForGoArch(runtime.GOARCH)
|
||
if !ok {
|
||
return nil
|
||
}
|
||
actualMachine := file.FileHeader.Machine
|
||
if actualMachine != expectedMachine {
|
||
return fmt.Errorf("可执行文件架构不兼容(文件=%s,当前进程=%s)", windowsMachineLabel(actualMachine), expectedLabel)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// ValidateOptionalDriverAgentExecutable 校验可选驱动代理二进制是否可在当前进程中执行。
|
||
// 当前主要用于 Windows 下的 PE 架构兼容性校验,避免升级后复用到错误架构的旧代理。
|
||
func ValidateOptionalDriverAgentExecutable(driverType string, executablePath string) error {
|
||
pathText := strings.TrimSpace(executablePath)
|
||
if pathText == "" {
|
||
return fmt.Errorf("%s 驱动代理路径为空", driverDisplayName(driverType))
|
||
}
|
||
if runtime.GOOS != "windows" {
|
||
return nil
|
||
}
|
||
if err := validateWindowsExecutableMachine(pathText); err != nil {
|
||
return fmt.Errorf("%s 驱动代理不可用:%w", driverDisplayName(driverType), err)
|
||
}
|
||
return nil
|
||
}
|