Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: el_doctor en 5 Septiembre 2013, 19:13 pm



Título: Problemas para usar la función GetExtendedTcpTable
Publicado por: el_doctor en 5 Septiembre 2013, 19:13 pm
Saludos estoy haciendo un proceso que me recupere los procesos que están usando una conexión TCP/IP leyendo la documentación MSDN esta función devuelve los datos que necesito pero tengo dudas con el primer parámetro de salida que es donde se recupera la tabla de la estructura con los datos, según la documentación MSDN la sintaxis de la función es la siguiente:

Código
  1. DWORD GetExtendedTcpTable(
  2.  _Out_    PVOID pTcpTable,
  3.  _Inout_  PDWORD pdwSize,
  4.  _In_     BOOL bOrder,
  5.  _In_     ULONG ulAf,
  6.  _In_     TCP_TABLE_CLASS TableClass,
  7.  _In_     ULONG Reserved
  8. );

el problema que tengo es con el parámetro pTcpTable según entiendo debe ser una estructura de datos que ya existe en "tcpmib.h" pero no se como usar estas estructuras y como recuperaría los datos que envía la función en esta variable.

la función la he definido de la siguiente manera:

Código
  1. DWORD size;
  2. DWORD dwResult;
  3.  
  4.  
  5. dwResult = GetExtendedTcpTable( , size, false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);

les agradecería me ayudaran en comprender mejor para usar esta función



Una aclaración la variable size no le he asignado ningún valor porque igual como no se que estructura es pTcpTable no puedo darle un valor.

Código
  1. size = sizeof (PVOID)
  2. //no se que estructura corresponde pTcpTable el tipo lo pone como PVOID


Título: Re: Problemas para usar la función GetExtendedTcpTable
Publicado por: Eternal Idol en 5 Septiembre 2013, 19:32 pm
La misma funcion te devuelve el tamaño necesario:

pdwSize [in, out]
The estimated size of the structure returned in pTcpTable, in bytes. If this value is set too small, ERROR_INSUFFICIENT_BUFFER is returned by this function, and this field will contain the correct size of the structure.

Código:
DWORD size = 0;
DWORD dwResult = GetExtendedTcpTable(NULL, &size, false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
if (dwResult == ERROR_INSUFFICIENT_BUFFER)
{
  PVOID table = malloc(size);
  dwResult = GetExtendedTcpTable(table, &size, false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
  if (dwResult == NO_ERROR)
  {
    PMIB_TCPTABLE_OWNER_PID tabla = (PMIB_TCPTABLE_OWNER_PID)table;
  }
  free(table);
}

Y la estructura tambien esta en la documentacion:
TCP_TABLE_CLASS enumeration (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366386(v=vs.85).aspx)

TCP_TABLE_OWNER_PID_ALL
A MIB_TCPTABLE_OWNER_PID or MIB_TCP6TABLE_OWNER_PID structure that contains all TCP endpoints on the local computer is returned to the caller.


Título: Re: Problemas para usar la función GetExtendedTcpTable
Publicado por: el_doctor en 5 Septiembre 2013, 20:15 pm
Gracias Eternal Idol el código me resulto de mucha utilidad hice algunos cambios lo dejo aquí para que sirva de referencia a otros:

Código
  1. DWORD size= 64;
  2.  
  3. LPVOID table = new BYTE[size];
  4.  
  5.  
  6. while( dwResult = GetExtendedTcpTable(table, &size, false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0)
  7. == ERROR_INSUFICIENT_BUFFER)
  8. delete [] table, table = new BYTE[size *= 2];
  9.  
  10. if(dwResut != NO_ERROR)
  11. {
  12. //TODO error
  13. return NULL;
  14. }
  15.  
  16.  
  17. PMIB_TCPTABLE_OWNER_PID tabla = (PMIB_TCPTABLE_OWNER_PID)table;

disculpa las molestias pero ahora tengo la duda quiero obtener sólo un registro de toda la lista de estructura es decir hacer un for que me recorra toda la lista pero sólo recuperar dwOwningPid de la estructura MIB_TCPROW_OWNER_PID


Título: Re: Problemas para usar la función GetExtendedTcpTable
Publicado por: Eternal Idol en 5 Septiembre 2013, 20:22 pm
No tiene mucho sentido hacer ese bucle, como te dije la funcion te devuelve el tamaño que necesita, ir aumentando en 64 (un valor arbitrario), reservar y liberar memoria es poco optimizado.

En el campo dwNumEntries de la estructura MIB_TCPTABLE_OWNER tenes la cantidad de elementos en la tabla. Con eso podes hacer el array facilmente.


Título: Re: Problemas para usar la función GetExtendedTcpTable
Publicado por: el_doctor en 5 Septiembre 2013, 21:14 pm
Gracias por tus sugerencias estoy corriendo el código disculpa de que biblioteca son AF_INET y ERROR_INSUFICIENT_BUFFER ya que me da un error de compilación que no están declarados esos identificadores



Salodos lo de "AF_INET" ya encontré en que biblioteca asociada a la dll se encontraba pero sigo sin poder encontrar donde está declarado "ERROR_INSUFICIENT_BUFFER"


Título: Re: Problemas para usar la función GetExtendedTcpTable
Publicado por: Eternal Idol en 5 Septiembre 2013, 22:42 pm
Es ERROR_INSUFFICIENT_BUFFER, incluyendo windows.h ya te deberia funcionar.


Título: Re: Problemas para usar la función GetExtendedTcpTable
Publicado por: el_doctor en 5 Septiembre 2013, 23:09 pm
Gracias Eternal Idol erra un error de sintaxis el mío  :-\

tengo ratos de estar dando lata con esto ahora tengo un problema de conversión cuando hago el for para recorrer la tabla no se si he hecho algo mal si le das una chequeada y me ayudas te lo agradecería.

Código
  1. for(int i=0; i < (int) pTcpTable->dwNumEntries; i++)
  2.  



Título: Re: Problemas para usar la función GetExtendedTcpTable
Publicado por: Eternal Idol en 5 Septiembre 2013, 23:12 pm
No existe la variable pTcpTable (asi se llama el primer parametro de la funcion GetExtendedTcpTable).


Título: Re: Problemas para usar la función GetExtendedTcpTable
Publicado por: el_doctor en 5 Septiembre 2013, 23:14 pm
Me dará problemas si la declaro igual que el parámetro de la función???


Título: Re: Problemas para usar la función GetExtendedTcpTable
Publicado por: Eternal Idol en 5 Septiembre 2013, 23:15 pm
No tengo tu codigo pero inverti un poco mas de esfuerzo y prueba y error por tu cuenta y seguro que logras hacerlo funcionar.