#include <windows.h>
#include <Iphlpapi.h>
#include <stdio.h>
#define MAX_MCADDDFLT 16 // 16 dovrebbero essere piu' che sufficienti, ma
// caso mai non bastassero e' previsto un meccanismo
// dinamico per l'allocazione di un buffer di
// dimensioni adeguate
const char *kNomeFileOutput = "elenco mac address.txt";
int esci( const char *msg );
int main() {
DWORD e = ERROR_BUFFER_OVERFLOW, dwBufLen = 0;
UINT qMcAdd = 0, maxMcAdd = MAX_MCADDDFLT;
PIP_ADAPTER_INFO pAdapterInfo = NULL;
IP_ADAPTER_INFO *aAdapterInfo = NULL;
FILE *f = NULL;
f = fopen( kNomeFileOutput, "r" );
if( f ) { fclose( f ); return esci( "file output gia' esistente" ); }
while( e==ERROR_BUFFER_OVERFLOW ) {
// crea il buffer destinato a ricevere i dati da GetAdaptersInfo()
if( aAdapterInfo ) free( aAdapterInfo );
aAdapterInfo = calloc( maxMcAdd, sizeof(*aAdapterInfo) );
if( !aAdapterInfo ) return esci( "memoria insufficiente" );
dwBufLen = sizeof(*aAdapterInfo)*maxMcAdd; // [in] dimensioni del buffer
e = GetAdaptersInfo( aAdapterInfo, &dwBufLen );
if( ERROR_BUFFER_OVERFLOW == e ) { ++maxMcAdd; continue; }
if( e != ERROR_SUCCESS )
{ free( aAdapterInfo ); return esci( "adapter non rilevati" ); }
}
f = fopen( kNomeFileOutput, "w+" );
if( !f ) { free( aAdapterInfo ); return esci( "file output non aperto" ); }
pAdapterInfo = aAdapterInfo; // puntatore all'adapter info corrente
for( qMcAdd=0; pAdapterInfo && qMcAdd<maxMcAdd; ++qMcAdd ) {
UINT i, lMcAdd;
/// SCRIVE NEL FILE
// quantita' dei caratteri del "nome"
fprintf( f, "%d\t", lstrlen(pAdapterInfo->AdapterName) );
// "nome" dell'adapter
fprintf( f, "%s\t", pAdapterInfo->AdapterName );
// quantita' dei caratteri del Mac Address
lMcAdd = pAdapterInfo->AddressLength;
fprintf( f, "%d\t", 2*lMcAdd );
// sequenza esadecimale del Mac Address
for( i=0; i<lMcAdd&&i<MAX_ADAPTER_ADDRESS_LENGTH; ++i )
fprintf( f, "%02X", pAdapterInfo->Address[i] );
// quantita' dei caratteri della descrizione
fprintf( f, "\t%d\t", lstrlen(pAdapterInfo->Description) );
// descrizione dell'adapter
fprintf( f, "%s", pAdapterInfo->Description );
/// SCRIVE IN CONSOLE
// descrizione dell'adapter
printf( "%s\n", pAdapterInfo
->Description
);
// nome dell'adapter
printf( "%s\n", pAdapterInfo
->AdapterName
);
// Mac Address dell'adapter
for( i=0; i<lMcAdd&&i<MAX_ADAPTER_ADDRESS_LENGTH; ++i )
printf( "%02X", pAdapterInfo
->Address
[i
] );
pAdapterInfo = pAdapterInfo->Next; // prossimo Mac Address nella lista
// mettiamo gli "a capo" nel file e in console
fprintf( f, (pAdapterInfo&&(qMcAdd!=(maxMcAdd-1)))?"\n":"" );
}
fclose( f ); f = NULL;
free( aAdapterInfo ); aAdapterInfo = NULL;
puts( "Operazione riuscita.\n" );
printf( "Il file \"%s\" ", kNomeFileOutput
);
if( qMcAdd )
printf( " contiene ora un elenco di %d Mac Address.\n\n", qMcAdd
);
else puts( "e' vuoto (nessun adapter presente).\n" );
printf( "Premi \"invio\" per lasciare il programma. " );
getchar();
return 0;
}
int esci( const char *msg ) {
printf( "ERRORE: %s.\n\n", msg
);
printf( "Premi \"invio\" per lasciare il programma. " );
getchar();
return 0;
}