首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在一段时间后在windows上调用DebugActiveProcessStop时拒绝权限?

为什么在一段时间后在windows上调用DebugActiveProcessStop时拒绝权限?
EN

Stack Overflow用户
提问于 2022-01-31 00:06:32
回答 1查看 306关注 0票数 1

在windows上,我需要一个go程序来挂起和取消一个进程(用exec.Command生成)。

此进程运行5秒,然后用DebugActiveProcess挂起。其他5秒后,它将用DebugActiveProcessStop重新启动。

以这种方式完美地运作..。当我等待60分钟或更长时间(有时甚至更短)时,问题就出现了:在这段时间之后,DebugActiveProcessStopPermission denied中失败。

这是示例代码:

代码语言:javascript
运行
复制
package main

import (
    "bufio"
    "fmt"
    "os/exec"
    "path/filepath"
    "syscall"
    "time"
)

var (
    // DebugActiveProcess function (debugapi.h)
    // https://learn.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-debugactiveprocess
    modkernel32                = syscall.NewLazyDLL("kernel32.dll")
    procDebugActiveProcess     = modkernel32.NewProc("DebugActiveProcess")
    procDebugActiveProcessStop = modkernel32.NewProc("DebugActiveProcessStop")
)

func main() {
    dir := "C:\\path\\to\\folder"
    execName := "counter.bat" //using a batch file as an example of a program that runs for long time
    cmd := exec.Command(filepath.Join(dir, execName))
    cmd.Dir = dir

    cmd.SysProcAttr = &syscall.SysProcAttr{
        CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
    }

    cmdprinter(cmd)

    cmd.Start()

    // wait 5 seconds
    time.Sleep(time.Duration(5) * time.Second)

    fmt.Println("--- STOPPING ---")
    // https://github.com/go-delve/delve/blob/master/pkg/proc/native/zsyscall_windows.go#L177-L199
    r1, _, e1 := syscall.Syscall(procDebugActiveProcess.Addr(), 1, uintptr(cmd.Process.Pid), 0, 0)
    if r1 == 0 {
        fmt.Println("error stopping process tree:", e1.Error())
    }
    fmt.Println("STOPPING done")

    // wait 15 min
    for n := 0; n < 3600; n++ {
        fmt.Print(n, " ")
        time.Sleep(time.Second)
    }

    fmt.Println("\n--- STARTING ---")
    r1, r2, e1 := syscall.Syscall(procDebugActiveProcessStop.Addr(), 1, uintptr(cmd.Process.Pid), 0, 0)
    if r1 == 0 {
        fmt.Println("error starting process tree:", e1.Error(), "r2:", r2, "GetLastError:", syscall.GetLastError())
    }
    fmt.Println("STARTING done")

    cmd.Wait()
    fmt.Println("exiting")
}

func cmdprinter(cmd *exec.Cmd) {
    outP, _ := cmd.StdoutPipe()
    errP, _ := cmd.StderrPipe()
    go func() {
        scanner := bufio.NewScanner(outP)
        for scanner.Scan() {
            line := scanner.Text()
            fmt.Println(line)
        }
    }()
    go func() {
        scanner := bufio.NewScanner(errP)
        for scanner.Scan() {
            line := scanner.Text()
            fmt.Println(line)
        }
    }()
}

我是counter.bat

代码语言:javascript
运行
复制
echo off
set /a n = 0
:START
ping 127.0.0.1 -n 2 > nul
echo counter says %n%
set /a "n=%n%+1"
if %n%==30 (EXIT 0)
GOTO START
  • 这可能是什么原因?我怎么才能修好它?
  • 还有其他方法来挂起进程并在windows上取消挂起(就像linux上的kill -STOP )吗?(我听说了windows挂起功能,但无法使其工作)
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70920073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档