Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 8 Julio 2015, 22:08 PM

Título: Problema obtener datos de PIP_ADAPTER_INFO
Publicado por: Kaxperday en 8 Julio 2015, 22:08 PM
Lo de siempre diría, llamo a una función a la que le paso un PIP_ADAPTER_INFO por referencia, y me la rellenará:

Código (cpp) [Seleccionar]
bool seleccionar_interfaz(PIP_ADAPTER_INFO* adaptador)
{
bool seleccion = false;
PIP_ADAPTER_INFO pAdapterInfo;
static PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;

ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(sizeof(IP_ADAPTER_INFO));

if (pAdapterInfo == NULL)
return false;

if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
FREE(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(ulOutBufLen);
if (pAdapterInfo == NULL)
return false;
}

if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
{
pAdapter = pAdapterInfo;
while (pAdapter)
{
//Si tiene gateway y dirección IPv4 en la interfaz nos vale.
if (pAdapter->DhcpEnabled == true &&
pAdapter->GatewayList.IpAddress.String &&
pAdapter->IpAddressList.IpAddress.String &&
strcmp(pAdapter->IpAddressList.IpAddress.String, "0.0.0.0") != 0 &&
strcmp(pAdapter->GatewayList.IpAddress.String, "0.0.0.0") != 0 )
{
//printf("%s", pAdapter->GatewayList.IpAddress.String); Esta linea lo cambia todo, hace que funcione y no haya problema pero no quiero poner printf..
*adaptador = pAdapter;
seleccion = true;
break;
}
pAdapter = pAdapter->Next;
}
}
else
seleccion = false;
if (pAdapterInfo)
FREE(pAdapterInfo);
return seleccion;
}


La llamada y declaración de la función está aquí:

Código (cpp) [Seleccionar]
lista_usuarios* buscar_usuarios()
{
PIP_ADAPTER_INFO* adaptador = nullptr;

adaptador = (PIP_ADAPTER_INFO*)malloc(sizeof(PIP_ADAPTER_INFO));

if (seleccionar_interfaz(adaptador))
       {

       printf("%s", (*adaptador)->GatewayList.IpAddress.String);
}
{


Este printf muestra basura, ¿porqué?. Cuando pongo el printf que muestro de comentario en seleccionar_inferfaz() no muestra basura, funciona.

Lo paso como referencia esta vez, y he reservado memoria previamente. No se que puede ser XD.

Siento que abuso del foro  :rolleyes: :rolleyes: :rolleyes:

Saludos.
Título: Re: Problema obtener datos de PIP_ADAPTER_INFO
Publicado por: ivancea96 en 8 Julio 2015, 22:55 PM
Qué lio de punteros, señor.

Código (cpp) [Seleccionar]
PIP_ADAPTER_INFO* adaptador = nullptr;

¿Por qué un punteroa puntero? xD
Título: Re: Problema obtener datos de PIP_ADAPTER_INFO
Publicado por: Kaxperday en 8 Julio 2015, 22:58 PM
jajaja ¿nullptr no es como NULL para punteros?, quiero decir puse NULL pero sin darme cuenta debió de escribir nullptr..  :silbar: :silbar: XD

¿Pero no da igual eso que inicializarles a NULL? ¿Es indiferente o no? XD

Saludos.

Edito: Por cierto he modificado el código ahora tengo esto (elimine el puntero no hacia falta):

Código (cpp) [Seleccionar]
lista_usuarios* buscar_usuarios()
{
static PIP_ADAPTER_INFO adaptador;

//adaptador = (PIP_ADAPTER_INFO*)malloc(sizeof(PIP_ADAPTER_INFO));

if (seleccionar_interfaz(&adaptador))
{
printf("%s", adaptador->GatewayList.IpAddress.String);
}


Pues no era necesario realmente el puntero, pero aún así no funciona XP.
Título: Re: Problema obtener datos de PIP_ADAPTER_INFO
Publicado por: ivancea96 en 8 Julio 2015, 23:10 PM
Por curiosidad, por qué todas las variables las pones static .__.
Si bien es una forma de actuar, para evitar copiar variables a cambio de una limitada disponibilidad de ella, también es un modo más peligroso al trabajar con punteros.

Además
Código (cpp) [Seleccionar]
if (pAdapterInfo)
FREE(pAdapterInfo);


Estás liberando el contenido de la variable. PIP_ADAPTER_INFO es un puntero. Estás liberandolo.
Título: Re: Problema obtener datos de PIP_ADAPTER_INFO
Publicado por: Kaxperday en 8 Julio 2015, 23:19 PM
jajaja ostia..  :-[ :-[ :-[  :-X :-X

Código (cpp) [Seleccionar]
pAdapter = pAdapterInfo;
if (pAdapterInfo)
FREE(pAdapterInfo);


Lo vaciaba y no me daba cuenta tanto código, me paso completamente desapercibido, pero es curioso, pero sin embargo me funcionaba pasar las ips a u_char* y me hacia arp a el rango de ips, a pesar de que tenía basura y de que la había vaciado, pero claro no sabía porque era entonces.

En este caso la puse static por probar, pues para la variable lista_usuarios, gracias a que la declaré estática, luego puedo acceder a ella desde el main, devolviendo su valor con &lista_usuarios. Si no la pongo static pierde su valor y memoria al salir de la funcion, tendría que pasar un puntero como argumento a la función para obtener la lista:

Código (cpp) [Seleccionar]
lista_usuarios* buscar_usuarios()
{
static lista_usuarios lista_host;
PIP_ADAPTER_INFO adaptador;
return &lista_host;


Si no es static, se pierde su valor al recoger la lista en el main.

Por cierto que tiene de malo inicializar un puntero con un nullptr?  :xD :xD

Saludos.
Título: Re: Problema obtener datos de PIP_ADAPTER_INFO
Publicado por: ivancea96 en 8 Julio 2015, 23:40 PM
No dije que nullptr sea malo. Dije que estabas poniendo un IP** sin razón aparente xD

La forma de evitar static, es, o copiando la estructura, o pasándo un puntero sacado con new. E insisto, deberías usar new en C++, especialmente si trabajas con clases o estructuras.
Título: Re: Problema obtener datos de PIP_ADAPTER_INFO
Publicado por: Kaxperday en 8 Julio 2015, 23:44 PM
jajaja ok, pero como es eso de usar ¿new? ¿algún ejemplo? Si con eso quito el static por mi perfecto socio.

MyClass * p1 = new MyClass;

¿con un puntero?  :laugh: :laugh:

Pues que gracia, si me pase a clases fue para acabar con los punteros de las estructuras entre otras cosas XD.

Oye pues funciona:

Código (cpp) [Seleccionar]
lista_usuarios* buscar_usuarios()
{
lista_usuarios* lista_host = new lista_usuarios;
}


Lo compro, gracias ivancea <3.

Saludos.
Título: Re: Problema obtener datos de PIP_ADAPTER_INFO
Publicado por: ivancea96 en 9 Julio 2015, 00:30 AM
Los punteros no son algo malo :/
Son algo necesario y muy útil, que seguirás usando.

Con new además, llamas al constructor de la clase o estructura:

Código (cpp) [Seleccionar]
Clase obj = new Clase(1,2,"a");
Título: Re: Problema obtener datos de PIP_ADAPTER_INFO
Publicado por: Kaxperday en 9 Julio 2015, 10:53 AM
Ok, lo tendré en cuenta, muchas gracias ivancea, nos vemos.

Saludos.