Estoy intentando usar la API TerminateProcess, cuya descripción es la siguiente:
Código
BOOL WINAPI TerminateProcess( _In_ HANDLE hProcess, _In_ UINT uExitCode );
Citar
hProcess [in]
A handle to the process to be terminated.
The handle must have the PROCESS_TERMINATE access right. For more information, see Process Security and Access Rights.
uExitCode [in]
The exit code to be used by the process and threads terminated as a result of this call. Use the GetExitCodeProcess function to retrieve a process's exit value.
A handle to the process to be terminated.
The handle must have the PROCESS_TERMINATE access right. For more information, see Process Security and Access Rights.
uExitCode [in]
The exit code to be used by the process and threads terminated as a result of this call. Use the GetExitCodeProcess function to retrieve a process's exit value.
Entiendo que necesita dos argumentos de entrada, el "handle" del proceso, y un código de salida.
Bien, entonces asumo que tengo que conseguir el "handle" del proceso. Pues bien, no entiendo cómo obtener el handle. Soy muy novato en el tema, y estoy viendo algo sobre la API OpenProcess, que teóricamente me devuelve el handle del proceso:
Código
HANDLE WINAPI OpenProcess( _In_ DWORD dwDesiredAccess, _In_ BOOL bInheritHandle, _In_ DWORD dwProcessId );
Citar
dwDesiredAccess [in]
The access to the process object. This access right is checked against the security descriptor for the process. This parameter can be one or more of the process access rights.
If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor.
bInheritHandle [in]
If this value is TRUE, processes created by this process will inherit the handle. Otherwise, the processes do not inherit this handle.
dwProcessId [in]
The identifier of the local process to be opened.
The access to the process object. This access right is checked against the security descriptor for the process. This parameter can be one or more of the process access rights.
If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor.
bInheritHandle [in]
If this value is TRUE, processes created by this process will inherit the handle. Otherwise, the processes do not inherit this handle.
dwProcessId [in]
The identifier of the local process to be opened.
Entiendo que necesita tres argumentos. Llegado el tercer argumento (el PID), entiendo que para obtenerlo, tengo que utilizar la API GetProcessID:
Código
DWORD WINAPI GetProcessId( _In_ HANDLE Process );
Ahora bien, eso me devolvería el PID... el cuál necesito para obtener el handle... Pero la función me pide el handle del proceso... No entiendo xD.
Perdón la ignorancia, y que haga una pregunta así, pero no logro entender el procedimiento para cerrar un proceso mediante TerminateProcess. Se que lo puedo hacer utilizando taskkill /f /im blabla, pero prefiero entender esto :\
Aclaro que no estoy haciendo ninguna maldad ni nada similar, solo estoy practicando multithreading, y se me ocurrió hacer una función que abra un proceso, mientras otra lo cierre, por el mero hecho de practicar algo, y decidí hacerlo de esta manera.
De todas maneras, voy a seguir buscando y probando. No pido un códigohecho, con una palabra que me oriente estaría muy agradecido!
Un abrazo.