猿问

TerminateProcess() 返回 EINVAL

我正在尝试调试一个问题,但我不明白。


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 argumenton TerminateProcess。查看 TerminateProcess 的 MSDN 文档,您需要首先使用 PROCESS_TERMINATE 访问权限打开对进程的访问权限。我正在使用该访问权限打开流程,因此它应该可以正常工作。我做错了什么/错过了什么?


慕码人8056858
浏览 151回答 1
1回答

心有法竹

所以我想出了这个具体问题。我正在测试C:\\Windows\\System32\\calc.exe,这是一个通用 Windows 应用程序,它有一个运行时代理。我一开始使用 进行测试C:\\Windows\\System32\\notepad.exe,它就开始工作了。一旦我弄清楚如何处理运行时代理,我就会更新这个答案。
随时随地看视频慕课网APP

相关分类

Go
我要回答