Pregunta sobre APIs en Windows.

Iniciado por EzianGES, 27 Febrero 2014, 00:11 AM

0 Miembros y 1 Visitante están viendo este tema.

EzianGES

Disculpen que haga este hilo acá... realmente no se donde hacerlo jaja en fin, estoy experimentando con ctypes en Python (si lo sé esto es el subforo de C). Para eso me estoy informando con MSDN, y recurro a la sabiduría de los C-sianos (?) que la tienen calada...
Estoy intentando usar la API TerminateProcess, cuya descripción es la siguiente:

BOOL WINAPI TerminateProcess(
  _In_  HANDLE hProcess,
  _In_  UINT uExitCode
);


CitarhProcess [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.

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:

HANDLE WINAPI OpenProcess(
  _In_  DWORD dwDesiredAccess,
  _In_  BOOL bInheritHandle,
  _In_  DWORD dwProcessId
);


CitardwDesiredAccess [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.

Entiendo que necesita tres argumentos. Llegado el tercer argumento (el PID), entiendo que para obtenerlo, tengo que utilizar la API GetProcessID:

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.



amchacon

#1
Prueba esta:
Código (cpp) [Seleccionar]
DWORD GetCurrentProcessId(void);
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Vaagish

Lo que te dice amchacon es que uses esa función..

CitarThe return value is the process identifier of the calling process.

Ahora, no se como implementas las apis en Python, pero calculo que incluis la librería y llamas a la función,, vas bien parece.. no deberías tener mayor complicación..

Suerte! Saludos!

EzianGES

En Python es relativamente sencillo, tenés el módulo ctypes en dónde podés acceder a librerías dinámicas mediante stdcall o cdecl, y tenés mapeados (creo que es el término correcto) los tipos de datos entre c, python y ctypes, tipo:

C       Python      Ctypes
int       int            c_int
long     int           c_long

Y así...

Tengo entendio por lo que vengo leyendo, que la función GetCurrentProcessId obtiene el pid del proceso actual, y yo lo que necesitaba era conseguir el pid de otro proceso, me estoy liando, se que me faltan cosas pero no se cuáles jaja

Abrazo!

x64core

Para terminar el propio proceso desde donde se esta ejecutando tu código se usa ExitProcess nada de OpenProcess->TerminateProcess
ya que no es necesario. pero si lo que quieres es terminar un proceso diferente cualquiera y si no tienes un identificador especifico
pues tendras que enumerar los procesos, la MSDN tiene un ejemplo:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx

Esa funcion es un wrapper de muy alto nivel puede que estes interesado en estas otras funciones:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684865(v=vs.85).aspx

Luego con el PID llamas a OpenProcess pasando las Flags correctas ( mirar documentación ) y por ultimo TerminateProcess.
Buen habito es cerrar el handle también.

Vaagish

Yo me complique la vida una vez con openprocess y le agarre pánico jaja empece a usar CreateProcess, que lleva mas parámetros pero no da muchos problemas de seguridad,, (al menos en mis pruebas fue mas sencillo, estaba inyectando código en procesos).

Capaz te sirve de mientras para practicar,, despues podes solucionar lo de OpenProcess

Citarhttp://stackoverflow.com/questions/14302127/createprocess-launching-child-applications

Y por supuesto la MSDN
Citarhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx

Suerte! Saludos!

Vaagish


EzianGES

@xcore64:
Es justo lo que me faltaba! te lo re agradezco!

@Vaagish
Casualidades de la vida que justo tengo ese enlace abierto jajajaj Muchas gracias por la ayuda a ambos.


En cuánto tenga un código funcional lo subo :)

A probar y programar se ha dicho n.n

Muchísimas gracias.

Vaagish