///////////////////////////////////////////////////////////////////////// // // misc/niclist.c // by Don Becker // $Id$ // // This program is for win32 only. It lists the network interface cards // that you can use in the "ethdev" field of the ne2k line in your bochsrc. // // For this program and for win32 ethernet, the winpcap library is required. // Download it from http://www.winpcap.org/ // ///////////////////////////////////////////////////////////////////////// #ifndef WIN32 #error Niclist will only work on WIN32 platforms. #endif #ifndef CDECL #if defined(_MSC_VER) #define CDECL __cdecl #else #define CDECL #endif #endif #include #include #ifdef __CYGWIN__ #include #else #include #endif #include #if defined(_MSC_VER) #define getch _getch #endif #define MAX_ADAPTERS 10 #define NIC_BUFFER_SIZE 2048 // declare our NT/9X structures to hold the adapter name and descriptions typedef struct { LPWSTR wstrName; LPSTR strDesc; } NIC_INFO_NT; typedef struct { LPSTR strName; LPSTR strDesc; } NIC_INFO_9X; // declare an array of structures to hold our adapter information NIC_INFO_NT niNT[MAX_ADAPTERS]; NIC_INFO_9X ni9X[MAX_ADAPTERS]; typedef BOOLEAN (CDECL *PGetAdapterNames)(PTSTR, PULONG); typedef PCHAR (CDECL *PGetVersion)(); PGetAdapterNames PacketGetAdapterNames = NULL; PGetVersion PacketGetVersion = NULL; void myexit (int code) { #ifndef __CYGWIN__ printf ("\nPress any key to continue\n"); getch(); #endif exit(code); } int CDECL main(int argc, char **argv) { int i; HINSTANCE hPacket; DWORD dwVersion, dwMajorVersion; char AdapterInfo[NIC_BUFFER_SIZE] = { '\0','\0' }; ULONG AdapterLength = NIC_BUFFER_SIZE; LPWSTR wstrName; LPSTR strName, strDesc; int nAdapterCount; PCHAR dllVersion; PCHAR testString; int nDLLMajorVersion, nDLLMinorVersion; // Attemp to load the WinpCap packet library hPacket = LoadLibrary("PACKET.DLL"); if(hPacket) { // Now look up the address PacketGetAdapterNames = (PGetAdapterNames)GetProcAddress(hPacket, "PacketGetAdapterNames"); PacketGetVersion = (PGetVersion)GetProcAddress(hPacket, "PacketGetVersion"); } else { printf("Could not load WinPCap driver!\n"); printf ("You can download them for free from\n"); printf ("http://www.winpcap.org/\n"); myexit(1); } dwVersion = GetVersion(); dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); // Get DLL Version and Tokenize dllVersion = PacketGetVersion(); nDLLMajorVersion = -1; nDLLMinorVersion = -1; for (testString = strtok(dllVersion, ",. "); testString != NULL; testString = strtok(NULL, ",. ")) { // If Single Character, Convert if (strlen( testString ) == 1) { // Check Major First if (nDLLMajorVersion == -1) { nDLLMajorVersion = atoi(testString); } else if ( nDLLMinorVersion == -1 ) { nDLLMinorVersion = atoi(testString); } } } // Get out blob of adapter info PacketGetAdapterNames(AdapterInfo,&AdapterLength); // If this is Windows NT ... And DLL Returns UNICODE if(!(dwVersion >= 0x80000000 && dwMajorVersion >= 4) && (nDLLMajorVersion < 3 || (nDLLMajorVersion == 3 && nDLLMinorVersion < 1))) { wstrName=(LPWSTR)AdapterInfo; // Obtain Names nAdapterCount = 0; while ((*wstrName)) { // store pointer to name niNT[nAdapterCount].wstrName=wstrName; wstrName += lstrlenW(wstrName) +1; nAdapterCount++; } strDesc = (LPSTR)++wstrName; // Obtain descriptions .... for(i=0;i