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;
}
----- Original Message -----
From: hic sonni
Sent: Tuesday, June 18, 2002 6:27 PM
Subject: [WinPcap-users] problem with PacketGetAdapterNames()?

I use winpcap2.3 on win2k, the PacketGetAdapterNames(PTSTR pStr, PULONG BufferSize) function don't ' returns the names of the adapters installed on the system in the user allocated buffer pStr. I installed an earlier version of winpcap, but the same problem. I can't use  pcap_lookupdev() because I've several NICs.

can you help me?

 



Do You Yahoo!?
Sign-up for Video Highlights of 2002 FIFA World Cup

Reply via email to