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;
}


Reply via email to