iphlpapi: Return error for IP address with value zero in IcmpSendEcho.
[wine.git] / dlls / iphlpapi / tests / iphlpapi.c
blob13a21c0bf8e5ff28cee1487db31661189d13df86
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 todo_wine ok( ret == ERROR_INVALID_PARAMETER, "got %u, expected %u\n", ret, ERROR_INVALID_PARAMETER);
863 U(row).dwState = MIB_TCP_STATE_DELETE_TCB;
864 ret = pSetTcpEntry(&row);
865 todo_wine ok( ret == ERROR_MR_MID_NOT_FOUND || broken(ret == ERROR_INVALID_PARAMETER),
866 "got %u, expected %u\n", ret, ERROR_MR_MID_NOT_FOUND);
869 static void testIcmpSendEcho(void)
871 HANDLE icmp;
872 char senddata[32], replydata[sizeof(senddata) + sizeof(ICMP_ECHO_REPLY)];
873 DWORD ret, error, replysz = sizeof(replydata);
874 IPAddr address;
876 if (!pIcmpSendEcho || !pIcmpCreateFile)
878 win_skip( "ImcpSendEcho or IcmpCreateFile not available\n" );
879 return;
881 memset(senddata, 0, sizeof(senddata));
883 address = htonl(INADDR_LOOPBACK);
884 SetLastError(0xdeadbeef);
885 ret = pIcmpSendEcho(INVALID_HANDLE_VALUE, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
886 error = GetLastError();
887 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
888 todo_wine
889 ok (error == ERROR_INVALID_PARAMETER
890 || broken(error == ERROR_INVALID_HANDLE) /* <= 2003 */,
891 "expected 87, got %d\n", error);
893 icmp = pIcmpCreateFile();
894 if (icmp == INVALID_HANDLE_VALUE)
896 error = GetLastError();
897 if (error == ERROR_ACCESS_DENIED)
899 skip ("ICMP is not available.\n");
900 return;
903 ok (icmp != INVALID_HANDLE_VALUE, "IcmpCreateFile failed unexpectedly with error %d\n", GetLastError());
905 address = 0;
906 SetLastError(0xdeadbeef);
907 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
908 error = GetLastError();
909 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
910 ok (error == ERROR_INVALID_NETNAME
911 || broken(error == IP_BAD_DESTINATION) /* <= 2003 */,
912 "expected 1214, got %d\n", error);
914 address = htonl(INADDR_LOOPBACK);
915 if (0) /* crashes in XP */
917 ret = pIcmpSendEcho(icmp, address, NULL, sizeof(senddata), NULL, replydata, replysz, 1000);
918 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
921 SetLastError(0xdeadbeef);
922 ret = pIcmpSendEcho(icmp, address, senddata, 0, NULL, replydata, replysz, 1000);
923 error = GetLastError();
924 ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
926 SetLastError(0xdeadbeef);
927 ret = pIcmpSendEcho(icmp, address, NULL, 0, NULL, replydata, replysz, 1000);
928 error = GetLastError();
929 ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
931 if (0) /* crashes in wine, remove IF when fixed */
933 SetLastError(0xdeadbeef);
934 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, NULL, replysz, 1000);
935 error = GetLastError();
936 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
937 ok (error == ERROR_INVALID_PARAMETER, "expected 87, got %d\n", error);
940 SetLastError(0xdeadbeef);
941 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, 0, 1000);
942 error = GetLastError();
943 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
944 todo_wine
945 ok (error == ERROR_INVALID_PARAMETER
946 || broken(error == ERROR_INSUFFICIENT_BUFFER) /* <= 2003 */,
947 "expected 87, got %d\n", error);
949 SetLastError(0xdeadbeef);
950 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, NULL, 0, 1000);
951 error = GetLastError();
952 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
953 todo_wine
954 ok (error == ERROR_INVALID_PARAMETER
955 || broken(error == ERROR_INSUFFICIENT_BUFFER) /* <= 2003 */,
956 "expected 87, got %d\n", error);
958 SetLastError(0xdeadbeef);
959 replysz = sizeof(replydata) - 1;
960 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
961 error = GetLastError();
962 todo_wine {
963 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
964 ok (error == IP_GENERAL_FAILURE
965 || broken(error == IP_BUF_TOO_SMALL) /* <= 2003 */,
966 "expected 11050, got %d\n", error);
969 SetLastError(0xdeadbeef);
970 replysz = sizeof(ICMP_ECHO_REPLY);
971 ret = pIcmpSendEcho(icmp, address, senddata, 0, NULL, replydata, replysz, 1000);
972 error = GetLastError();
973 todo_wine
974 ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
976 SetLastError(0xdeadbeef);
977 replysz = sizeof(ICMP_ECHO_REPLY) + ICMP_MINLEN;
978 ret = pIcmpSendEcho(icmp, address, senddata, ICMP_MINLEN, NULL, replydata, replysz, 1000);
979 error = GetLastError();
980 todo_wine
981 ok (ret, "IcmpSendEcho failed unexpectedly with error %d\n", error);
983 SetLastError(0xdeadbeef);
984 replysz = sizeof(ICMP_ECHO_REPLY) + ICMP_MINLEN;
985 ret = pIcmpSendEcho(icmp, address, senddata, ICMP_MINLEN + 1, NULL, replydata, replysz, 1000);
986 error = GetLastError();
987 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
988 todo_wine
989 ok (error == IP_GENERAL_FAILURE
990 || broken(error == IP_BUF_TOO_SMALL) /* <= 2003 */,
991 "expected 11050, got %d\n", error);
993 SetLastError(0xdeadbeef);
994 ret = pIcmpSendEcho(icmp, address, senddata, ICMP_MINLEN, NULL, replydata, replysz - 1, 1000);
995 error = GetLastError();
996 ok (!ret, "IcmpSendEcho succeeded unexpectedly\n");
997 todo_wine
998 ok (error == IP_GENERAL_FAILURE
999 || broken(error == IP_BUF_TOO_SMALL) /* <= 2003 */,
1000 "expected 11050, got %d\n", error);
1002 /* in windows >= vista the timeout can't be invalid */
1003 SetLastError(0xdeadbeef);
1004 replysz = sizeof(replydata);
1005 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, 0);
1006 error = GetLastError();
1007 if (!ret) ok(error == ERROR_INVALID_PARAMETER, "expected 87, got %d\n", error);
1009 SetLastError(0xdeadbeef);
1010 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, -1);
1011 error = GetLastError();
1012 if (!ret) ok(error == ERROR_INVALID_PARAMETER, "expected 87, got %d\n", error);
1014 /* real ping test */
1015 SetLastError(0xdeadbeef);
1016 address = htonl(INADDR_LOOPBACK);
1017 ret = pIcmpSendEcho(icmp, address, senddata, sizeof(senddata), NULL, replydata, replysz, 1000);
1018 error = GetLastError();
1019 if (ret)
1021 PICMP_ECHO_REPLY pong = (PICMP_ECHO_REPLY) replydata;
1022 trace ("ping roundtrip: %u ms\n", pong->RoundTripTime);
1024 else
1026 skip ("Failed to ping with error %d, is lo interface down?.\n", error);
1031 still-to-be-tested NT4-onward functions:
1032 CreateIpForwardEntry
1033 DeleteIpForwardEntry
1034 CreateIpNetEntry
1035 DeleteIpNetEntry
1036 GetFriendlyIfIndex
1037 GetRTTAndHopCount
1038 SetIfEntry
1039 SetIpForwardEntry
1040 SetIpNetEntry
1041 SetIpStatistics
1042 SetIpTTL
1044 static void testWinNT4Functions(void)
1046 testGetNumberOfInterfaces();
1047 testGetIpAddrTable();
1048 testGetIfTable();
1049 testGetIpForwardTable();
1050 testGetIpNetTable();
1051 testGetIcmpStatistics();
1052 testGetIpStatistics();
1053 testGetTcpStatistics();
1054 testGetUdpStatistics();
1055 testGetIcmpStatisticsEx();
1056 testGetIpStatisticsEx();
1057 testGetTcpStatisticsEx();
1058 testGetUdpStatisticsEx();
1059 testGetTcpTable();
1060 testGetUdpTable();
1061 testSetTcpEntry();
1062 testIcmpSendEcho();
1065 static void testGetInterfaceInfo(void)
1067 if (pGetInterfaceInfo) {
1068 DWORD apiReturn;
1069 ULONG len = 0;
1071 apiReturn = pGetInterfaceInfo(NULL, NULL);
1072 if (apiReturn == ERROR_NOT_SUPPORTED) {
1073 skip("GetInterfaceInfo is not supported\n");
1074 return;
1076 ok(apiReturn == ERROR_INVALID_PARAMETER,
1077 "GetInterfaceInfo returned %d, expected ERROR_INVALID_PARAMETER\n",
1078 apiReturn);
1079 apiReturn = pGetInterfaceInfo(NULL, &len);
1080 ok(apiReturn == ERROR_INSUFFICIENT_BUFFER,
1081 "GetInterfaceInfo returned %d, expected ERROR_INSUFFICIENT_BUFFER\n",
1082 apiReturn);
1083 if (apiReturn == ERROR_INSUFFICIENT_BUFFER) {
1084 PIP_INTERFACE_INFO buf = HeapAlloc(GetProcessHeap(), 0, len);
1086 apiReturn = pGetInterfaceInfo(buf, &len);
1087 ok(apiReturn == NO_ERROR,
1088 "GetInterfaceInfo(buf, &dwSize) returned %d, expected NO_ERROR\n",
1089 apiReturn);
1090 HeapFree(GetProcessHeap(), 0, buf);
1095 static void testGetAdaptersInfo(void)
1097 if (pGetAdaptersInfo) {
1098 DWORD apiReturn;
1099 ULONG len = 0;
1101 apiReturn = pGetAdaptersInfo(NULL, NULL);
1102 if (apiReturn == ERROR_NOT_SUPPORTED) {
1103 skip("GetAdaptersInfo is not supported\n");
1104 return;
1106 ok(apiReturn == ERROR_INVALID_PARAMETER,
1107 "GetAdaptersInfo returned %d, expected ERROR_INVALID_PARAMETER\n",
1108 apiReturn);
1109 apiReturn = pGetAdaptersInfo(NULL, &len);
1110 ok(apiReturn == ERROR_NO_DATA || apiReturn == ERROR_BUFFER_OVERFLOW,
1111 "GetAdaptersInfo returned %d, expected ERROR_NO_DATA or ERROR_BUFFER_OVERFLOW\n",
1112 apiReturn);
1113 if (apiReturn == ERROR_NO_DATA)
1114 ; /* no adapter's, that's okay */
1115 else if (apiReturn == ERROR_BUFFER_OVERFLOW) {
1116 PIP_ADAPTER_INFO buf = HeapAlloc(GetProcessHeap(), 0, len);
1118 apiReturn = pGetAdaptersInfo(buf, &len);
1119 ok(apiReturn == NO_ERROR,
1120 "GetAdaptersInfo(buf, &dwSize) returned %d, expected NO_ERROR\n",
1121 apiReturn);
1122 HeapFree(GetProcessHeap(), 0, buf);
1127 static void testGetNetworkParams(void)
1129 if (pGetNetworkParams) {
1130 DWORD apiReturn;
1131 ULONG len = 0;
1133 apiReturn = pGetNetworkParams(NULL, NULL);
1134 if (apiReturn == ERROR_NOT_SUPPORTED) {
1135 skip("GetNetworkParams is not supported\n");
1136 return;
1138 ok(apiReturn == ERROR_INVALID_PARAMETER,
1139 "GetNetworkParams returned %d, expected ERROR_INVALID_PARAMETER\n",
1140 apiReturn);
1141 apiReturn = pGetNetworkParams(NULL, &len);
1142 ok(apiReturn == ERROR_BUFFER_OVERFLOW,
1143 "GetNetworkParams returned %d, expected ERROR_BUFFER_OVERFLOW\n",
1144 apiReturn);
1145 if (apiReturn == ERROR_BUFFER_OVERFLOW) {
1146 PFIXED_INFO buf = HeapAlloc(GetProcessHeap(), 0, len);
1148 apiReturn = pGetNetworkParams(buf, &len);
1149 ok(apiReturn == NO_ERROR,
1150 "GetNetworkParams(buf, &dwSize) returned %d, expected NO_ERROR\n",
1151 apiReturn);
1152 HeapFree(GetProcessHeap(), 0, buf);
1158 still-to-be-tested 98-onward functions:
1159 GetBestInterface
1160 GetBestRoute
1161 IpReleaseAddress
1162 IpRenewAddress
1164 static DWORD CALLBACK testWin98Functions(void *p)
1166 testGetInterfaceInfo();
1167 testGetAdaptersInfo();
1168 testGetNetworkParams();
1169 return 0;
1172 static void testGetPerAdapterInfo(void)
1174 DWORD ret, needed;
1175 void *buffer;
1177 if (!pGetPerAdapterInfo) return;
1178 ret = pGetPerAdapterInfo(1, NULL, NULL);
1179 if (ret == ERROR_NOT_SUPPORTED) {
1180 skip("GetPerAdapterInfo is not supported\n");
1181 return;
1183 ok( ret == ERROR_INVALID_PARAMETER, "got %u instead of ERROR_INVALID_PARAMETER\n", ret );
1184 needed = 0xdeadbeef;
1185 ret = pGetPerAdapterInfo(1, NULL, &needed);
1186 if (ret == ERROR_NO_DATA) return; /* no such adapter */
1187 ok( ret == ERROR_BUFFER_OVERFLOW, "got %u instead of ERROR_BUFFER_OVERFLOW\n", ret );
1188 ok( needed != 0xdeadbeef, "needed not set\n" );
1189 buffer = HeapAlloc( GetProcessHeap(), 0, needed );
1190 ret = pGetPerAdapterInfo(1, buffer, &needed);
1191 ok( ret == NO_ERROR, "got %u instead of NO_ERROR\n", ret );
1192 HeapFree( GetProcessHeap(), 0, buffer );
1195 static void testNotifyAddrChange(void)
1197 DWORD ret, bytes;
1198 OVERLAPPED overlapped;
1199 HANDLE handle;
1200 BOOL success;
1202 if (!pNotifyAddrChange)
1204 win_skip("NotifyAddrChange not present\n");
1205 return;
1207 if (!pCancelIPChangeNotify)
1209 win_skip("CancelIPChangeNotify not present\n");
1210 return;
1213 handle = NULL;
1214 ZeroMemory(&overlapped, sizeof(overlapped));
1215 ret = pNotifyAddrChange(&handle, &overlapped);
1216 if (ret == ERROR_NOT_SUPPORTED)
1218 win_skip("NotifyAddrChange is not supported\n");
1219 return;
1221 ok(ret == ERROR_IO_PENDING, "NotifyAddrChange returned %d, expected ERROR_IO_PENDING\n", ret);
1222 ret = GetLastError();
1223 todo_wine ok(ret == ERROR_IO_PENDING, "GetLastError returned %d, expected ERROR_IO_PENDING\n", ret);
1224 success = pCancelIPChangeNotify(&overlapped);
1225 todo_wine ok(success == TRUE, "CancelIPChangeNotify returned FALSE, expected TRUE\n");
1227 ZeroMemory(&overlapped, sizeof(overlapped));
1228 success = pCancelIPChangeNotify(&overlapped);
1229 ok(success == FALSE, "CancelIPChangeNotify returned TRUE, expected FALSE\n");
1231 handle = NULL;
1232 ZeroMemory(&overlapped, sizeof(overlapped));
1233 overlapped.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
1234 ret = pNotifyAddrChange(&handle, &overlapped);
1235 ok(ret == ERROR_IO_PENDING, "NotifyAddrChange returned %d, expected ERROR_IO_PENDING\n", ret);
1236 todo_wine ok(handle != INVALID_HANDLE_VALUE, "NotifyAddrChange returned invalid file handle\n");
1237 success = GetOverlappedResult(handle, &overlapped, &bytes, FALSE);
1238 ok(success == FALSE, "GetOverlappedResult returned TRUE, expected FALSE\n");
1239 ret = GetLastError();
1240 ok(ret == ERROR_IO_INCOMPLETE, "GetLastError returned %d, expected ERROR_IO_INCOMPLETE\n", ret);
1241 success = pCancelIPChangeNotify(&overlapped);
1242 todo_wine ok(success == TRUE, "CancelIPChangeNotify returned FALSE, expected TRUE\n");
1244 if (winetest_interactive)
1246 handle = NULL;
1247 ZeroMemory(&overlapped, sizeof(overlapped));
1248 overlapped.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
1249 trace("Testing asynchronous ipv4 address change notification. Please "
1250 "change the ipv4 address of one of your network interfaces\n");
1251 ret = pNotifyAddrChange(&handle, &overlapped);
1252 ok(ret == ERROR_IO_PENDING, "NotifyAddrChange returned %d, expected NO_ERROR\n", ret);
1253 success = GetOverlappedResult(handle, &overlapped, &bytes, TRUE);
1254 ok(success == TRUE, "GetOverlappedResult returned FALSE, expected TRUE\n");
1257 /* test synchronous functionality */
1258 if (winetest_interactive)
1260 trace("Testing synchronous ipv4 address change notification. Please "
1261 "change the ipv4 address of one of your network interfaces\n");
1262 ret = pNotifyAddrChange(NULL, NULL);
1263 todo_wine ok(ret == NO_ERROR, "NotifyAddrChange returned %d, expected NO_ERROR\n", ret);
1268 still-to-be-tested 2K-onward functions:
1269 AddIPAddress
1270 CreateProxyArpEntry
1271 DeleteIPAddress
1272 DeleteProxyArpEntry
1273 EnableRouter
1274 FlushIpNetTable
1275 GetAdapterIndex
1276 NotifyRouteChange + CancelIPChangeNotify
1277 SendARP
1278 UnenableRouter
1280 static void testWin2KFunctions(void)
1282 testGetPerAdapterInfo();
1283 testNotifyAddrChange();
1286 static void test_GetAdaptersAddresses(void)
1288 ULONG ret, size;
1289 IP_ADAPTER_ADDRESSES *aa, *ptr;
1290 IP_ADAPTER_UNICAST_ADDRESS *ua;
1292 if (!pGetAdaptersAddresses)
1294 win_skip("GetAdaptersAddresses not present\n");
1295 return;
1298 ret = pGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, NULL);
1299 ok(ret == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", ret);
1301 /* size should be ignored and overwritten if buffer is NULL */
1302 size = 0x7fffffff;
1303 ret = pGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &size);
1304 ok(ret == ERROR_BUFFER_OVERFLOW, "expected ERROR_BUFFER_OVERFLOW, got %u\n", ret);
1305 if (ret != ERROR_BUFFER_OVERFLOW) return;
1307 ptr = HeapAlloc(GetProcessHeap(), 0, size);
1308 ret = pGetAdaptersAddresses(AF_UNSPEC, 0, NULL, ptr, &size);
1309 ok(!ret, "expected ERROR_SUCCESS got %u\n", ret);
1311 for (aa = ptr; !ret && aa; aa = aa->Next)
1313 ok(aa->DnsSuffix != NULL, "DnsSuffix is not a valid pointer\n");
1314 ok(aa->Description != NULL, "Description is not a valid pointer\n");
1315 ok(aa->FriendlyName != NULL, "FriendlyName is not a valid pointer\n");
1317 if (winetest_debug <= 1)
1318 continue;
1320 trace("Length: %u\n", S(U(*aa)).Length);
1321 trace("IfIndex: %u\n", S(U(*aa)).IfIndex);
1322 trace("Next: %p\n", aa->Next);
1323 trace("AdapterName: %s\n", aa->AdapterName);
1324 trace("FirstUnicastAddress: %p\n", aa->FirstUnicastAddress);
1325 ua = aa->FirstUnicastAddress;
1326 while (ua)
1328 trace("\tLength: %u\n", S(U(*ua)).Length);
1329 trace("\tFlags: 0x%08x\n", S(U(*ua)).Flags);
1330 trace("\tNext: %p\n", ua->Next);
1331 trace("\tAddress.lpSockaddr: %p\n", ua->Address.lpSockaddr);
1332 trace("\tAddress.iSockaddrLength: %d\n", ua->Address.iSockaddrLength);
1333 trace("\tPrefixOrigin: %u\n", ua->PrefixOrigin);
1334 trace("\tSuffixOrigin: %u\n", ua->SuffixOrigin);
1335 trace("\tDadState: %u\n", ua->DadState);
1336 trace("\tValidLifetime: 0x%08x\n", ua->ValidLifetime);
1337 trace("\tPreferredLifetime: 0x%08x\n", ua->PreferredLifetime);
1338 trace("\tLeaseLifetime: 0x%08x\n", ua->LeaseLifetime);
1339 trace("\n");
1340 ua = ua->Next;
1342 trace("FirstAnycastAddress: %p\n", aa->FirstAnycastAddress);
1343 trace("FirstMulticastAddress: %p\n", aa->FirstMulticastAddress);
1344 trace("FirstDnsServerAddress: %p\n", aa->FirstDnsServerAddress);
1345 trace("DnsSuffix: %p\n", aa->DnsSuffix);
1346 trace("Description: %p\n", aa->Description);
1347 trace("FriendlyName: %p\n", aa->FriendlyName);
1348 trace("PhysicalAddress: %02x\n", aa->PhysicalAddress[0]);
1349 trace("PhysicalAddressLength: %u\n", aa->PhysicalAddressLength);
1350 trace("Flags: 0x%08x\n", aa->Flags);
1351 trace("Mtu: %u\n", aa->Mtu);
1352 trace("IfType: %u\n", aa->IfType);
1353 trace("OperStatus: %u\n", aa->OperStatus);
1354 trace("\n");
1356 HeapFree(GetProcessHeap(), 0, ptr);
1359 static void test_GetExtendedTcpTable(void)
1361 DWORD ret, size;
1362 MIB_TCPTABLE *table;
1363 MIB_TCPTABLE_OWNER_PID *table_pid;
1364 MIB_TCPTABLE_OWNER_MODULE *table_module;
1366 if (!pGetExtendedTcpTable)
1368 win_skip("GetExtendedTcpTable not available\n");
1369 return;
1371 ret = pGetExtendedTcpTable( NULL, NULL, TRUE, AF_INET, TCP_TABLE_BASIC_ALL, 0 );
1372 ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
1374 size = 0;
1375 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_BASIC_ALL, 0 );
1376 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1378 table = HeapAlloc( GetProcessHeap(), 0, size );
1379 ret = pGetExtendedTcpTable( table, &size, TRUE, AF_INET, TCP_TABLE_BASIC_ALL, 0 );
1380 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1381 HeapFree( GetProcessHeap(), 0, table );
1383 size = 0;
1384 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_BASIC_LISTENER, 0 );
1385 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1387 table = HeapAlloc( GetProcessHeap(), 0, size );
1388 ret = pGetExtendedTcpTable( table, &size, TRUE, AF_INET, TCP_TABLE_BASIC_LISTENER, 0 );
1389 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1390 HeapFree( GetProcessHeap(), 0, table );
1392 size = 0;
1393 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0 );
1394 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1396 table_pid = HeapAlloc( GetProcessHeap(), 0, size );
1397 ret = pGetExtendedTcpTable( table_pid, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0 );
1398 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1399 HeapFree( GetProcessHeap(), 0, table_pid );
1401 size = 0;
1402 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0 );
1403 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1405 table_pid = HeapAlloc( GetProcessHeap(), 0, size );
1406 ret = pGetExtendedTcpTable( table_pid, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0 );
1407 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1408 HeapFree( GetProcessHeap(), 0, table_pid );
1410 size = 0;
1411 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0 );
1412 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1414 table_module = HeapAlloc( GetProcessHeap(), 0, size );
1415 ret = pGetExtendedTcpTable( table_module, &size, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0 );
1416 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1417 HeapFree( GetProcessHeap(), 0, table_module );
1419 size = 0;
1420 ret = pGetExtendedTcpTable( NULL, &size, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_LISTENER, 0 );
1421 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1423 table_module = HeapAlloc( GetProcessHeap(), 0, size );
1424 ret = pGetExtendedTcpTable( table_module, &size, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_LISTENER, 0 );
1425 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1426 HeapFree( GetProcessHeap(), 0, table_module );
1429 static void test_GetExtendedUdpTable(void)
1431 DWORD ret, size;
1432 MIB_UDPTABLE *table;
1433 MIB_UDPTABLE_OWNER_PID *table_pid;
1434 MIB_UDPTABLE_OWNER_MODULE *table_module;
1436 if (!pGetExtendedUdpTable)
1438 win_skip("GetExtendedUdpTable not available\n");
1439 return;
1441 ret = pGetExtendedUdpTable( NULL, NULL, TRUE, AF_INET, UDP_TABLE_BASIC, 0 );
1442 ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
1444 size = 0;
1445 ret = pGetExtendedUdpTable( NULL, &size, TRUE, AF_INET, UDP_TABLE_BASIC, 0 );
1446 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1448 table = HeapAlloc( GetProcessHeap(), 0, size );
1449 ret = pGetExtendedUdpTable( table, &size, TRUE, AF_INET, UDP_TABLE_BASIC, 0 );
1450 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1451 HeapFree( GetProcessHeap(), 0, table );
1453 size = 0;
1454 ret = pGetExtendedUdpTable( NULL, &size, TRUE, AF_INET, UDP_TABLE_OWNER_PID, 0 );
1455 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1457 table_pid = HeapAlloc( GetProcessHeap(), 0, size );
1458 ret = pGetExtendedUdpTable( table_pid, &size, TRUE, AF_INET, UDP_TABLE_OWNER_PID, 0 );
1459 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1460 HeapFree( GetProcessHeap(), 0, table_pid );
1462 size = 0;
1463 ret = pGetExtendedUdpTable( NULL, &size, TRUE, AF_INET, UDP_TABLE_OWNER_MODULE, 0 );
1464 ok( ret == ERROR_INSUFFICIENT_BUFFER, "got %u\n", ret );
1466 table_module = HeapAlloc( GetProcessHeap(), 0, size );
1467 ret = pGetExtendedUdpTable( table_module, &size, TRUE, AF_INET, UDP_TABLE_OWNER_MODULE, 0 );
1468 ok( ret == ERROR_SUCCESS, "got %u\n", ret );
1469 HeapFree( GetProcessHeap(), 0, table_module );
1472 START_TEST(iphlpapi)
1475 loadIPHlpApi();
1476 if (hLibrary) {
1477 HANDLE thread;
1479 testWin98OnlyFunctions();
1480 testWinNT4Functions();
1482 /* run testGetXXXX in two threads at once to make sure we don't crash in that case */
1483 thread = CreateThread(NULL, 0, testWin98Functions, NULL, 0, NULL);
1484 testWin98Functions(NULL);
1485 WaitForSingleObject(thread, INFINITE);
1487 testWin2KFunctions();
1488 test_GetAdaptersAddresses();
1489 test_GetExtendedTcpTable();
1490 test_GetExtendedUdpTable();
1491 freeIPHlpApi();