Ok, good luck
#include <Packet32.h>
#include <IPHlpApi.h>
typedef struct {
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
char Mac[15];
char ip_addr[17];
char protocol[32];
IP_ADDR_STRING addresses;
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;
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;
PIP_ADDR_STRING adr, adr2;
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
);
adapters->adapters[i].addresses = pip->IpAddressList;
for (adr = &adapters->adapters[i].addresses; adr; ) {
if (adr2 = adr->Next) {
adr->Next = calloc(sizeof(*adr), 1);
memcpy(adr->Next, adr2, sizeof(*adr));
adr = adr->Next;
} else
break;
}
sprintf(
adapters->adapters[i].ip_addr,
"%s",
pip->IpAddressList.IpAddress.String
);
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);
strcpy(adapters->adapters[i].protocol,
nettypes[adapters->adapters[i].nett.LinkType]);
}
}
GlobalFree( FixedInfo );
free(pIPAda);
return adapters;
}