1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS packet driver interface list utility
4  * FILE:        apps/net/niclist/niclist.c
5  * PURPOSE:     Network information utility
6  * PROGRAMMERS: Robert Dickenson (robert_dickenson@users.sourceforge.net)
7  * REVISIONS:
8  *   RDD  10/07/2002 Created from bochs sources
9  */
10 /*
11  For this program and for win32 ethernet, the winpcap library is required.
12  Download it from http://netgroup-serv.polito.it/winpcap.
13  */
14 #ifdef MSC_VER
15 #define WIN32_LEAN_AND_MEAN
16 #endif
17 #include <windows.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 
21 #define MAX_ADAPTERS 10
22 #define NIC_BUFFER_SIZE 2048
23 
24 
25 // structure to hold the adapter name and description
26 typedef struct {
27     LPWSTR wstrName;
28     LPSTR strDesc;
29 } NIC_INFO_NT;
30 
31 // array of structures to hold information for our adapters
32 NIC_INFO_NT nic_info[MAX_ADAPTERS];
33 
34 // pointer to exported function in winpcap library
35 BOOLEAN (*PacketGetAdapterNames)(PTSTR, PULONG) = NULL;
36 PCHAR (*PacketGetVersion)(VOID) = NULL;
37 
38 
39 int main(int argc, char **argv)
40 {
41     char AdapterInfo[NIC_BUFFER_SIZE] = { '\0','\0' };
42     unsigned long AdapterLength = NIC_BUFFER_SIZE;
43     LPWSTR wstrName;
44     LPSTR strDesc;
45     int nAdapterCount;
46     int i;
47 
48 	char* PacketLibraryVersion;
49 
50 
51     // Attemp to load the WinPCap dynamic link library
52     HINSTANCE hPacket = LoadLibrary("PACKET.DLL");
53     if (hPacket) {
54         PacketGetAdapterNames = (BOOLEAN (*)(PTSTR, PULONG))GetProcAddress(hPacket, "PacketGetAdapterNames");
55         PacketGetVersion = (PCHAR (*)(VOID))GetProcAddress(hPacket, "PacketGetVersion");
56     } else {
57         printf("Could not load WinPCap driver! for more information goto:\n");
58         printf ("http://netgroup-serv.polito.it/winpcap\n");
59         return 1;
60     }
61     if (!(PacketLibraryVersion = PacketGetVersion())) {
62         printf("ERROR: Could not get Packet DLL Version string.\n");
63 		return 2;
64 	}
65 	printf("Packet Library Version: %s\n", PacketLibraryVersion);
66 
67     if (!PacketGetAdapterNames(AdapterInfo, &AdapterLength)) {
68         printf("ERROR: Could not get Packet Adaptor Names.\n");
69 		return 2;
70 	}
71     wstrName = (LPWSTR)AdapterInfo;
72 
73     // Enumerate all the adapters names found...
74     nAdapterCount = 0;
75     while ((*wstrName)) {
76         nic_info[nAdapterCount].wstrName = wstrName;
77         wstrName += lstrlenW(wstrName) + 1;
78         nAdapterCount++;
79 		if (nAdapterCount > 9) break;
80     }
81     strDesc = (LPSTR)++wstrName;
82 
83 	if (!nAdapterCount) {
84 		printf("No Packet Adaptors found (%lu)\n", AdapterLength);
85 	} else {
86 	    printf("Adaptor count: %d\n", nAdapterCount);
87 	}
88 
89     // And obtain the adapter description strings....
90     for (i = 0; i < nAdapterCount; i++) {
91         nic_info[i].strDesc = strDesc;
92         strDesc += lstrlen(strDesc) + 1;
93 
94         // display adapter info
95         printf("%d: %s\n", i + 1, nic_info[i].strDesc);
96         wprintf(L"     Device: %s\n", nic_info[i].wstrName);
97     }
98     return 0;
99 }
100