Ver Mensaje Individual
  #13 (permalink)  
Antiguo 09/09/2013, 15:19
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 9 meses
Puntos: 83
Respuesta: Obtener puertos abiertos TCP/IP por cada programa

Por lo de las UDP_TABLE_ONER_PID no puedo ayudarte porque solo he usado las tcp, pero tambien le echaré un vistazo a ver si veo algo.

La funcion OpenProcess retorna un handler de un proceso activo, acepta tres argumentos: un flag (o una combinacion) de acceso, un boleano que indica si el handler retornado puede ser heredado por procesos derivados del proceso que pide el handler, y el identificador de proceso. En el ejemplo pido un handler con acceso de lectura, no heredable, para el proceso cuyo id se indica en la tabla de procesos. Es la consulta minima segura para obtener un manejador (handler) de proceso (puede que haya otra forma) para consultas simples.

El handler me sirve para llamar a cualquier funcion en la que se requiera un manejador con permiso de acceso a informacion (query) y permiso de lectura, por eso necsito los flags PROCESS_QUERY_INFORMATION y PROCESS_VM_READ. Algunas funciones solo requieren el flag de lectura, etc... Los permisos de los handlers que se usan en las funciones estan indicados en la referencia de cada funcion (en el manual de referencia o en msdn).

En este caso quiero el nombre base de la instancia de la aplicacion, por eso ejecuta GetModuleBaseName. Esta funcion requiere un handler con permisos (como minimo) de acceso y de lectura (los que pedí en OpenProcess), el segundo argumento es el manipulador del modulo (si indico nulo me retorna el nombre del ejecutable desde el que se creó esa instancia), el tercer argumento es un buffer de texto donde copiará el nombre, y el cuarto indica el tamaño del buffer. Si quieres obtener la ruta absoluta al ejecutable desde el que se creo el proceso de la instancia puedes usar GetModuleFileName, tienes la referencia en msdn).

Código C:
Ver original
  1. hproc = OpenProcess(//solicito un handler
  2.     PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,//con permiso de acceso y de lectura
  3.     0,//no heredable
  4.     proc_owner->dwOwningPid//que tiene este identificador
  5.     );
  6.  
  7. //en caso de error el handler es nulo
  8. //el handler no nulo obtenido lo uso para recuperar el nombre del ejecutable
  9. GetModuleBaseName(
  10.     hproc, //manejador con permiso de acceso y lectura
  11.     0, //manejador del modulo, pero no quiero el nombre del modulo sino del ejecutable
  12.     base_name, //buffer de destino
  13.     sizeof(base_name)//tamaño del buffer
  14.     );

Saludos
vosk