TerminateProcess () возвращает EINVAL - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь отладить проблему и не понимаю ее.

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. Просматривая документы MSDN для TerminateProcess, вы должны сначала открыть доступ к процессу с правом доступа PROCESS_TERMINATE. Я открываю процесс с этим правом доступа, поэтому он должен просто работать. Что я делаю неправильно / отсутствует?

1 Ответ

0 голосов
/ 14 января 2019

Итак, я разобрался с этой конкретной проблемой. Я тестировал с C:\\Windows\\System32\\calc.exe, который является универсальным приложением Windows, с брокером времени выполнения. Как только я начал тестировать с C:\\Windows\\System32\\notepad.exe, он начал работать. Как только я пойму, как обращаться с брокерами во время выполнения, я обновлю этот ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...