//go:build windows package main import ( "fmt" "os" "syscall" ) // PROCESS_SUSPEND_RESUME:挂起 / 恢复进程所需的访问权限 const processSuspendResume = 0x0800 var ( ntdllDLL = syscall.NewLazyDLL("ntdll.dll") procSuspend = ntdllDLL.NewProc("NtSuspendProcess") procResume = ntdllDLL.NewProc("NtResumeProcess") ) // 挂起进程。Windows 没有公开的 Win32 API,用 ntdll 的 NtSuspendProcess, // 效果等同任务管理器里的「挂起」:进程不再占用 CPU,恢复后从原地接着跑。 func suspendProcess(p *os.Process) error { return ntProcessCall(procSuspend, "NtSuspendProcess", p) } func resumeProcess(p *os.Process) error { return ntProcessCall(procResume, "NtResumeProcess", p) } func ntProcessCall(proc *syscall.LazyProc, name string, p *os.Process) error { if p == nil { return nil } h, err := syscall.OpenProcess(processSuspendResume, false, uint32(p.Pid)) if err != nil { return fmt.Errorf("打开进程 %d 失败:%v", p.Pid, err) } defer syscall.CloseHandle(h) // NTSTATUS 为 0 表示成功 if ret, _, _ := proc.Call(uintptr(h)); ret != 0 { return fmt.Errorf("%s 失败,NTSTATUS=0x%x", name, ret) } return nil }