iphlpapi/tests: Fix typo.
[wine.git] / dlls / iphlpapi / tests / iphlpapi.c
blobb2d81c0367ec5e607656a1fcae3063c896ae8d5f
1 /*
2 * iphlpapi dll test
4 * Copyright (C) 2003 Juan Lang
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 * Some observations that an automated test can't produce:
23 * An adapter index is a key for an adapter. That is, if an index is returned
24 * from one API, that same index may be used successfully in another API, as
25 * long as the adapter remains present.
26 * If the adapter is removed and reinserted, however, the index may change (and
27 * indeed it does change on Win2K).
29 * The Name field of the IP_ADAPTER_INDEX_MAP entries returned by
30 * GetInterfaceInfo is declared as a wide string, but the bytes are actually
31 * an ASCII string on some versions of the IP helper API under Win9x. This was
32 * apparently an MS bug, it's corrected in later versions.
34 * The DomainName field of FIXED_INFO isn't NULL-terminated on Win98.
37 #include <stdarg.h>
38 #include "winsock2.h"
39 #include "windef.h"
40 #include "winbase.h"
41 #include "iphlpapi.h"
42 #include "iprtrmib.h"
43 #include "wine/test.h"
44 #include <stdio.h>
45 #include <stdlib.h>
47 #define ICMP_MINLEN 8 /* copied from dlls/iphlpapi/ip_icmp.h file */
49 static HMODULE hLibrary = NULL;
51 static DWORD (WINAPI *pGetNumberOfInterfaces)(PDWORD);
52 static DWORD (WINAPI *pGetIpAddrTable)(PMIB_IPADDRTABLE,PULONG,BOOL);
53 static DWORD (WINAPI *pGetIfEntry)(PMIB_IFROW);
54 static DWORD (WINAPI *pGetFriendlyIfIndex)(DWORD);
55 static DWORD (WINAPI *pGetIfTable)(PMIB_IFTABLE,PULONG,BOOL);
56 static DWORD (WINAPI *pGetIpForwardTable)(PMIB_IPFORWARDTABLE,PULONG,BOOL);
57 static DWORD (WINAPI *pGetIpNetTable)(PMIB_IPNETTABLE,PULONG,BOOL);
58 static DWORD (WINAPI *pGetInterfaceInfo)(PIP_INTERFACE_INFO,PULONG);
59 static DWORD (WINAPI *pGetAdaptersInfo)(PIP_ADAPTER_INFO,PULONG);
60 static DWORD (WINAPI *pGetNetworkParams)(PFIXED_INFO,PULONG);
61 static DWORD (WINAPI *pGetIcmpStatistics)(PMIB_ICMP);
62 static DWORD (WINAPI *pGetIpStatistics)(PMIB_IPSTATS);
63 static DWORD (WINAPI *pGetTcpStatistics)(PMIB_TCPSTATS);
64 static DWORD (WINAPI *pGetUdpStatistics)(PMIB_UDPSTATS);
65 static DWORD (WINAPI *pGetIcmpStatisticsEx)(PMIB_ICMP_EX,DWORD);
66 static DWORD (WINAPI *pGetIpStatisticsEx)(PMIB_IPSTATS,DWORD);
67 static DWORD (WINAPI *pGetTcpStatisticsEx)(PMIB_TCPSTATS,DWORD);
68 static DWORD (WINAPI *pGetUdpStatisticsEx)(PMIB_UDPSTATS,DWORD);
69 static DWORD (WINAPI *pGetTcpTable)(PMIB_TCPTABLE,PDWORD,BOOL);
70 static DWORD (WINAPI *pGetUdpTable)(PMIB_UDPTABLE,PDWORD,BOOL);
71 static DWORD (WINAPI *pGetPerAdapterInfo)(ULONG,PIP_PER_ADAPTER_INFO,PULONG);
72 static DWORD (WINAPI *pGetAdaptersAddresses)(ULONG,ULONG,PVOID,PIP_ADAPTER_ADDRESSES,PULONG);
73 static DWORD (WINAPI *pNotifyAddrChange)(PHANDLE,LPOVERLAPPED);
74 static BOOL (WINAPI *pCancelIPChangeNotify)(LPOVERLAPPED);
75 static DWORD (WINAPI *pGetExtendedTcpTable)(PVOID,PDWORD,BOOL,ULONG,TCP_TABLE_CLASS,ULONG);
76 static DWORD (WINAPI *pGetExtendedUdpTable)(PVOID,PDWORD,BOOL,ULONG,UDP_TABLE_CLASS,ULONG);
77 static DWORD (WINAPI *pSetTcpEntry)(PMIB_TCPROW);
78 static HANDLE(WINAPI *pIcmpCreateFile)(VOID);
79 static DWORD (WINAPI *pIcmpSendEcho)(HANDLE,IPAddr,LPVOID,WORD,PIP_OPTION_INFORMATION,LPVOID,DWORD,DWORD);
81 static void loadIPHlpApi(void)
83 hLibrary = LoadLibraryA("iphlpapi.dll");
84 if (hLibrary) {
85 pGetNumberOfInterfaces = (void *)GetProcAddress(hLibrary, "GetNumberOfInterfaces");
86 pGetIpAddrTable = (void *)GetProcAddress(hLibrary, "GetIpAddrTable");
87 pGetIfEntry = (void *)GetProcAddress(hLibrary, "GetIfEntry");
88 pGetFriendlyIfIndex = (void *)GetProcAddress(hLibrary, "GetFriendlyIfIndex");
89 pGetIfTable = (void *)GetProcAddress(hLibrary, "GetIfTable");
90 pGetIpForwardTable = (void *)GetProcAddress(hLibrary, "GetIpForwardTable");
91 pGetIpNetTable = (void *)GetProcAddress(hLibrary, "GetIpNetTable");
92 pGetInterfaceInfo = (void *)GetProcAddress(hLibrary, "GetInterfaceInfo");
93 pGetAdaptersInfo = (void *)GetProcAddress(hLibrary, "GetAdaptersInfo");
94 pGetNetworkParams = (void *)GetProcAddress(hLibrary, "GetNetworkParams");
95 pGetIcmpStatistics = (void *)GetProcAddress(hLibrary, "GetIcmpStatistics");
96 pGetIpStatistics = (void *)GetProcAddress(hLibrary, "GetIpStatistics");
97 pGetTcpStatistics = (void *)GetProcAddress(hLibrary, "GetTcpStatistics");
98 pGetUdpStatistics = (void *)GetProcAddress(hLibrary, "GetUdpStatistics");
99 pGetIcmpStatisticsEx = (void *)GetProcAddress(hLibrary, "GetIcmpStatisticsEx");
100 pGetIpStatisticsEx = (void *)GetProcAddress(hLibrary, "GetIpStatisticsEx");
101 pGetTcpStatisticsEx = (void *)GetProcAddress(hLibrary, "GetTcpStatisticsEx");
102 pGetUdpStatisticsEx = (void *)GetProcAddress(hLibrary, "GetUdpStatisticsEx");
103 pGetTcpTable = (void *)GetProcAddress(hLibrary, "GetTcpTable");
104 pGetUdpTable = (void *)GetProcAddress(hLibrary, "GetUdpTable");
105 pGetPerAdapterInfo = (void *)GetProcAddress(hLibrary, "GetPerAdapterInfo");
106 pGetAdaptersAddresses = (void *)GetProcAddress(hLibrary, "GetAdaptersAddresses");
107 pNotifyAddrChange = (void *)GetProcAddress(hLibrary, "NotifyAddrChange");
108 pCancelIPChangeNotify = (void *)GetProcAddress(hLibrary, "CancelIPChangeNotify");
109 pGetExtendedTcpTable = (void *)GetProcAddress(hLibrary, "GetExtendedTcpTable");
110 pGetExtendedUdpTable = (void *)GetProcAddress(hLibrary, "GetExtendedUdpTable");
111 pSetTcpEntry = (void *)GetProcAddress(hLibrary, "SetTcpEntry");
112 pIcmpCreateFile = (void *)GetProcAddress(hLibrary, "IcmpCreateFile");
113 pIcmpSendEcho = (void *)GetProcAddress(hLibrary, "IcmpSendEcho");
117 static void freeIPHlpApi(void)
119 FreeLibrary(hLibrary);
122 /* replacement for inet_ntoa */
123 static const char *ntoa( DWORD ip )
125 static char buffer[40];
127 ip = htonl(ip);
128 sprintf( buffer, "%u.%u.%u.%u", (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff );
129 return buffer;
133 still-to-be-tested 98-only functions:
134 GetUniDirectionalAdapterInfo
136 static void testWin98OnlyFunctions(void)
140 static void testGetNumberOfInterfaces(void)
142 if (pGetNumberOfInterfaces) {
143 DWORD apiReturn, numInterfaces;
145 /* Crashes on Vista */
146 if (0) {
147 apiReturn = pGetNumberOfInterfaces(NULL);
148 if (apiReturn == ERROR_NOT_SUPPORTED)
149 return;
150 ok(apiReturn == ERROR_INVALID_PARAMETER,
151 "GetNumberOfInterfaces(NULL) returned %d, expected ERROR_INVALID_PARAMETER\n",
152 apiReturn);
155 apiReturn = pGetNumberOfInterfaces(&numInterfaces);
156 if (apiReturn == ERROR_NOT_SUPPORTED) {
157 skip("GetNumberOfInterfaces is not supported\n");
158 return;
160 ok(apiReturn == NO_ERROR,
161 "GetNumberOfInterfaces returned %d, expected 0\n", apiReturn);
165 static void testGetIfEntry(DWORD index)
167 if (pGetIfEntry) {
168 DWORD apiReturn;
169 MIB_IFROW row;
171 memset(&row, 0, sizeof(row));
172 apiReturn = pGetIfEntry(NULL);
173 if (apiReturn == ERROR_NOT_SUPPORTED) {
174 skip("GetIfEntry is not supported\n");
175 return;
177 ok(apiReturn == ERROR_INVALID_PARAMETER,
178 "GetIfEntry(NULL) returned %d, expected ERROR_INVALID_PARAMETER\n",
179 apiReturn);
180 row.dwIndex = -1; /* hope that's always bogus! */
181 apiReturn = pGetIfEntry(&row);
182 ok(apiReturn == ERROR_INVALID_DATA ||
183 apiReturn == ERROR_FILE_NOT_FOUND /* Vista */,
184 "GetIfEntry(bogus row) returned %d, expected ERROR_INVALID_DATA or ERROR_FILE_NOT_FOUND\n",
185 apiReturn);
186 row.dwIndex = index;
187 apiReturn = pGetIfEntry(&row);
188 ok(apiReturn == NO_ERROR,
189 "GetIfEntry returned %d, expected NO_ERROR\n", apiReturn);
193 static void testGetIpAddrTable(void)
195 if (pGetIpAddrTable) {
196 DWORD apiReturn;
197 ULONG dwSize = 0;
199 apiReturn = pGetIpAddrTable(NULL, NULL, FALSE);
200 if (apiReturn == ERROR_NOT_SUPPORTED) {
201 skip("GetIpAddrTable is not supported\n");
202 return;
204 ok(apiReturn == ERROR_INVALID_PARAMETER,
205 "GetIpAddrTable(NULL, NULL, FALSE) returned %d, expected ERROR_INVALID_PARAMETER\n",
206 apiReturn);
207 apiReturn = pGetIpAddrTable(NULL, &dwSize, FALSE);
208 ok(apiReturn == ERROR_INSUFFICIENT_BUFFER,
209 "GetIpAddrTable(NULL, &dwSize, FALSE) returned %d, expected ERROR_INSUFFICIENT_BUFFER\n",
210 apiReturn);
211 if (apiReturn == ERROR_INSUFFICIENT_BUFFER) {
212 PMIB_IPADDRTABLE buf = HeapAlloc(GetProcessHeap(), 0, dwSize);
214 apiReturn = pGetIpAddrTable(buf, &dwSize, FALSE);
215 ok(apiReturn == NO_ERROR,
216 "GetIpAddrTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n",
217 apiReturn);
218 if (apiReturn == NO_ERROR && buf->dwNumEntries)
219 testGetIfEntry(buf->table[0].dwIndex);
220 HeapFree(GetProcessHeap(), 0, buf);
225 static void testGetIfTable(void)
227 if (pGetIfTable) {
228 DWORD apiReturn;
229 ULONG dwSize = 0;
231 apiReturn = pGetIfTable(NULL, NULL, FALSE);
232 if (apiReturn == ERROR_NOT_SUPPORTED) {
233 skip("GetIfTable is not supported\n");
234 return;
236 ok(apiReturn == ERROR_INVALID_PARAMETER,
237 "GetIfTable(NULL, NULL, FALSE) returned %d, expected ERROR_INVALID_PARAMETER\n",
238 apiReturn);
239 apiReturn = pGetIfTable(NULL, &dwSize, FALSE);
240 ok(apiReturn == ERROR_INSUFFICIENT_BUFFER,
241 "GetIfTable(NULL, &dwSize, FALSE) returned %d, expected ERROR_INSUFFICIENT_BUFFER\n",
242 apiReturn);
243 if (apiReturn == ERROR_INSUFFICIENT_BUFFER) {
244 PMIB_IFTABLE buf = HeapAlloc(GetProcessHeap(), 0, dwSize);
246 apiReturn = pGetIfTable(buf, &dwSize, FALSE);
247 ok(apiReturn == NO_ERROR,
248 "GetIfTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n\n",
249 apiReturn);
251 if (apiReturn == NO_ERROR && winetest_debug > 1)
253 DWORD i, j;
254 char name[MAX_INTERFACE_NAME_LEN];
256 trace( "interface table: %u entries\n", buf->dwNumEntries );
257 for (i = 0; i < buf->dwNumEntries; i++)
259 MIB_IFROW *row = &buf->table[i];
260 WideCharToMultiByte( CP_ACP, 0, row->wszName, -1, name, MAX_INTERFACE_NAME_LEN, NULL, NULL );
261 trace( "%u: '%s' type %u mtu %u speed %u phys",
262 row->dwIndex, name, row->dwType, row->dwMtu, row->dwSpeed );
263 for (j = 0; j < row->dwPhysAddrLen; j++)
264 printf( " %02x", row->bPhysAddr[j] );
265 printf( "\n" );
266 trace( " in: bytes %u upkts %u nupkts %u disc %u err %u unk %u\n",
267 row->dwInOctets, row->dwInUcastPkts, row->dwInNUcastPkts,
268 row->dwInDiscards, row->dwInErrors, row->dwInUnknownProtos );
269 trace( " out: bytes %u upkts %u nupkts %u disc %u err %u\n",
270 row->dwOutOctets, row->dwOutUcastPkts, row->dwOutNUcastPkts,
271 row->dwOutDiscards, row->dwOutErrors );
274 HeapFree(GetProcessHeap(), 0, buf);
279 static void testGetIpForwardTable(void)
281 if (pGetIpForwardTable) {
282 DWORD apiReturn;
283 ULONG dwSize = 0;
285 apiReturn = pGetIpForwardTable(NULL, NULL, FALSE);
286 if (apiReturn == ERROR_NOT_SUPPORTED) {
287 skip("GetIpForwardTable is not supported\n");
288 return;
290 ok(apiReturn == ERROR_INVALID_PARAMETER,
291 "GetIpForwardTable(NULL, NULL, FALSE) returned %d, expected ERROR_INVALID_PARAMETER\n",
292 apiReturn);
293 apiReturn = pGetIpForwardTable(NULL, &dwSize, FALSE);
294 ok(apiReturn == ERROR_INSUFFICIENT_BUFFER,
295 "GetIpForwardTable(NULL, &dwSize, FALSE) returned %d, expected ERROR_INSUFFICIENT_BUFFER\n",
296 apiReturn);
297 if (apiReturn == ERROR_INSUFFICIENT_BUFFER) {
298 PMIB_IPFORWARDTABLE buf = HeapAlloc(GetProcessHeap(), 0, dwSize);
300 apiReturn = pGetIpForwardTable(buf, &dwSize, FALSE);
301 ok(apiReturn == NO_ERROR,
302 "GetIpForwardTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n",
303 apiReturn);
305 if (apiReturn == NO_ERROR && winetest_debug > 1)
307 DWORD i;
309 trace( "IP forward table: %u entries\n", buf->dwNumEntries );
310 for (i = 0; i < buf->dwNumEntries; i++)
312 char buffer[100];
313 sprintf( buffer, "dest %s", ntoa( buf->table[i].dwForwardDest ));
314 sprintf( buffer + strlen(buffer), " mask %s", ntoa( buf->table[i].dwForwardMask ));
315 trace( "%u: %s gw %s if %u type %u\n", i, buffer,
316 ntoa( buf->table[i].dwForwardNextHop ),
317 buf->table[i].dwForwardIfIndex, U1(buf->table[i]).dwForwardType );
320 HeapFree(GetProcessHeap(), 0, buf);
325 static void testGetIpNetTable(void)
327 if (pGetIpNetTable) {
328 DWORD apiReturn;
329 ULONG dwSize = 0;
331 apiReturn = pGetIpNetTable(NULL, NULL, FALSE);
332 if (apiReturn == ERROR_NOT_SUPPORTED) {
333 skip("GetIpNetTable is not supported\n");
334 return;
336 ok(apiReturn == ERROR_INVALID_PARAMETER,
337 "GetIpNetTable(NULL, NULL, FALSE) returned %d, expected ERROR_INVALID_PARAMETER\n",
338 apiReturn);
339 apiReturn = pGetIpNetTable(NULL, &dwSize, FALSE);
340 ok(apiReturn == ERROR_NO_DATA || apiReturn == ERROR_INSUFFICIENT_BUFFER,
341 "GetIpNetTable(NULL, &dwSize, FALSE) returned %d, expected ERROR_NO_DATA or ERROR_INSUFFICIENT_BUFFER\n",
342 apiReturn);
343 if (apiReturn == ERROR_NO_DATA)
344 ; /* empty ARP table's okay */
345 else if (apiReturn == ERROR_INSUFFICIENT_BUFFER) {
346 PMIB_IPNETTABLE buf = HeapAlloc(GetProcessHeap(), 0, dwSize);
348 apiReturn = pGetIpNetTable(buf, &dwSize, FALSE);
349 ok(apiReturn == NO_ERROR ||
350 apiReturn == ERROR_NO_DATA, /* empty ARP table's okay */
351 "GetIpNetTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n",
352 apiReturn);
354 if (apiReturn == NO_ERROR && winetest_debug > 1)
356 DWORD i, j;
358 trace( "IP net table: %u entries\n", buf->dwNumEntries );
359 for (i = 0; i < buf->dwNumEntries; i++)
361 trace( "%u: idx %u type %u addr %s phys",
362 i, buf->table[i].dwIndex, U(buf->table[i]).dwType, ntoa( buf->table[i].dwAddr ));
363 for (j = 0; j < buf->table[i].dwPhysAddrLen; j++)
364 printf( " %02x", buf->table[i].bPhysAddr[j] );
365 printf( "\n" );
368 HeapFree(GetProcessHeap(), 0, buf);
373 static void testGetIcmpStatistics(void)
375 if (pGetIcmpStatistics) {
376 DWORD apiReturn;
377 MIB_ICMP stats;
379 /* Crashes on Vista */
380 if (0) {
381 apiReturn = pGetIcmpStatistics(NULL);
382 if (apiReturn == ERROR_NOT_SUPPORTED)
383 return;
384 ok(apiReturn == ERROR_INVALID_PARAMETER,
385 "GetIcmpStatistics(NULL) returned %d, expected ERROR_INVALID_PARAMETER\n",
386 apiReturn);
389 apiReturn = pGetIcmpStatistics(&stats);
390 if (apiReturn == ERROR_NOT_SUPPORTED)
392 skip("GetIcmpStatistics is not supported\n");
393 return;
395 ok(apiReturn == NO_ERROR,
396 "GetIcmpStatistics returned %d, expected NO_ERROR\n", apiReturn);
397 if (apiReturn == NO_ERROR && winetest_debug > 1)
399 trace( "ICMP stats: %8s %8s\n", "in", "out" );
400 trace( " dwMsgs: %8u %8u\n", stats.stats.icmpInStats.dwMsgs, stats.stats.icmpOutStats.dwMsgs );
401 trace( " dwErrors: %8u %8u\n", stats.stats.icmpInStats.dwErrors, stats.stats.icmpOutStats.dwErrors );
402 trace( " dwDestUnreachs: %8u %8u\n", stats.stats.icmpInStats.dwDestUnreachs, stats.stats.icmpOutStats.dwDestUnreachs );
403 trace( " dwTimeExcds: %8u %8u\n", stats.stats.icmpInStats.dwTimeExcds, stats.stats.icmpOutStats.dwTimeExcds );
404 trace( " dwParmProbs: %8u %8u\n", stats.stats.icmpInStats.dwParmProbs, stats.stats.icmpOutStats.dwParmProbs );
405 trace( " dwSrcQuenchs: %8u %8u\n", stats.stats.icmpInStats.dwSrcQuenchs, stats.stats.icmpOutStats.dwSrcQuenchs );
406 trace( " dwRedirects: %8u %8u\n", stats.stats.icmpInStats.dwRedirects, stats.stats.icmpOutStats.dwRedirects );
407 trace( " dwEchos: %8u %8u\n", stats.stats.icmpInStats.dwEchos, stats.stats.icmpOutStats.dwEchos );
408 trace( " dwEchoReps: %8u %8u\n", stats.stats.icmpInStats.dwEchoReps, stats.stats.icmpOutStats.dwEchoReps );
409 trace( " dwTimestamps: %8u %8u\n", stats.stats.icmpInStats.dwTimestamps, stats.stats.icmpOutStats.dwTimestamps );
410 trace( " dwTimestampReps: %8u %8u\n", stats.stats.icmpInStats.dwTimestampReps, stats.stats.icmpOutStats.dwTimestampReps );
411 trace( " dwAddrMasks: %8u %8u\n", stats.stats.icmpInStats.dwAddrMasks, stats.stats.icmpOutStats.dwAddrMasks );
412 trace( " dwAddrMaskReps: %8u %8u\n", stats.stats.icmpInStats.dwAddrMaskReps, stats.stats.icmpOutStats.dwAddrMaskReps );
417 static void testGetIpStatistics(void)
419 if (pGetIpStatistics) {
420 DWORD apiReturn;
421 MIB_IPSTATS stats;
423 apiReturn = pGetIpStatistics(NULL);
424 if (apiReturn == ERROR_NOT_SUPPORTED) {
425 skip("GetIpStatistics is not supported\n");
426 return;
428 ok(apiReturn == ERROR_INVALID_PARAMETER,
429 "GetIpStatistics(NULL) returned %d, expected ERROR_INVALID_PARAMETER\n",
430 apiReturn);
431 apiReturn = pGetIpStatistics(&stats);
432 ok(apiReturn == NO_ERROR,
433 "GetIpStatistics returned %d, expected NO_ERROR\n", apiReturn);
434 if (apiReturn == NO_ERROR && winetest_debug > 1)
436 trace( "IP stats:\n" );
437 trace( " dwForwarding: %u\n", U(stats).dwForwarding );
438 trace( " dwDefaultTTL: %u\n", stats.dwDefaultTTL );
439 trace( " dwInReceives: %u\n", stats.dwInReceives );
440 trace( " dwInHdrErrors: %u\n", stats.dwInHdrErrors );
441 trace( " dwInAddrErrors: %u\n", stats.dwInAddrErrors );
442 trace( " dwForwDatagrams: %u\n", stats.dwForwDatagrams );
443 trace( " dwInUnknownProtos: %u\n", stats.dwInUnknownProtos );
444 trace( " dwInDiscards: %u\n", stats.dwInDiscards );
445 trace( " dwInDelivers: %u\n", stats.dwInDelivers );
446 trace( " dwOutRequests: %u\n", stats.dwOutRequests );
447 trace( " dwRoutingDiscards: %u\n", stats.dwRoutingDiscards );
448 trace( " dwOutDiscards: %u\n", stats.dwOutDiscards );
449 trace( " dwOutNoRoutes: %u\n", stats.dwOutNoRoutes );
450 trace( " dwReasmTimeout: %u\n", stats.dwReasmTimeout );
451 trace( " dwReasmReqds: %u\n", stats.dwReasmReqds );
452 trace( " dwReasmOks: %u\n", stats.dwReasmOks );
453 trace( " dwReasmFails: %u\n", stats.dwReasmFails );
454 trace( " dwFragOks: %u\n", stats.dwFragOks );
455 trace( " dwFragFails: %u\n", stats.dwFragFails );
456 trace( " dwFragCreates: %u\n", stats.dwFragCreates );
457 trace( " dwNumIf: %u\n", stats.dwNumIf );
458 trace( " dwNumAddr: %u\n", stats.dwNumAddr );
459 trace( " dwNumRoutes: %u\n", stats.dwNumRoutes );
464 static void testGetTcpStatistics(void)
466 if (pGetTcpStatistics) {
467 DWORD apiReturn;
468 MIB_TCPSTATS stats;
470 apiReturn = pGetTcpStatistics(NULL);
471 if (apiReturn == ERROR_NOT_SUPPORTED) {
472 skip("GetTcpStatistics is not supported\n");
473 return;
475 ok(apiReturn == ERROR_INVALID_PARAMETER,
476 "GetTcpStatistics(NULL) returned %d, expected ERROR_INVALID_PARAMETER\n",
477 apiReturn);
478 apiReturn = pGetTcpStatistics(&stats);
479 ok(apiReturn == NO_ERROR,
480 "GetTcpStatistics returned %d, expected NO_ERROR\n", apiReturn);
481 if (apiReturn == NO_ERROR && winetest_debug > 1)
483 trace( "TCP stats:\n" );
484 trace( " dwRtoAlgorithm: %u\n", U(stats).dwRtoAlgorithm );
485 trace( " dwRtoMin: %u\n", stats.dwRtoMin );
486 trace( " dwRtoMax: %u\n", stats.dwRtoMax );
487 trace( " dwMaxConn: %u\n", stats.dwMaxConn );
488 trace( " dwActiveOpens: %u\n", stats.dwActiveOpens );
489 trace( " dwPassiveOpens: %u\n", stats.dwPassiveOpens );
490 trace( " dwAttemptFails: %u\n", stats.dwAttemptFails );
491 trace( " dwEstabResets: %u\n", stats.dwEstabResets );
492 trace( " dwCurrEstab: %u\n", stats.dwCurrEstab );
493 trace( " dwInSegs: %u\n", stats.dwInSegs );
494 trace( " dwOutSegs: %u\n", stats.dwOutSegs );
495 trace( " dwRetransSegs: %u\n", stats.dwRetransSegs );
496 trace( " dwInErrs: %u\n", stats.dwInErrs );
497 trace( " dwOutRsts: %u\n", stats.dwOutRsts );
498 trace( " dwNumConns: %u\n", stats.dwNumConns );
503 static void testGetUdpStatistics(void)
505 if (pGetUdpStatistics) {
506 DWORD apiReturn;
507 MIB_UDPSTATS stats;
509 apiReturn = pGetUdpStatistics(NULL);
510 if (apiReturn == ERROR_NOT_SUPPORTED) {
511 skip("GetUdpStatistics is not supported\n");
512 return;
514 ok(apiReturn == ERROR_INVALID_PARAMETER,
515 "GetUdpStatistics(NULL) returned %d, expected ERROR_INVALID_PARAMETER\n",
516 apiReturn);
517 apiReturn = pGetUdpStatistics(&stats);
518 ok(apiReturn == NO_ERROR,
519 "GetUdpStatistics returned %d, expected NO_ERROR\n", apiReturn);
520 if (apiReturn == NO_ERROR && winetest_debug > 1)
522 trace( "UDP stats:\n" );
523 trace( " dwInDatagrams: %u\n", stats.dwInDatagrams );
524 trace( " dwNoPorts: %u\n", stats.dwNoPorts );
525 trace( " dwInErrors: %u\n", stats.dwInErrors );
526 trace( " dwOutDatagrams: %u\n", stats.dwOutDatagrams );
527 trace( " dwNumAddrs: %u\n", stats.dwNumAddrs );
532 static void testGetIcmpStatisticsEx(void)
534 DWORD apiReturn;
535 MIB_ICMP_EX stats;
537 if (!pGetIcmpStatisticsEx)
539 win_skip( "GetIcmpStatisticsEx not available\n" );
540 return;
543 /* Crashes on Vista */
544 if (1) {
545 apiReturn = pGetIcmpStatisticsEx(NULL, AF_INET);
546 ok(apiReturn == ERROR_INVALID_PARAMETER,
547 "GetIcmpStatisticsEx(NULL, AF_INET) returned %d, expected ERROR_INVALID_PARAMETER\n", apiReturn);
550 apiReturn = pGetIcmpStatisticsEx(&stats, AF_BAN);
551 ok(apiReturn == ERROR_INVALID_PARAMETER,
552 "GetIcmpStatisticsEx(&stats, AF_BAN) returned %d, expected ERROR_INVALID_PARAMETER\n", apiReturn);
554 apiReturn = pGetIcmpStatisticsEx(&stats, AF_INET);
555 ok(apiReturn == NO_ERROR, "GetIcmpStatisticsEx returned %d, expected NO_ERROR\n", apiReturn);
556 if (apiReturn == NO_ERROR && winetest_debug > 1)
558 INT i;
559 trace( "ICMP IPv4 Ex stats: %8s %8s\n", "in", "out" );
560 trace( " dwMsgs: %8u %8u\n", stats.icmpInStats.dwMsgs, stats.icmpOutStats.dwMsgs );
561 trace( " dwErrors: %8u %8u\n", stats.icmpInStats.dwErrors, stats.icmpOutStats.dwErrors );
562 for (i = 0; i < 256; i++)
563 trace( " rgdwTypeCount[%3i]: %8u %8u\n", i, stats.icmpInStats.rgdwTypeCount[i], stats.icmpOutStats.rgdwTypeCount[i] );
566 apiReturn = pGetIcmpStatisticsEx(&stats, AF_INET6);
567 ok(apiReturn == NO_ERROR || broken(apiReturn == ERROR_NOT_SUPPORTED),
568 "GetIcmpStatisticsEx returned %d, expected NO_ERROR\n", apiReturn);
569 if (apiReturn == NO_ERROR && winetest_debug > 1)
571 INT i;
572 trace( "ICMP IPv6 Ex stats: %8s %8s\n", "in", "out" );
573 trace( " dwMsgs: %8u %8u\n", stats.icmpInStats.dwMsgs, stats.icmpOutStats.dwMsgs );
574 trace( " dwErrors: %8u %8u\n", stats.icmpInStats.dwErrors, stats.icmpOutStats.dwErrors );
575 for (i = 0; i < 256; i++)
576 trace( " rgdwTypeCount[%3i]: %8u %8u\n", i, stats.icmpInStats.rgdwTypeCount[i], stats.icmpOutStats.rgdwTypeCount[i] );
580 static void testGetIpStatisticsEx(void)
582 DWORD apiReturn;
583 MIB_IPSTATS stats;
585 if (!pGetIpStatisticsEx)
587 win_skip( "GetIpStatisticsEx not available\n" );
588 return;
591 apiReturn = pGetIpStatisticsEx(NULL, AF_INET);
592 ok(apiReturn == ERROR_INVALID_PARAMETER,
593 "GetIpStatisticsEx(NULL, AF_INET) returned %d, expected ERROR_INVALID_PARAMETER\n", apiReturn);
595 apiReturn = pGetIpStatisticsEx(&stats, AF_BAN);
596 ok(apiReturn == ERROR_INVALID_PARAMETER,
597 "GetIpStatisticsEx(&stats, AF_BAN) returned %d, expected ERROR_INVALID_PARAMETER\n", apiReturn);
599 apiReturn = pGetIpStatisticsEx(&stats, AF_INET);
600 ok(apiReturn == NO_ERROR, "GetIpStatisticsEx returned %d, expected NO_ERROR\n", apiReturn);
601 if (apiReturn == NO_ERROR && winetest_debug > 1)
603 trace( "IP IPv4 Ex stats:\n" );
604 trace( " dwForwarding: %u\n", U(stats).dwForwarding );
605 trace( " dwDefaultTTL: %u\n", stats.dwDefaultTTL );
606 trace( " dwInReceives: %u\n", stats.dwInReceives );
607 trace( " dwInHdrErrors: %u\n", stats.dwInHdrErrors );
608 trace( " dwInAddrErrors: %u\n", stats.dwInAddrErrors );
609 trace( " dwForwDatagrams: %u\n", stats.dwForwDatagrams );
610 trace( " dwInUnknownProtos: %u\n", stats.dwInUnknownProtos );
611 trace( " dwInDiscards: %u\n", stats.dwInDiscards );
612 trace( " dwInDelivers: %u\n", stats.dwInDelivers );
613 trace( " dwOutRequests: %u\n", stats.dwOutRequests );
614 trace( " dwRoutingDiscards: %u\n", stats.dwRoutingDiscards );
615 trace( " dwOutDiscards: %u\n", stats.dwOutDiscards );
616 trace( " dwOutNoRoutes: %u\n", stats.dwOutNoRoutes );
617 trace( " dwReasmTimeout: %u\n", stats.dwReasmTimeout );
618 trace( " dwReasmReqds: %u\n", stats.dwReasmReqds );
619 trace( " dwReasmOks: %u\n", stats.dwReasmOks );
620 trace( " dwReasmFails: %u\n", stats.dwReasmFails );
621 trace( " dwFragOks: %u\n", stats.dwFragOks );
622 trace( " dwFragFails: %u\n", stats.dwFragFails );
623 trace( " dwFragCreates: %u\n", stats.dwFragCreates );
624 trace( " dwNumIf: %u\n", stats.dwNumIf );
625 trace( " dwNumAddr: %u\n", stats.dwNumAddr );
626 trace( " dwNumRoutes: %u\n", stats.dwNumRoutes );
629 apiReturn = pGetIpStatisticsEx(&stats, AF_INET6);
630 ok(apiReturn == NO_ERROR || broken(apiReturn == ERROR_NOT_SUPPORTED),
631 "GetIpStatisticsEx returned %d, expected NO_ERROR\n", apiReturn);
632 if (apiReturn == NO_ERROR && winetest_debug > 1)
634 trace( "IP IPv6 Ex stats:\n" );
635 trace( " dwForwarding: %u\n", U(stats).dwForwarding );
636 trace( " dwDefaultTTL: %u\n", stats.dwDefaultTTL );
637 trace( " dwInReceives: %u\n", stats.dwInReceives );
638 trace( " dwInHdrErrors: %u\n", stats.dwInHdrErrors );
639 trace( " dwInAddrErrors: %u\n", stats.dwInAddrErrors );
640 trace( " dwForwDatagrams: %u\n", stats.dwForwDatagrams );
641 trace( " dwInUnknownProtos: %u\n", stats.dwInUnknownProtos );
642 trace( " dwInDiscards: %u\n", stats.dwInDiscards );
643 trace( " dwInDelivers: %u\n", stats.dwInDelivers );
644 trace( " dwOutRequests: %u\n", stats.dwOutRequests );
645 trace( " dwRoutingDiscards: %u\n", stats.dwRoutingDiscards );
646 trace( " dwOutDiscards: %u\n", stats.dwOutDiscards );
647 trace( " dwOutNoRoutes: %u\n", stats.dwOutNoRoutes );
648 trace( " dwReasmTimeout: %u\n", stats.dwReasmTimeout );
649 trace( " dwReasmReqds: %u\n", stats.dwReasmReqds );
650 trace( " dwReasmOks: %u\n", stats.dwReasmOks );
651 trace( " dwReasmFails: %u\n", stats.dwReasmFails );
652 trace( " dwFragOks: %u\n", stats.dwFragOks );
653 trace( " dwFragFails: %u\n", stats.dwFragFails );
654 trace( " dwFragCreates: %u\n", stats.dwFragCreates );
655 trace( " dwNumIf: %u\n", stats.dwNumIf );
656 trace( " dwNumAddr: %u\n", stats.dwNumAddr );
657 trace( " dwNumRoutes: %u\n", stats.dwNumRoutes );
661 static void testGetTcpStatisticsEx(void)
663 DWORD apiReturn;
664 MIB_TCPSTATS stats;
666 if (!pGetTcpStatisticsEx)
668 win_skip( "GetTcpStatisticsEx not available\n" );
669 return;
672 apiReturn = pGetTcpStatisticsEx(NULL, AF_INET);
673 ok(apiReturn == ERROR_INVALID_PARAMETER,
674 "GetTcpStatisticsEx(NULL, AF_INET); returned %d, expected ERROR_INVALID_PARAMETER\n", apiReturn);
676 apiReturn = pGetTcpStatisticsEx(&stats, AF_BAN);
677 ok(apiReturn == ERROR_INVALID_PARAMETER || apiReturn == ERROR_NOT_SUPPORTED,
678 "GetTcpStatisticsEx(&stats, AF_BAN) returned %d, expected ERROR_INVALID_PARAMETER\n", apiReturn);
680 apiReturn = pGetTcpStatisticsEx(&stats, AF_INET);
681 ok(apiReturn == NO_ERROR, "GetTcpStatisticsEx returned %d, expected NO_ERROR\n", apiReturn);
682 if (apiReturn == NO_ERROR && winetest_debug > 1)
684 trace( "TCP IPv4 Ex stats:\n" );
685 trace( " dwRtoAlgorithm: %u\n", U(stats).dwRtoAlgorithm );
686 trace( " dwRtoMin: %u\n", stats.dwRtoMin );
687 trace( " dwRtoMax: %u\n", stats.dwRtoMax );
688 trace( " dwMaxConn: %u\n", stats.dwMaxConn );
689 trace( " dwActiveOpens: %u\n", stats.dwActiveOpens );
690 trace( " dwPassiveOpens: %u\n", stats.dwPassiveOpens );
691 trace( " dwAttemptFails: %u\n", stats.dwAttemptFails );
692 trace( " dwEstabResets: %u\n", stats.dwEstabResets );
693 trace( " dwCurrEstab: %u\n", stats.dwCurrEstab );
694 trace( " dwInSegs: %u\n", stats.dwInSegs );
695 trace( " dwOutSegs: %u\n", stats.dwOutSegs );
696 trace( " dwRetransSegs: %u\n", stats.dwRetransSegs );
697 trace( " dwInErrs: %u\n", stats.dwInErrs );
698 trace( " dwOutRsts: %u\n", stats.dwOutRsts );
699 trace( " dwNumConns: %u\n", stats.dwNumConns );
702 apiReturn = pGetTcpStatisticsEx(&stats, AF_INET6);
703 todo_wine ok(apiReturn == NO_ERROR || broken(apiReturn == ERROR_NOT_SUPPORTED),
704 "GetTcpStatisticsEx returned %d, expected NO_ERROR\n", apiReturn);
705 if (apiReturn == NO_ERROR && winetest_debug > 1)
707 trace( "TCP IPv6 Ex stats:\n" );
708 trace( " dwRtoAlgorithm: %u\n", U(stats).dwRtoAlgorithm );
709 trace( " dwRtoMin: %u\n", stats.dwRtoMin );
710 trace( " dwRtoMax: %u\n", stats.dwRtoMax );
711 trace( " dwMaxConn: %u\n", stats.dwMaxConn );
712 trace( " dwActiveOpens: %u\n", stats.dwActiveOpens );
713 trace( " dwPassiveOpens: %u\n", stats.dwPassiveOpens );
714 trace( " dwAttemptFails: %u\n", stats.dwAttemptFails );
715 trace( " dwEstabResets: %u\n", stats.dwEstabResets );
716 trace( " dwCurrEstab: %u\n", stats.dwCurrEstab );
717 trace( " dwInSegs: %u\n", stats.dwInSegs );
718 trace( " dwOutSegs: %u\n", stats.dwOutSegs );
719 trace( " dwRetransSegs: %u\n", stats.dwRetransSegs );
720 trace( " dwInErrs: %u\n", stats.dwInErrs );
721 trace( " dwOutRsts: %u\n", stats.dwOutRsts );
722 trace( " dwNumConns: %u\n", stats.dwNumConns );
726 static void testGetUdpStatisticsEx(void)
728 DWORD apiReturn;
729 MIB_UDPSTATS stats;
731 if (!pGetUdpStatisticsEx)
733 win_skip( "GetUdpStatisticsEx not available\n" );
734 return;
737 apiReturn = pGetUdpStatisticsEx(NULL, AF_INET);
738 ok(apiReturn == ERROR_INVALID_PARAMETER,
739 "GetUdpStatisticsEx(NULL, AF_INET); returned %d, expected ERROR_INVALID_PARAMETER\n", apiReturn);
741 apiReturn = pGetUdpStatisticsEx(&stats, AF_BAN);
742 ok(apiReturn == ERROR_INVALID_PARAMETER || apiReturn == ERROR_NOT_SUPPORTED,
743 "GetUdpStatisticsEx(&stats, AF_BAN) returned %d, expected ERROR_INVALID_PARAMETER\n", apiReturn);
745 apiReturn = pGetUdpStatisticsEx(&stats, AF_INET);
746 ok(apiReturn == NO_ERROR, "GetUdpStatisticsEx returned %d, expected NO_ERROR\n", apiReturn);
747 if (apiReturn == NO_ERROR && winetest_debug > 1)
749 trace( "UDP IPv4 Ex stats:\n" );
750 trace( " dwInDatagrams: %u\n", stats.dwInDatagrams );
751 trace( " dwNoPorts: %u\n", stats.dwNoPorts );
752 trace( " dwInErrors: %u\n", stats.dwInErrors );
753 trace( " dwOutDatagrams: %u\n", stats.dwOutDatagrams );
754 trace( " dwNumAddrs: %u\n", stats.dwNumAddrs );
757 apiReturn = pGetUdpStatisticsEx(&stats, AF_INET6);
758 ok(apiReturn == NO_ERROR || broken(apiReturn == ERROR_NOT_SUPPORTED),
759 "GetUdpStatisticsEx returned %d, expected NO_ERROR\n", apiReturn);
760 if (apiReturn == NO_ERROR && winetest_debug > 1)
762 trace( "UDP IPv6 Ex stats:\n" );
763 trace( " dwInDatagrams: %u\n", stats.dwInDatagrams );
764 trace( " dwNoPorts: %u\n", stats.dwNoPorts );
765 trace( " dwInErrors: %u\n", stats.dwInErrors );
766 trace( " dwOutDatagrams: %u\n", stats.dwOutDatagrams );
767 trace( " dwNumAddrs: %u\n", stats.dwNumAddrs );
771 static void testGetTcpTable(void)
773 if (pGetTcpTable) {
774 DWORD apiReturn;
775 ULONG dwSize = 0;
777 apiReturn = pGetTcpTable(NULL, &dwSize, FALSE);
778 if (apiReturn == ERROR_NOT_SUPPORTED) {
779 skip("GetTcpTable is not supported\n");
780 return;
782 ok(apiReturn == ERROR_INSUFFICIENT_BUFFER ||
783 broken(apiReturn == ERROR_NO_DATA), /* win95 */
784 "GetTcpTable(NULL, &dwSize, FALSE) returned %d, expected ERROR_INSUFFICIENT_BUFFER\n",
785 apiReturn);
786 if (apiReturn == ERROR_INSUFFICIENT_BUFFER) {
787 PMIB_TCPTABLE buf = HeapAlloc(GetProcessHeap(), 0, dwSize);
789 apiReturn = pGetTcpTable(buf, &dwSize, FALSE);
790 ok(apiReturn == NO_ERROR,
791 "GetTcpTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n",
792 apiReturn);
794 if (apiReturn == NO_ERROR && winetest_debug > 1)
796 DWORD i;
797 trace( "TCP table: %u entries\n", buf->dwNumEntries );
798 for (i = 0; i < buf->dwNumEntries; i++)
800 char buffer[40];
801 sprintf( buffer, "local %s:%u",
802 ntoa(buf->table[i].dwLocalAddr), ntohs(buf->table[i].dwLocalPort) );
803 trace( "%u: %s remote %s:%u state %u\n",
804 i, buffer, ntoa( buf->table[i].dwRemoteAddr ),
805 ntohs(buf->table[i].dwRemotePort), U(buf->table[i]).dwState );
808 HeapFree(GetProcessHeap(), 0, buf);
813 static void testGetUdpTable(void)
815 if (pGetUdpTable) {
816 DWORD apiReturn;
817 ULONG dwSize = 0;
819 apiReturn = pGetUdpTable(NULL, &dwSize, FALSE);
820 if (apiReturn == ERROR_NOT_SUPPORTED) {
821 skip("GetUdpTable is not supported\n");
822 return;
824 ok(apiReturn == ERROR_INSUFFICIENT_BUFFER,
825 "GetUdpTable(NULL, &dwSize, FALSE) returned %d, expected ERROR_INSUFFICIENT_BUFFER\n",
826 apiReturn);
827 if (apiReturn == ERROR_INSUFFICIENT_BUFFER) {
828 PMIB_UDPTABLE buf = HeapAlloc(GetProcessHeap(), 0, dwSize);
830 apiReturn = pGetUdpTable(buf, &dwSize, FALSE);
831 ok(apiReturn == NO_ERROR,
832 "GetUdpTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n",
833 apiReturn);
835 if (apiReturn == NO_ERROR && winetest_debug > 1)
837 DWORD i;
838 trace( "UDP table: %u entries\n", buf->dwNumEntries );
839 for (i = 0; i < buf->dwNumEntries; i++)
840 trace( "%u: %s:%u\n",
841 i, ntoa( buf->table[i].dwLocalAddr ), ntohs(buf->table[i].dwLocalPort) );
843 HeapFree(GetProcessHeap(), 0, buf);
848 static void testSetTcpEntry(void)
850 DWORD ret;
851 MIB_TCPROW row;
853 memset(&row, 0, sizeof(row));
854 if(0) /* This test crashes in OS >= VISTA */
856 ret = pSetTcpEntry(NULL);
857 ok( ret == ERROR_INVALID_PARAMETER, "got %u, expected %u\n", ret, ERROR_INVALID_PARAMETER);
860 ret = pSetTcpEntry(&row);
861 if (ret == ERROR_NETWORK_ACCESS_DENIED)
863 win_skip("SetTcpEntry failed with access error. Skipping test.\n");
864 return;
866 todo_wine ok( ret == ERROR_INVALID_PARAMETER, "got %u, expected %u\n", ret, ERROR_INVALID_PARAMETER);
868 U(row).dwState = MIB_TCP_STATE_DELETE_TCB;
869 ret = pSetTcpEntry(&row);
870 todo_wine ok( ret == ERROR_MR_MID_NOT_FOUND || broken(ret == ERROR_INVALID_PARAMETER),
871 "got %u, expected %u\n", ret, ERROR_MR_MID_NOT_FOUND);
874 static void testIcmpSendEcho(void)
876 HANDLE icmp;
877 char senddata[32], replydata[sizeof(senddata) + sizeof(ICMP_ECHO_REPLY)];
878 DWORD ret, error, replysz = sizeof(replydata);
879 IPAddr address;
881 if (!pIcmpSendEcho || !pIcmpCreateFile)
883 win_skip( "IcmpSendEcho or IcmpCreateFile not available\n" );
884 return;
886 memset(senddata, 0, sizeof(senddata));
888 address = htonl(INADDR_LOOPBACK);
889 SetLastError(0xdeadbeef);
890 ret = pIcmpSendEcho(INVALID_HANDLE_VALUE, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
891 error = GetLastError();
892 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
893 todo_wine
894 ok (error == ERROR_INVALID_PARAMETER
895 || broken(error == ERROR_INVALID_HANDLE) /* <= 2003 */,
896 "expected 87, got %d\n", error);
898 icmp = pIcmpCreateFile();
899 if (icmp == INVALID_HANDLE_VALUE)
901 error = GetLastError();
902 if (error == ERROR_ACCESS_DENIED)
904 skip ("ICMP is not available.\n");
905 return;
908 ok (icmp != INVALID_HANDLE_VALUE, "IcmpCreateFile failed unexpectedly with error %d\n", GetLastError());
910 address = 0;
911 SetLastError(0xdeadbeef);
912 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
913 error = GetLastError();
914 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
915 ok (error == ERROR_INVALID_NETNAME
916 || broken(error == IP_BAD_DESTINATION) /* <= 2003 */,
917 "expected 1214, got %d\n", error);
919 address = htonl(INADDR_LOOPBACK);
920 if (0) /* crashes in XP */
922 ret = pIcmpSendEcho(icmp, address, NULL, sizeof(senddata), NULL, replydata, replysz, 1000);
923 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
926 SetLastError(0xdeadbeef);
927 ret = pIcmpSendEcho(icmp, address, senddata, 0, NULL, replydata, replysz, 1000);
928 error = GetLastError();
929 ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
931 SetLastError(0xdeadbeef);
932 ret = pIcmpSendEcho(icmp, address, NULL, 0, NULL, replydata, replysz, 1000);
933 error = GetLastError();
934 ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
936 if (0) /* crashes in wine, remove IF when fixed */
938 SetLastError(0xdeadbeef);
939 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, NULL, replysz, 1000);
940 error = GetLastError();
941 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
942 ok (error == ERROR_INVALID_PARAMETER, "expected 87, got %d\n", error);
945 SetLastError(0xdeadbeef);
946 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, 0, 1000);
947 error = GetLastError();
948 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
949 todo_wine
950 ok (error == ERROR_INVALID_PARAMETER
951 || broken(error == ERROR_INSUFFICIENT_BUFFER) /* <= 2003 */,
952 "expected 87, got %d\n", error);
954 SetLastError(0xdeadbeef);
955 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, NULL, 0, 1000);
956 error = GetLastError();
957 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
958 todo_wine
959 ok (error == ERROR_INVALID_PARAMETER
960 || broken(error == ERROR_INSUFFICIENT_BUFFER) /* <= 2003 */,
961 "expected 87, got %d\n", error);
963 SetLastError(0xdeadbeef);
964 replysz = sizeof(replydata) - 1;
965 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
966 error = GetLastError();
967 todo_wine {
968 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
969 ok (error == IP_GENERAL_FAILURE
970 || broken(error == IP_BUF_TOO_SMALL) /* <= 2003 */,
971 "expected 11050, got %d\n", error);
974 SetLastError(0xdeadbeef);
975 replysz = sizeof(ICMP_ECHO_REPLY);
976 ret = pIcmpSendEcho(icmp, address, senddata, 0, NULL, replydata, replysz, 1000);
977 error = GetLastError();
978 todo_wine
979 ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
981 SetLastError(0xdeadbeef);
982 replysz = sizeof(ICMP_ECHO_REPLY) + ICMP_MINLEN;
983 ret = pIcmpSendEcho(icmp, address, senddata, ICMP_MINLEN, NULL, replydata, replysz, 1000);
984 error = GetLastError();
985 todo_wine
986 ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
988 SetLastError(0xdeadbeef);
989 replysz = sizeof(ICMP_ECHO_REPLY) + ICMP_MINLEN;
990 ret = pIcmpSendEcho(icmp, address, senddata, ICMP_MINLEN + 1, NULL, replydata, replysz, 1000);
991 error = GetLastError();
992 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
993 todo_wine
994 ok (error == IP_GENERAL_FAILURE
995 || broken(error == IP_BUF_TOO_SMALL) /* <= 2003 */,
996 "expected 11050, got %d\n", error);
998 SetLastError(0xdeadbeef);
999 ret = pIcmpSendEcho(icmp, address, senddata, ICMP_MINLEN, NULL, replydata, replysz - 1, 1000);
1000 error = GetLastError();
1001 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
1002 todo_wine
1003 ok (error == IP_GENERAL_FAILURE
1004 || broken(error == IP_BUF_TOO_SMALL) /* <= 2003 */,
1005 "expected 11050, got %d\n", error);
1007 /* in windows >= vista the timeout can't be invalid */
1008 SetLastError(0xdeadbeef);
1009 replysz = sizeof(replydata);
1010 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, 0);
1011 error = GetLastError();
1012 if (!ret) ok(error == ERROR_INVALID_PARAMETER, "expected 87, got %d\n", error);
1014 SetLastError(0xdeadbeef);
1015 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, -1);
1016 error = GetLastError();
1017 if (!ret) ok(error == ERROR_INVALID_PARAMETER, "expected 87, got %d\n", error);
1019 /* real ping test */
1020 SetLastError(0xdeadbeef);
1021 address = htonl(INADDR_LOOPBACK);
1022 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
1023 error = GetLastError();
1024 if (ret)
1026 PICMP_ECHO_REPLY pong = (PICMP_ECHO_REPLY) replydata;
1027 trace ("ping roundtrip: %u ms\n", pong->RoundTripTime);
1029 else
1031 skip ("Failed to ping with error %d, is lo interface down?.\n", error);
1036 still-to-be-tested NT4-onward functions:
1037 CreateIpForwardEntry
1038 DeleteIpForwardEntry
1039 CreateIpNetEntry
1040 DeleteIpNetEntry
1041 GetFriendlyIfIndex
1042 GetRTTAndHopCount
1043 SetIfEntry
1044 SetIpForwardEntry
1045 SetIpNetEntry
1046 SetIpStatistics
1047 SetIpTTL
1049 static void testWinNT4Functions(void)
1051 testGetNumberOfInterfaces();
1052 testGetIpAddrTable();
1053 testGetIfTable();
1054 testGetIpForwardTable();
1055 testGetIpNetTable();
1056 testGetIcmpStatistics();
1057 testGetIpStatistics();
1058 testGetTcpStatistics();
1059 testGetUdpStatistics();
1060 testGetIcmpStatisticsEx();
1061 testGetIpStatisticsEx();
1062 testGetTcpStatisticsEx();
1063 testGetUdpStatisticsEx();
1064 testGetTcpTable();
1065 testGetUdpTable();
1066 testSetTcpEntry();
1067 testIcmpSendEcho();
1070 static void testGetInterfaceInfo(void)
1072 if (pGetInterfaceInfo) {
1073 DWORD apiReturn;
1074 ULONG len = 0;
1076 apiReturn = pGetInterfaceInfo(NULL, NULL);
1077 if (apiReturn == ERROR_NOT_SUPPORTED) {
1078 skip("GetInterfaceInfo is not supported\n");
1079 return;
1081 ok(apiReturn == ERROR_INVALID_PARAMETER,
1082 "GetInterfaceInfo returned %d, expected ERROR_INVALID_PARAMETER\n",
1083 apiReturn);
1084 apiReturn = pGetInterfaceInfo(NULL, &len);
1085 ok(apiReturn == ERROR_INSUFFICIENT_BUFFER,
1086 "GetInterfaceInfo returned %d, expected ERROR_INSUFFICIENT_BUFFER\n",
1087 apiReturn);
1088 if (apiReturn == ERROR_INSUFFICIENT_BUFFER) {
1089 PIP_INTERFACE_INFO buf = HeapAlloc(GetProcessHeap(), 0, len);
1091 apiReturn = pGetInterfaceInfo(buf, &len);
1092 ok(apiReturn == NO_ERROR,
1093 "GetInterfaceInfo(buf, &dwSize) returned %d, expected NO_ERROR\n",
1094 apiReturn);
1095 HeapFree(GetProcessHeap(), 0, buf);
1100 static void testGetAdaptersInfo(void)
1102 if (pGetAdaptersInfo) {
1103 DWORD apiReturn;
1104 ULONG len = 0;
1106 apiReturn = pGetAdaptersInfo(NULL, NULL);
1107 if (apiReturn == ERROR_NOT_SUPPORTED) {
1108 skip("GetAdaptersInfo is not supported\n");
1109 return;
1111 ok(apiReturn == ERROR_INVALID_PARAMETER,
1112 "GetAdaptersInfo returned %d, expected ERROR_INVALID_PARAMETER\n",
1113 apiReturn);
1114 apiReturn = pGetAdaptersInfo(NULL, &len);
1115 ok(apiReturn == ERROR_NO_DATA || apiReturn == ERROR_BUFFER_OVERFLOW,
1116 "GetAdaptersInfo returned %d, expected ERROR_NO_DATA or ERROR_BUFFER_OVERFLOW\n",
1117 apiReturn);
1118 if (apiReturn == ERROR_NO_DATA)
1119 ; /* no adapter's, that's okay */
1120 else if (apiReturn == ERROR_BUFFER_OVERFLOW) {
1121 PIP_ADAPTER_INFO buf = HeapAlloc(GetProcessHeap(), 0, len);
1123 apiReturn = pGetAdaptersInfo(buf, &len);
1124 ok(apiReturn == NO_ERROR,
1125 "GetAdaptersInfo(buf, &dwSize) returned %d, expected NO_ERROR\n",
1126 apiReturn);
1127 HeapFree(GetProcessHeap(), 0, buf);
1132 static void testGetNetworkParams(void)
1134 if (pGetNetworkParams) {
1135 DWORD apiReturn;
1136 ULONG len = 0;
1138 apiReturn = pGetNetworkParams(NULL, NULL);
1139 if (apiReturn == ERROR_NOT_SUPPORTED) {
1140 skip("GetNetworkParams is not supported\n");
1141 return;
1143 ok(apiReturn == ERROR_INVALID_PARAMETER,
1144 "GetNetworkParams returned %d, expected ERROR_INVALID_PARAMETER\n",
1145 apiReturn);
1146 apiReturn = pGetNetworkParams(NULL, &len);
1147 ok(apiReturn == ERROR_BUFFER_OVERFLOW,
1148 "GetNetworkParams returned %d, expected ERROR_BUFFER_OVERFLOW\n",
1149 apiReturn);
1150 if (apiReturn == ERROR_BUFFER_OVERFLOW) {
1151 PFIXED_INFO buf = HeapAlloc(GetProcessHeap(), 0, len);
1153 apiReturn = pGetNetworkParams(buf, &len);
1154 ok(apiReturn == NO_ERROR,
1155 "GetNetworkParams(buf, &dwSize) returned %d, expected NO_ERROR\n",
1156 apiReturn);
1157 HeapFree(GetProcessHeap(), 0, buf);
1163 still-to-be-tested 98-onward functions:
1164 GetBestInterface
1165 GetBestRoute
1166 IpReleaseAddress
1167 IpRenewAddress
1169 static DWORD CALLBACK testWin98Functions(void *p)
1171 testGetInterfaceInfo();
1172 testGetAdaptersInfo();
1173 testGetNetworkParams();
1174 return 0;
1177 static void testGetPerAdapterInfo(void)
1179 DWORD ret, needed;
1180 void *buffer;
1182 if (!pGetPerAdapterInfo) return;
1183 ret = pGetPerAdapterInfo(1, NULL, NULL);
1184 if (ret == ERROR_NOT_SUPPORTED) {
1185 skip("GetPerAdapterInfo is not supported\n");
1186 return;
1188 ok( ret == ERROR_INVALID_PARAMETER, "got %u instead of ERROR_INVALID_PARAMETER\n", ret );
1189 needed = 0xdeadbeef;
1190 ret = pGetPerAdapterInfo(1, NULL, &needed);
1191 if (ret == ERROR_NO_DATA) return; /* no such adapter */
1192 ok( ret == ERROR_BUFFER_OVERFLOW, "got %u instead of ERROR_BUFFER_OVERFLOW\n", ret );
1193 ok( needed != 0xdeadbeef, "needed not set\n" );
1194 buffer = HeapAlloc( GetProcessHeap(), 0, needed );
1195 ret = pGetPerAdapterInfo(1, buffer, &needed);
1196 ok( ret == NO_ERROR, "got %u instead of NO_ERROR\n", ret );
1197 HeapFree( GetProcessHeap(), 0, buffer );
1200 static void testNotifyAddrChange(void)
1202 DWORD ret, bytes;
1203 OVERLAPPED overlapped;
1204 HANDLE handle;
1205 BOOL success;
1207 if (!pNotifyAddrChange)
1209 win_skip("NotifyAddrChange not present\n");
1210 return;
1212 if (!pCancelIPChangeNotify)
1214 win_skip("CancelIPChangeNotify not present\n");
1215 return;
1218 handle = NULL;
1219 ZeroMemory(&overlapped, sizeof(overlapped));
1220 ret = pNotifyAddrChange(&handle, &overlapped);
1221 if (ret == ERROR_NOT_SUPPORTED)
1223 win_skip("NotifyAddrChange is not supported\n");
1224 return;
1226 ok(ret == ERROR_IO_PENDING, "NotifyAddrChange returned %d, expected ERROR_IO_PENDING\n", ret);
1227 ret = GetLastError();
1228 todo_wine ok(ret == ERROR_IO_PENDING, "GetLastError returned %d, expected ERROR_IO_PENDING\n", ret);
1229 success = pCancelIPChangeNotify(&overlapped);
1230 todo_wine ok(success == TRUE, "CancelIPChangeNotify returned FALSE, expected TRUE\n");
1232 ZeroMemory(&overlapped, sizeof(overlapped));
1233 success = pCancelIPChangeNotify(&overlapped);
1234 ok(success == FALSE, "CancelIPChangeNotify returned TRUE, expected FALSE\n");
1236 handle = NULL;
1237 ZeroMemory(&overlapped, sizeof(overlapped));
1238 overlapped.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
1239 ret = pNotifyAddrChange(&handle, &overlapped);
1240 ok(ret == ERROR_IO_PENDING, "NotifyAddrChange returned %d, expected ERROR_IO_PENDING\n", ret);
1241 todo_wine ok(handle != INVALID_HANDLE_VALUE, "NotifyAddrChange returned invalid file handle\n");
1242 success = GetOverlappedResult(handle, &overlapped, &bytes, FALSE);
1243 ok(success == FALSE, "GetOverlappedResult returned TRUE, expected FALSE\n");
1244 ret = GetLastError();
1245 ok(ret == ERROR_IO_INCOMPLETE, "GetLastError returned %d, expected ERROR_IO_INCOMPLETE\n", ret);
1246 success = pCancelIPChangeNotify(&overlapped);
1247 todo_wine ok(success == TRUE, "CancelIPChangeNotify returned FALSE, expected TRUE\n");
1249 if (winetest_interactive)
1251 handle = NULL;
1252 ZeroMemory(&overlapped, sizeof(overlapped));
1253 overlapped.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
1254 trace("Testing asynchronous ipv4 address change notification. Please "
1255 "change the ipv4 address of one of your network interfaces\n");
1256 ret = pNotifyAddrChange(&handle, &overlapped);
1257 ok(ret == ERROR_IO_PENDING, "NotifyAddrChange returned %d, expected NO_ERROR\n", ret);
1258 success = GetOverlappedResult(handle, &overlapped, &bytes, TRUE);
1259 ok(success == TRUE, "GetOverlappedResult returned FALSE, expected TRUE\n");
1262 /* test synchronous functionality */
1263 if (winetest_interactive)
1265 trace("Testing synchronous ipv4 address change notification. Please "
1266 "change the ipv4 address of one of your network interfaces\n");
1267 ret = pNotifyAddrChange(NULL, NULL);
1268 todo_wine ok(ret == NO_ERROR, "NotifyAddrChange returned %d, expected NO_ERROR\n", ret);
1273 still-to-be-tested 2K-onward functions:
1274 AddIPAddress
1275 CreateProxyArpEntry
1276 DeleteIPAddress
1277 DeleteProxyArpEntry
1278 EnableRouter
1279 FlushIpNetTable
1280 GetAdapterIndex
1281 NotifyRouteChange + CancelIPChangeNotify
1282 SendARP
1283 UnenableRouter
1285 static void testWin2KFunctions(void)
1287 testGetPerAdapterInfo();
1288 testNotifyAddrChange();
1291 static void test_GetAdaptersAddresses(void)
1293 ULONG ret, size;
1294 IP_ADAPTER_ADDRESSES *aa, *ptr;
1295 IP_ADAPTER_UNICAST_ADDRESS *ua;
1297 if (!pGetAdaptersAddresses)
1299 win_skip("GetAdaptersAddresses not present\n");
1300 return;
1303 ret = pGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, NULL);
1304 ok(ret == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", ret);
1306 /* size should be ignored and overwritten if buffer is NULL */
1307 size = 0x7fffffff;
1308 ret = pGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &size);
1309 ok(ret == ERROR_BUFFER_OVERFLOW, "expected ERROR_BUFFER_OVERFLOW, got %u\n", ret);
1310 if (ret != ERROR_BUFFER_OVERFLOW) return;
1312 ptr = HeapAlloc(GetProcessHeap(), 0, size);
1313 ret = pGetAdaptersAddresses(AF_UNSPEC, 0, NULL, ptr, &size);
1314 ok(!ret, "expected ERROR_SUCCESS got %u\n", ret);
1316 for (aa = ptr; !ret && aa; aa = aa->Next)
1318 ok(aa->DnsSuffix != NULL, "DnsSuffix is not a valid pointer\n");
1319 ok(aa->Description != NULL, "Description is not a valid pointer\n");
1320 ok(aa->FriendlyName != NULL, "FriendlyName is not a valid pointer\n");
1322 if (winetest_debug <= 1)
1323 continue;
1325 trace("Length: %u\n", S(U(*aa)).Length);
1326 trace("IfIndex: %u\n", S(U(*aa)).IfIndex);
1327 trace("Next: %p\n", aa->Next);
1328 trace("AdapterName: %s\n", aa->AdapterName);
1329 trace("FirstUnicastAddress: %p\n", aa->FirstUnicastAddress);
1330 ua = aa->FirstUnicastAddress;
1331 while (ua)
1333 trace("\tLength: %u\n", S(U(*ua)).Length);
1334 trace("\tFlags: 0x%08x\n", S(U(*ua)).Flags);
1335 trace("\tNext: %p\n", ua->Next);
1336 trace("\tAddress.lpSockaddr: %p\n", ua->Address.lpSockaddr);
1337 trace("\tAddress.iSockaddrLength: %d\n", ua->Address.iSockaddrLength);
1338 trace("\tPrefixOrigin: %u\n", ua->PrefixOrigin);
1339 trace("\tSuffixOrigin: %u\n", ua->SuffixOrigin);
1340 trace("\tDadState: %u\n", ua->DadState);
1341 trace("\tValidLifetime: 0x%08x\n", ua->ValidLifetime);
1342 trace("\tPreferredLifetime: 0x%08x\n", ua->PreferredLifetime);
1343 trace("\tLeaseLifetime: 0x%08x\n", ua->LeaseLifetime);
1344 trace("\n");
1345 ua = ua->Next;
1347 trace("FirstAnycastAddress: %p\n", aa->FirstAnycastAddress);
1348 trace("FirstMulticastAddress: %p\n", aa->FirstMulticastAddress);
1349 trace("FirstDnsServerAddress: %p\n", aa->FirstDnsServerAddress);
1350 trace("DnsSuffix: %p\n", aa->DnsSuffix);
1351 trace("Description: %p\n", aa->Description);
1352 trace("FriendlyName: %p\n", aa->FriendlyName);
1353 trace("PhysicalAddress: %02x\n", aa->PhysicalAddress[0]);
1354 trace("PhysicalAddressLength: %u\n", aa->PhysicalAddressLength);
1355 trace("Flags: 0x%08x\n", aa->Flags);
1356 trace("Mtu: %u\n", aa->Mtu);
1357 trace("IfType: %u\n", aa->IfType);
1358 trace("OperStatus: %u\n", aa->OperStatus);
1359 trace("\n");
1361 HeapFree(GetProcessHeap(), 0, ptr);
1364 static void test_GetExtendedTcpTable(void)
1366 DWORD ret, size;
1367 MIB_TCPTABLE *table;
1368 MIB_TCPTABLE_OWNER_PID *table_pid;
1369 MIB_TCPTABLE_OWNER_MODULE *table_module;
1371 if (!pGetExtendedTcpTable)
1373 win_skip("GetExtendedTcpTable not available\n");
1374 return;
1376 ret = pGetExtendedTcpTable( NULL, NULL, TRUE, AF_INET, TCP_TABLE_BASIC_ALL, 0 );
1377 ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
1379 size = 0;
1380 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_BASIC_ALL, 0 );
1381 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1383 table = HeapAlloc( GetProcessHeap(), 0, size );
1384 ret = pGetExtendedTcpTable( table, &size, TRUE, AF_INET, TCP_TABLE_BASIC_ALL, 0 );
1385 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1386 HeapFree( GetProcessHeap(), 0, table );
1388 size = 0;
1389 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_BASIC_LISTENER, 0 );
1390 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1392 table = HeapAlloc( GetProcessHeap(), 0, size );
1393 ret = pGetExtendedTcpTable( table, &size, TRUE, AF_INET, TCP_TABLE_BASIC_LISTENER, 0 );
1394 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1395 HeapFree( GetProcessHeap(), 0, table );
1397 size = 0;
1398 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0 );
1399 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1401 table_pid = HeapAlloc( GetProcessHeap(), 0, size );
1402 ret = pGetExtendedTcpTable( table_pid, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0 );
1403 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1404 HeapFree( GetProcessHeap(), 0, table_pid );
1406 size = 0;
1407 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0 );
1408 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1410 table_pid = HeapAlloc( GetProcessHeap(), 0, size );
1411 ret = pGetExtendedTcpTable( table_pid, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0 );
1412 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1413 HeapFree( GetProcessHeap(), 0, table_pid );
1415 size = 0;
1416 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0 );
1417 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1419 table_module = HeapAlloc( GetProcessHeap(), 0, size );
1420 ret = pGetExtendedTcpTable( table_module, &size, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0 );
1421 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1422 HeapFree( GetProcessHeap(), 0, table_module );
1424 size = 0;
1425 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_LISTENER, 0 );
1426 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1428 table_module = HeapAlloc( GetProcessHeap(), 0, size );
1429 ret = pGetExtendedTcpTable( table_module, &size, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_LISTENER, 0 );
1430 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1431 HeapFree( GetProcessHeap(), 0, table_module );
1434 static void test_GetExtendedUdpTable(void)
1436 DWORD ret, size;
1437 MIB_UDPTABLE *table;
1438 MIB_UDPTABLE_OWNER_PID *table_pid;
1439 MIB_UDPTABLE_OWNER_MODULE *table_module;
1441 if (!pGetExtendedUdpTable)
1443 win_skip("GetExtendedUdpTable not available\n");
1444 return;
1446 ret = pGetExtendedUdpTable( NULL, NULL, TRUE, AF_INET, UDP_TABLE_BASIC, 0 );
1447 ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
1449 size = 0;
1450 ret = pGetExtendedUdpTable( NULL, &size, TRUE, AF_INET, UDP_TABLE_BASIC, 0 );
1451 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1453 table = HeapAlloc( GetProcessHeap(), 0, size );
1454 ret = pGetExtendedUdpTable( table, &size, TRUE, AF_INET, UDP_TABLE_BASIC, 0 );
1455 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1456 HeapFree( GetProcessHeap(), 0, table );
1458 size = 0;
1459 ret = pGetExtendedUdpTable( NULL, &size, TRUE, AF_INET, UDP_TABLE_OWNER_PID, 0 );
1460 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1462 table_pid = HeapAlloc( GetProcessHeap(), 0, size );
1463 ret = pGetExtendedUdpTable( table_pid, &size, TRUE, AF_INET, UDP_TABLE_OWNER_PID, 0 );
1464 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1465 HeapFree( GetProcessHeap(), 0, table_pid );
1467 size = 0;
1468 ret = pGetExtendedUdpTable( NULL, &size, TRUE, AF_INET, UDP_TABLE_OWNER_MODULE, 0 );
1469 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1471 table_module = HeapAlloc( GetProcessHeap(), 0, size );
1472 ret = pGetExtendedUdpTable( table_module, &size, TRUE, AF_INET, UDP_TABLE_OWNER_MODULE, 0 );
1473 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1474 HeapFree( GetProcessHeap(), 0, table_module );
1477 START_TEST(iphlpapi)
1480 loadIPHlpApi();
1481 if (hLibrary) {
1482 HANDLE thread;
1484 testWin98OnlyFunctions();
1485 testWinNT4Functions();
1487 /* run testGetXXXX in two threads at once to make sure we don't crash in that case */
1488 thread = CreateThread(NULL, 0, testWin98Functions, NULL, 0, NULL);
1489 testWin98Functions(NULL);
1490 WaitForSingleObject(thread, INFINITE);
1492 testWin2KFunctions();
1493 test_GetAdaptersAddresses();
1494 test_GetExtendedTcpTable();
1495 test_GetExtendedUdpTable();
1496 freeIPHlpApi();