|
A better way exists, you can get almost all the adapter info etc, using
this func. Code is as follows. You also need IPHLPAPI.LIB and dll.
#include <stdio.h>
#include <Packet32.h> #include <IPHlpApi.h> #include <winsock.h> #include <stdlib.h> #define DllFunc __declspec( dllexport )
#define BUFFER_SIZE 256000*4 typedef struct {
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; char Mac[64]; LPADAPTER LPA; NetType nett; struct bpf_stat stats; char *buffer; // Packet buffer LPPACKET lpp; HANDLE hthread; int processed; int terminate; int fragc; } e_adapter; typedef struct
{
int AdapterCount; e_adapter adapters[1]; } e_adapters; DllFunc e_adapters *GetAdapters(void) { int i; ULONG ulOutBufLen; DWORD dwRetVal; int AdapterCount = 0; e_adapters *adapters = NULL; FIXED_INFO *FixedInfo; PIP_ADAPTER_INFO pip, pIPAda; FixedInfo = (FIXED_INFO *) GlobalAlloc(
GPTR, sizeof( FIXED_INFO ) );
ulOutBufLen = sizeof( FIXED_INFO ); if( ERROR_BUFFER_OVERFLOW == GetNetworkParams( FixedInfo, &ulOutBufLen ) ) { GlobalFree( FixedInfo ); FixedInfo = GlobalAlloc( GPTR, ulOutBufLen ); } if ( dwRetVal = GetNetworkParams( FixedInfo, &ulOutBufLen ) ) { GlobalFree( FixedInfo ); return NULL; } if (GetAdaptersInfo(NULL, &ulOutBufLen) != ERROR_BUFFER_OVERFLOW) { GlobalFree( FixedInfo ); return NULL; } pIPAda = calloc(1, ulOutBufLen); if (GetAdaptersInfo(pIPAda, &ulOutBufLen) != ERROR_SUCCESS) { GlobalFree( FixedInfo ); free(pIPAda); return NULL; } AdapterCount = 0; for (pip = pIPAda; pip; pip = pip->Next) AdapterCount++; adapters = calloc(1, sizeof(e_adapters) +(AdapterCount-1)*sizeof(e_adapter) ); if (!adapters) return NULL; adapters->AdapterCount = AdapterCount; for (pip = pIPAda, i=0; i < AdapterCount; i++, pip=pip->Next) { LPADAPTER LPA; sprintf( adapters->adapters[i].AdapterName, "\\Device\\Packet_%s", pip->AdapterName ); strcpy(adapters->adapters[i].Description, pip->Description); prmacaddr(adapters->adapters[i].Mac, pip->Address); LPA = adapters->adapters[i].LPA = PacketOpenAdapter(adapters->adapters[i].AdapterName); if (!LPA || (LPA->hFile == INVALID_HANDLE_VALUE)) { adapters->adapters[i].LPA = NULL; } else { PacketSetHwFilter(LPA, NDIS_PACKET_TYPE_PROMISCUOUS ); PacketGetNetType(LPA, &adapters->adapters[i].nett); } } GlobalFree( FixedInfo ); free(pIPAda); return adapters; }
|
