OpenProcess error 87 invalid parameter

11,203

Solution 1

You should use the handle from CreateProcess instead of using OpenProcess on the PID.

OpenProcess only works if the process object still exists. By the time you call OpenProcess if the process object is gone - the result is a call with invalid parameter.

The success you got with other utilities is either due to a race condition (which may fail some times) or you kept the original handle to the child process open.

Solution 2

Leaving a tip for someone else's purpose. I managed to reach the ERROR_INVALID_PARAMETER (87) by trying to open:

  • a System process (0)
  • an ID which belonged to a thread, not the process (reference to YatoDev's post).

The second case may be a problem when you e.g. claim a result from GetWindowThreadProcessId directly, which is an identifier of the thread that created the window, instead of its pointer parameter (which gives you requested PID).

Share:
11,203

Related videos on Youtube

user389419
Author by

user389419

Updated on May 20, 2022

Comments

  • user389419
    user389419 almost 2 years

    I'm trying to write a program which executes make.exe from MinGW distribution in the current directory and makes use of its STDOUT data and exit code. I have a handle to process STDOUT where I fetch data from, created with CreatePipe. When I get an ERROR_HANDLE_EOF on that pipe I assume the process has exited and try to get its exit code:

    if(session->pid == 0) return;
    HANDLE hp = OpenProcess(PROCESS_QUERY_INFORMATION |
                PROCESS_TERMINATE, TRUE, session->pid);
    if(hp == NULL) {
        printf("OpenProcess(%i) failed, error: %i\n",
            session->pid, (int)GetLastError());
        return;
    }
    

    My code works on all other MinGW utilities I tested (like pwd, ls, etc.), I get the STDOUT and the exit code with no problem. But when I try it on make, the above code displays the following message:

    "OpenProcess(2032) failed, error: 87"

    I googled for error code 87, and it says "Invalid parameter". I don't see what could be invalid about a positive process id like 2032. Any ideas?