2 * win_if_list - Display network interfaces with description (for Windows)
3 * Copyright (c) 2004-2006, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
8 * This small tool is for the Windows build to provide an easy way of fetching
9 * a list of available network interfaces.
14 #ifdef CONFIG_USE_NDISUIO
17 #else /* CONFIG_USE_NDISUIO */
20 #endif /* CONFIG_USE_NDISUIO */
22 #ifdef CONFIG_USE_NDISUIO
25 #define FSCTL_NDISUIO_BASE FILE_DEVICE_NETWORK
27 #define _NDISUIO_CTL_CODE(_Function, _Method, _Access) \
28 CTL_CODE(FSCTL_NDISUIO_BASE, _Function, _Method, _Access)
30 #define IOCTL_NDISUIO_QUERY_BINDING \
31 _NDISUIO_CTL_CODE(0x203, METHOD_BUFFERED, \
32 FILE_READ_ACCESS | FILE_WRITE_ACCESS)
34 #define IOCTL_NDISUIO_BIND_WAIT \
35 _NDISUIO_CTL_CODE(0x204, METHOD_BUFFERED, \
36 FILE_READ_ACCESS | FILE_WRITE_ACCESS)
38 typedef struct _NDISUIO_QUERY_BINDING
41 ULONG DeviceNameOffset;
42 ULONG DeviceNameLength;
43 ULONG DeviceDescrOffset;
44 ULONG DeviceDescrLength;
45 } NDISUIO_QUERY_BINDING, *PNDISUIO_QUERY_BINDING;
48 static HANDLE ndisuio_open(void)
53 h = CreateFile(TEXT("\\\\.\\\\Ndisuio"),
54 GENERIC_READ | GENERIC_WRITE, 0, NULL,
55 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
56 INVALID_HANDLE_VALUE);
57 if (h == INVALID_HANDLE_VALUE)
61 if (!DeviceIoControl(h, IOCTL_NDISUIO_BIND_WAIT, NULL, 0, NULL, 0,
63 printf("IOCTL_NDISUIO_BIND_WAIT failed: %d",
64 (int) GetLastError());
66 return INVALID_HANDLE_VALUE;
68 #endif /* _WIN32_WCE */
74 static void ndisuio_query_bindings(HANDLE ndisuio)
76 NDISUIO_QUERY_BINDING *b;
77 size_t blen = sizeof(*b) + 1024;
80 char name[256], desc[256];
91 if (!DeviceIoControl(ndisuio, IOCTL_NDISUIO_QUERY_BINDING,
92 b, sizeof(NDISUIO_QUERY_BINDING), b,
93 (DWORD) blen, &written, NULL)) {
94 error = (int) GetLastError();
95 if (error == ERROR_NO_MORE_ITEMS)
97 printf("IOCTL_NDISUIO_QUERY_BINDING failed: %d",
102 pos = (WCHAR *) ((char *) b + b->DeviceNameOffset);
103 len = b->DeviceNameLength;
104 if (len >= sizeof(name))
105 len = sizeof(name) - 1;
106 for (j = 0; j < len; j++)
107 name[j] = (char) pos[j];
110 pos = (WCHAR *) ((char *) b + b->DeviceDescrOffset);
111 len = b->DeviceDescrLength;
112 if (len >= sizeof(desc))
113 len = sizeof(desc) - 1;
114 for (j = 0; j < len; j++)
115 desc[j] = (char) pos[j];
118 printf("ifname: %s\ndescription: %s\n\n", name, desc);
125 static void ndisuio_enum_bindings(void)
127 HANDLE ndisuio = ndisuio_open();
128 if (ndisuio == INVALID_HANDLE_VALUE)
131 ndisuio_query_bindings(ndisuio);
132 CloseHandle(ndisuio);
135 #else /* CONFIG_USE_NDISUIO */
137 static void show_dev(pcap_if_t *dev)
139 printf("ifname: %s\ndescription: %s\n\n",
140 dev->name, dev->description);
144 static void pcap_enum_devs(void)
146 pcap_if_t *devs, *dev;
147 char err[PCAP_ERRBUF_SIZE + 1];
149 if (pcap_findalldevs(&devs, err) < 0) {
150 fprintf(stderr, "Error - pcap_findalldevs: %s\n", err);
154 for (dev = devs; dev; dev = dev->next) {
158 pcap_freealldevs(devs);
161 #endif /* CONFIG_USE_NDISUIO */
164 int main(int argc, char *argv[])
166 #ifdef CONFIG_USE_NDISUIO
167 ndisuio_enum_bindings();
168 #else /* CONFIG_USE_NDISUIO */
170 #endif /* CONFIG_USE_NDISUIO */