From 9eb567aecbf9018c5fe9ceb13aa4c374f464b8c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 20 Mar 2026 22:33:13 +0800 Subject: [PATCH] feat: add internal/zecall --- internal/zecall/zecall_windows.go | 59 +++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 internal/zecall/zecall_windows.go diff --git a/internal/zecall/zecall_windows.go b/internal/zecall/zecall_windows.go new file mode 100644 index 0000000..cf0a2d0 --- /dev/null +++ b/internal/zecall/zecall_windows.go @@ -0,0 +1,59 @@ +package gozel + +import ( + "errors" + "syscall" +) + +const ( + zeLibraryName = "ze_loader.dll" +) + +var ( + // ErrZeCallNotInit please call Init() first + ErrZeCallNotInit = errors.New("zecall not init") + // ErrNoSuchProcess please register the process first + ErrNoSuchProcess = errors.New("no such process") +) + +var ( + libZeLoader *syscall.DLL + procMap = map[string]*syscall.Proc{} +) + +// Init load lib using syscall +func Init() error { + h, err := syscall.LoadLibrary(zeLibraryName) + if err != nil { + return err + } + libZeLoader = &syscall.DLL{Handle: h, Name: zeLibraryName} + + return nil +} + +// Register a process for calling +func Register(name string) error { + if libZeLoader == nil { + return ErrZeCallNotInit + } + proc, err := libZeLoader.FindProc(name) + if err != nil { + return err + } + procMap[name] = proc + return nil +} + +// Call a process +func Call(name string, args ...uintptr) (r1, r2 uintptr, err error) { + fn, ok := procMap[name] + if !ok { + return 0, 0, ErrNoSuchProcess + } + r1, r2, err = fn.Call(args...) + if r1 == 0 { + err = nil + } + return +}