TerminateProcess()返回EINVAL

时间:2019-01-10 20:49:09

标签: windows go winapi

我正在尝试调试问题,但我不理解。

func BackgroundProcess(lpCommandLine string) (error) {
    var lpProcessAttrs windows.SecurityAttributes
    var lpThreadAttrs windows.SecurityAttributes
    var lpProcInfo windows.ProcessInformation
    var lpStartup windows.StartupInformation

    // convert to null terminated
    lpCli, err := StringToLpStr(lpCommandLine)
    if err != nil {
        return err
    }

    if ok := CreateProcess(nil, lpCli, &lpProcessAttrs, &lpThreadAttrs, true, 0, nil, nil, &lpStartup, &lpProcInfo); !ok {
        return GetLastError()
    }
    // DeleteProcessAccessRight is just a const for 1
    childProcessHandle = OpenProcess(DeleteProcessAccessRight, false, lpProcInfo.dwProcess)
    if ok := TerminateProcess(childProcessHandle, 0); !ok {
        return GetLastError()
    }
}

如果我用BackgroundProcess("C:\\Windows\\System32\\calc.exe")进行调用,则会在EINVAL上收到错误invalid argument,它是TerminateProcess。查看TerminateProcess的MSDN文档,您需要首先使用PROCESS_TERMINATE访问权限打开对该流程的访问。我正在使用该访问权限来打开进程,因此它应该可以正常工作。我在做什么错/想念?

1 个答案:

答案 0 :(得分:2)

所以我找出了这个具体问题。我正在使用C:\\Windows\\System32\\calc.exe进行测试,这是一个通用Windows应用程序,具有运行时代理。当我开始使用C:\\Windows\\System32\\notepad.exe进行测试时,它开始工作。一旦我弄清楚如何处理运行时代理,就将更新此答案。