- 修正 WTS 会话相关类型、枚举与活动会话选择逻辑 - 对齐 FILE_ID_DESCRIPTOR 布局与 FILE_ID_TYPE 语义,修复 OpenFileById 调用前提 - 修正 user32/shell32/kernel32 部分 API 的返回值、参数个数与错误处理 - 完善剪贴板更新格式读取的缓冲区重试逻辑 - 补充常用进程、线程、调试、桌面与会话 helper - 增加结构体布局、会话查询、剪贴板、CreateProcess 等回归测试 - 将默认 CreateProcess 相关测试切到 helper 进程,并保留显式开启的 cmd.exe 集成覆盖
42 lines
790 B
Go
42 lines
790 B
Go
package win32api
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
"syscall"
|
|
)
|
|
|
|
var (
|
|
procCacheMu sync.Mutex
|
|
dllCache = map[string]syscall.Handle{}
|
|
procCache = map[string]uintptr{}
|
|
)
|
|
|
|
func getProcAddr(dllName, procName string) (uintptr, error) {
|
|
cacheKey := dllName + "!" + procName
|
|
|
|
procCacheMu.Lock()
|
|
defer procCacheMu.Unlock()
|
|
|
|
if proc, ok := procCache[cacheKey]; ok {
|
|
return proc, nil
|
|
}
|
|
|
|
dll, ok := dllCache[dllName]
|
|
if !ok {
|
|
var err error
|
|
dll, err = syscall.LoadLibrary(dllName)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("load %s: %w", dllName, err)
|
|
}
|
|
dllCache[dllName] = dll
|
|
}
|
|
|
|
proc, err := syscall.GetProcAddress(syscall.Handle(dll), procName)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("resolve %s!%s: %w", dllName, procName, err)
|
|
}
|
|
procCache[cacheKey] = proc
|
|
return proc, nil
|
|
}
|