[IPHLPAPI_APITEST]
[reactos.git] / rostests / apitests / iphlpapi / SendARP.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for SendARP
5 * PROGRAMMER: Pierre Schweitzer <pierre@reactos.org>
6 */
7
8 #include <apitest.h>
9 #include <winsock2.h>
10 #include <iphlpapi.h>
11 #include <tcpioctl.h>
12 #define NTOS_MODE_USER
13 #include <ndk/iofuncs.h>
14 #include <ndk/obfuncs.h>
15 #include <ndk/rtlfuncs.h>
16
17 static VOID TestUM(IPAddr * Source, IPAddr * Gateway)
18 {
19 DWORD Err;
20 ULONG Hw[2];
21 DWORD Size;
22 BOOL Tested = FALSE;
23 PIP_ADAPTER_ADDRESSES Addresses, Current;
24 PIP_ADAPTER_INFO Adapters, CurrentA;
25
26 Err = SendARP(0, 0, NULL, NULL);
27 ok(Err == ERROR_INVALID_PARAMETER, "Expected error: ERROR_INVALID_PARAMETER. Got: %lx\n", Err);
28
29 Size = 4;
30 Err = SendARP(0, 0, Hw, &Size);
31 ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err);
32
33 Size = 6;
34 Err = SendARP(0, 0, Hw, &Size);
35 ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err);
36
37 Size = 8;
38 Err = SendARP(0, 0, Hw, &Size);
39 ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err);
40
41 Size = sizeof(IP_ADAPTER_ADDRESSES);
42 Addresses = (PIP_ADAPTER_ADDRESSES)malloc(Size);
43 if (!Addresses)
44 {
45 skip("Memory failure\n");
46 return;
47 }
48
49 Err = GetAdaptersAddresses(AF_INET, GAA_FLAG_SKIP_FRIENDLY_NAME | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST, NULL, Addresses, &Size);
50 if (Err == ERROR_BUFFER_OVERFLOW)
51 {
52 free(Addresses);
53 Addresses = (PIP_ADAPTER_ADDRESSES)malloc(Size);
54 if (!Addresses)
55 {
56 skip("Memory failure\n");
57 return;
58 }
59
60 Err = GetAdaptersAddresses(AF_INET, GAA_FLAG_SKIP_FRIENDLY_NAME | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST, NULL, Addresses, &Size);
61 }
62
63 if (Err != ERROR_SUCCESS)
64 {
65 skip("GetAdaptersAddresses() failure\n");
66 free(Addresses);
67 return;
68 }
69
70 for (Current = Addresses; Current; Current = Current->Next)
71 {
72 PSOCKADDR_IN SockAddr;
73 IPAddr IpAddr;
74
75 if (Current->IfType == IF_TYPE_SOFTWARE_LOOPBACK)
76 continue;
77
78 if (Current->OperStatus != IfOperStatusUp)
79 continue;
80
81 if (!Current->FirstUnicastAddress)
82 continue;
83
84 ok(Current->FirstUnicastAddress->Address.iSockaddrLength == sizeof(SOCKADDR_IN), "Unexpected length: %u\n", Current->FirstUnicastAddress->Address.iSockaddrLength);
85 SockAddr = (PSOCKADDR_IN)Current->FirstUnicastAddress->Address.lpSockaddr;
86 IpAddr = SockAddr->sin_addr.S_un.S_addr;
87
88 trace("IP address found: %lu.%lu.%lu.%lu\n", IpAddr & 0xFF, (IpAddr >> 8) & 0xFF, (IpAddr >> 16) & 0xFF, (IpAddr >> 24) & 0xFF);
89
90 Size = 4;
91 Err = SendARP(IpAddr, 0, Hw, &Size);
92 ok(Err == ERROR_NO_SYSTEM_RESOURCES, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err);
93
94 Size = 6;
95 Err = SendARP(IpAddr, 0, Hw, &Size);
96 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
97
98 Size = 8;
99 Err = SendARP(IpAddr, 0, Hw, &Size);
100 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
101 Err = SendARP(IpAddr, 0x08080808, Hw, &Size);
102 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
103
104 Size = 4;
105 Err = SendARP(IpAddr, IpAddr, Hw, &Size);
106 ok(Err == ERROR_NO_SYSTEM_RESOURCES, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err);
107
108 Size = 6;
109 Err = SendARP(IpAddr, IpAddr, Hw, &Size);
110 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
111
112 Size = 8;
113 Err = SendARP(IpAddr, IpAddr, Hw, &Size);
114 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
115
116 *Source = IpAddr;
117 Tested = TRUE;
118 break;
119 }
120
121 free(Addresses);
122
123 if (!Tested)
124 {
125 skip("No suitable interface found\n");
126 return;
127 }
128
129 Size = sizeof(IP_ADAPTER_INFO);
130 Adapters = (PIP_ADAPTER_INFO)malloc(Size);
131 if (!Adapters)
132 {
133 skip("Memory failure\n");
134 return;
135 }
136
137 Err = GetAdaptersInfo(Adapters, &Size);
138 if (Err == ERROR_BUFFER_OVERFLOW)
139 {
140 free(Adapters);
141 Adapters = (PIP_ADAPTER_INFO)malloc(Size);
142 if (!Adapters)
143 {
144 skip("Memory failure\n");
145 return;
146 }
147
148 Err = GetAdaptersInfo(Adapters, &Size);
149 }
150
151 if (Err != ERROR_SUCCESS)
152 {
153 skip("GetAdaptersInfo() failure\n");
154 free(Adapters);
155 return;
156 }
157
158 Tested = FALSE;
159 for (CurrentA = Adapters; CurrentA; CurrentA = CurrentA->Next)
160 {
161 IPAddr IpAddr;
162 NTSTATUS Status;
163 const CHAR * Terminator;
164
165 Status = RtlIpv4StringToAddressA(CurrentA->IpAddressList.IpAddress.String, TRUE, &Terminator, (struct in_addr *)&IpAddr);
166 if (!NT_SUCCESS(Status))
167 continue;
168
169 if (IpAddr != *Source)
170 continue;
171
172 Status = RtlIpv4StringToAddressA(CurrentA->GatewayList.IpAddress.String, TRUE, &Terminator, (struct in_addr *)&IpAddr);
173 if (NT_SUCCESS(Status))
174 {
175 trace("Gateway found: %lu.%lu.%lu.%lu\n", IpAddr & 0xFF, (IpAddr >> 8) & 0xFF, (IpAddr >> 16) & 0xFF, (IpAddr >> 24) & 0xFF);
176 Tested = TRUE;
177 *Gateway = IpAddr;
178 }
179
180 break;
181 }
182
183 free(Adapters);
184
185 if (!Tested)
186 {
187 skip("No suitable gateway found\n");
188 return;
189 }
190
191 Size = 4;
192 Err = SendARP(*Gateway, *Source, Hw, &Size);
193 ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err);
194
195 Size = 6;
196 Err = SendARP(*Gateway, *Source, Hw, &Size);
197 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
198
199 Size = 8;
200 Err = SendARP(*Gateway, *Source, Hw, &Size);
201 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
202
203 Size = 4;
204 Err = SendARP(*Source, *Gateway, Hw, &Size);
205 ok(Err == ERROR_NO_SYSTEM_RESOURCES, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err);
206
207 Size = 6;
208 Err = SendARP(*Source, *Gateway, Hw, &Size);
209 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
210
211 Size = 8;
212 Err = SendARP(*Source, *Gateway, Hw, &Size);
213 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
214
215 Size = 4;
216 Err = SendARP(*Gateway, 0x08080808, Hw, &Size);
217 ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err);
218
219 Size = 6;
220 Err = SendARP(*Gateway, 0x08080808, Hw, &Size);
221 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
222
223 Size = 8;
224 Err = SendARP(*Gateway, 0x08080808, Hw, &Size);
225 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
226
227 Size = 4;
228 Err = SendARP(*Source, 0x08080808, Hw, &Size);
229 ok(Err == ERROR_NO_SYSTEM_RESOURCES, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err);
230
231 Size = 6;
232 Err = SendARP(*Source, 0x08080808, Hw, &Size);
233 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
234
235 Size = 8;
236 Err = SendARP(*Source, 0x08080808, Hw, &Size);
237 ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
238 }
239
240 static VOID TestKM(IPAddr Source, IPAddr Gateway)
241 {
242 HANDLE hDevice;
243 NTSTATUS Status;
244 IO_STATUS_BLOCK IoStatusBlock;
245 UNICODE_STRING DevName = RTL_CONSTANT_STRING(L"\\Device\\Ip");
246 OBJECT_ATTRIBUTES ObjectAttributes;
247 HANDLE hEvent;
248 ULONG Hw[2];
249 ULONG Ip[2];
250
251 InitializeObjectAttributes(&ObjectAttributes,
252 &DevName,
253 OBJ_CASE_INSENSITIVE,
254 NULL,
255 NULL);
256
257 Status = NtCreateFile(&hDevice, GENERIC_EXECUTE, &ObjectAttributes,
258 &IoStatusBlock, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF,
259 0, NULL, 0);
260 if (!NT_SUCCESS(Status))
261 {
262 skip("NtCreateFile() failed with status: %lx\n", Status);
263 return;
264 }
265
266 hEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
267 if (!hEvent)
268 {
269 skip("CreateEventW() with error: %lx\n", GetLastError());
270 CloseHandle(hDevice);
271 return;
272 }
273
274 IoStatusBlock.Status = STATUS_SUCCESS;
275 IoStatusBlock.Information = 0;
276 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, NULL, 0, NULL, 0);
277 if (Status == STATUS_PENDING)
278 {
279 NtWaitForSingleObject(hEvent, FALSE, NULL);
280 Status = IoStatusBlock.Status;
281 }
282 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
283 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
284
285 memset(Ip, 0, sizeof(Ip));
286 ResetEvent(hEvent);
287 IoStatusBlock.Status = STATUS_SUCCESS;
288 IoStatusBlock.Information = 0;
289 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0);
290 if (Status == STATUS_PENDING)
291 {
292 NtWaitForSingleObject(hEvent, FALSE, NULL);
293 Status = IoStatusBlock.Status;
294 }
295 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
296 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
297
298 ResetEvent(hEvent);
299 IoStatusBlock.Status = STATUS_SUCCESS;
300 IoStatusBlock.Information = 0;
301 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4);
302 if (Status == STATUS_PENDING)
303 {
304 NtWaitForSingleObject(hEvent, FALSE, NULL);
305 Status = IoStatusBlock.Status;
306 }
307 ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
308 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
309
310 ResetEvent(hEvent);
311 IoStatusBlock.Status = STATUS_SUCCESS;
312 IoStatusBlock.Information = 0;
313 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6);
314 if (Status == STATUS_PENDING)
315 {
316 NtWaitForSingleObject(hEvent, FALSE, NULL);
317 Status = IoStatusBlock.Status;
318 }
319 ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
320 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
321
322 ResetEvent(hEvent);
323 IoStatusBlock.Status = STATUS_SUCCESS;
324 IoStatusBlock.Information = 0;
325 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8);
326 if (Status == STATUS_PENDING)
327 {
328 NtWaitForSingleObject(hEvent, FALSE, NULL);
329 Status = IoStatusBlock.Status;
330 }
331 ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
332 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
333
334 Ip[0] = Source;
335 ResetEvent(hEvent);
336 IoStatusBlock.Status = STATUS_SUCCESS;
337 IoStatusBlock.Information = 0;
338 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip[0]), NULL, 0);
339 if (Status == STATUS_PENDING)
340 {
341 NtWaitForSingleObject(hEvent, FALSE, NULL);
342 Status = IoStatusBlock.Status;
343 }
344 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
345 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
346
347 ResetEvent(hEvent);
348 IoStatusBlock.Status = STATUS_SUCCESS;
349 IoStatusBlock.Information = 0;
350 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip[0]), Hw, 4);
351 if (Status == STATUS_PENDING)
352 {
353 NtWaitForSingleObject(hEvent, FALSE, NULL);
354 Status = IoStatusBlock.Status;
355 }
356 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
357 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
358
359 ResetEvent(hEvent);
360 IoStatusBlock.Status = STATUS_SUCCESS;
361 IoStatusBlock.Information = 0;
362 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip[0]), Hw, 6);
363 if (Status == STATUS_PENDING)
364 {
365 NtWaitForSingleObject(hEvent, FALSE, NULL);
366 Status = IoStatusBlock.Status;
367 }
368 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
369 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
370
371 ResetEvent(hEvent);
372 IoStatusBlock.Status = STATUS_SUCCESS;
373 IoStatusBlock.Information = 0;
374 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip[0]), Hw, 8);
375 if (Status == STATUS_PENDING)
376 {
377 NtWaitForSingleObject(hEvent, FALSE, NULL);
378 Status = IoStatusBlock.Status;
379 }
380 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
381 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
382
383 ResetEvent(hEvent);
384 IoStatusBlock.Status = STATUS_SUCCESS;
385 IoStatusBlock.Information = 0;
386 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0);
387 if (Status == STATUS_PENDING)
388 {
389 NtWaitForSingleObject(hEvent, FALSE, NULL);
390 Status = IoStatusBlock.Status;
391 }
392 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
393 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
394
395 ResetEvent(hEvent);
396 IoStatusBlock.Status = STATUS_SUCCESS;
397 IoStatusBlock.Information = 0;
398 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4);
399 if (Status == STATUS_PENDING)
400 {
401 NtWaitForSingleObject(hEvent, FALSE, NULL);
402 Status = IoStatusBlock.Status;
403 }
404 ok(Status == STATUS_INSUFFICIENT_RESOURCES, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
405 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
406
407 ResetEvent(hEvent);
408 IoStatusBlock.Status = STATUS_SUCCESS;
409 IoStatusBlock.Information = 0;
410 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6);
411 if (Status == STATUS_PENDING)
412 {
413 NtWaitForSingleObject(hEvent, FALSE, NULL);
414 Status = IoStatusBlock.Status;
415 }
416 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
417 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
418
419 ResetEvent(hEvent);
420 IoStatusBlock.Status = STATUS_SUCCESS;
421 IoStatusBlock.Information = 0;
422 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8);
423 if (Status == STATUS_PENDING)
424 {
425 NtWaitForSingleObject(hEvent, FALSE, NULL);
426 Status = IoStatusBlock.Status;
427 }
428 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
429 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
430
431 Ip[1] = Source;
432 ResetEvent(hEvent);
433 IoStatusBlock.Status = STATUS_SUCCESS;
434 IoStatusBlock.Information = 0;
435 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0);
436 if (Status == STATUS_PENDING)
437 {
438 NtWaitForSingleObject(hEvent, FALSE, NULL);
439 Status = IoStatusBlock.Status;
440 }
441 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
442 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
443
444 ResetEvent(hEvent);
445 IoStatusBlock.Status = STATUS_SUCCESS;
446 IoStatusBlock.Information = 0;
447 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4);
448 if (Status == STATUS_PENDING)
449 {
450 NtWaitForSingleObject(hEvent, FALSE, NULL);
451 Status = IoStatusBlock.Status;
452 }
453 ok(Status == STATUS_INSUFFICIENT_RESOURCES, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
454 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
455
456 ResetEvent(hEvent);
457 IoStatusBlock.Status = STATUS_SUCCESS;
458 IoStatusBlock.Information = 0;
459 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6);
460 if (Status == STATUS_PENDING)
461 {
462 NtWaitForSingleObject(hEvent, FALSE, NULL);
463 Status = IoStatusBlock.Status;
464 }
465 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
466 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
467
468 ResetEvent(hEvent);
469 IoStatusBlock.Status = STATUS_SUCCESS;
470 IoStatusBlock.Information = 0;
471 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8);
472 if (Status == STATUS_PENDING)
473 {
474 NtWaitForSingleObject(hEvent, FALSE, NULL);
475 Status = IoStatusBlock.Status;
476 }
477 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
478 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
479
480 Ip[1] = 0x08080808;
481 ResetEvent(hEvent);
482 IoStatusBlock.Status = STATUS_SUCCESS;
483 IoStatusBlock.Information = 0;
484 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8);
485 if (Status == STATUS_PENDING)
486 {
487 NtWaitForSingleObject(hEvent, FALSE, NULL);
488 Status = IoStatusBlock.Status;
489 }
490 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
491 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
492
493 if (!Gateway)
494 {
495 skip("No suitable gateway found\n");
496 CloseHandle(hEvent);
497 CloseHandle(hDevice);
498 return;
499 }
500
501 Ip[0] = Gateway;
502 Ip[1] = Source;
503 ResetEvent(hEvent);
504 IoStatusBlock.Status = STATUS_SUCCESS;
505 IoStatusBlock.Information = 0;
506 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0);
507 if (Status == STATUS_PENDING)
508 {
509 NtWaitForSingleObject(hEvent, FALSE, NULL);
510 Status = IoStatusBlock.Status;
511 }
512 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
513 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
514
515 ResetEvent(hEvent);
516 IoStatusBlock.Status = STATUS_SUCCESS;
517 IoStatusBlock.Information = 0;
518 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4);
519 if (Status == STATUS_PENDING)
520 {
521 NtWaitForSingleObject(hEvent, FALSE, NULL);
522 Status = IoStatusBlock.Status;
523 }
524 ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
525 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
526
527 ResetEvent(hEvent);
528 IoStatusBlock.Status = STATUS_SUCCESS;
529 IoStatusBlock.Information = 0;
530 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6);
531 if (Status == STATUS_PENDING)
532 {
533 NtWaitForSingleObject(hEvent, FALSE, NULL);
534 Status = IoStatusBlock.Status;
535 }
536 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
537 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
538
539 ResetEvent(hEvent);
540 IoStatusBlock.Status = STATUS_SUCCESS;
541 IoStatusBlock.Information = 0;
542 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8);
543 if (Status == STATUS_PENDING)
544 {
545 NtWaitForSingleObject(hEvent, FALSE, NULL);
546 Status = IoStatusBlock.Status;
547 }
548 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
549 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
550
551 Ip[0] = Source;
552 Ip[1] = Gateway;
553 ResetEvent(hEvent);
554 IoStatusBlock.Status = STATUS_SUCCESS;
555 IoStatusBlock.Information = 0;
556 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0);
557 if (Status == STATUS_PENDING)
558 {
559 NtWaitForSingleObject(hEvent, FALSE, NULL);
560 Status = IoStatusBlock.Status;
561 }
562 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
563 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
564
565 ResetEvent(hEvent);
566 IoStatusBlock.Status = STATUS_SUCCESS;
567 IoStatusBlock.Information = 0;
568 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4);
569 if (Status == STATUS_PENDING)
570 {
571 NtWaitForSingleObject(hEvent, FALSE, NULL);
572 Status = IoStatusBlock.Status;
573 }
574 ok(Status == STATUS_INSUFFICIENT_RESOURCES, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
575 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
576
577 ResetEvent(hEvent);
578 IoStatusBlock.Status = STATUS_SUCCESS;
579 IoStatusBlock.Information = 0;
580 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6);
581 if (Status == STATUS_PENDING)
582 {
583 NtWaitForSingleObject(hEvent, FALSE, NULL);
584 Status = IoStatusBlock.Status;
585 }
586 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
587 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
588
589 ResetEvent(hEvent);
590 IoStatusBlock.Status = STATUS_SUCCESS;
591 IoStatusBlock.Information = 0;
592 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8);
593 if (Status == STATUS_PENDING)
594 {
595 NtWaitForSingleObject(hEvent, FALSE, NULL);
596 Status = IoStatusBlock.Status;
597 }
598 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
599 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
600
601 Ip[0] = Gateway;
602 Ip[1] = 0x08080808;
603 ResetEvent(hEvent);
604 IoStatusBlock.Status = STATUS_SUCCESS;
605 IoStatusBlock.Information = 0;
606 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0);
607 if (Status == STATUS_PENDING)
608 {
609 NtWaitForSingleObject(hEvent, FALSE, NULL);
610 Status = IoStatusBlock.Status;
611 }
612 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
613 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
614
615 ResetEvent(hEvent);
616 IoStatusBlock.Status = STATUS_SUCCESS;
617 IoStatusBlock.Information = 0;
618 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4);
619 if (Status == STATUS_PENDING)
620 {
621 NtWaitForSingleObject(hEvent, FALSE, NULL);
622 Status = IoStatusBlock.Status;
623 }
624 ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
625 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
626
627 ResetEvent(hEvent);
628 IoStatusBlock.Status = STATUS_SUCCESS;
629 IoStatusBlock.Information = 0;
630 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6);
631 if (Status == STATUS_PENDING)
632 {
633 NtWaitForSingleObject(hEvent, FALSE, NULL);
634 Status = IoStatusBlock.Status;
635 }
636 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
637 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
638
639 ResetEvent(hEvent);
640 IoStatusBlock.Status = STATUS_SUCCESS;
641 IoStatusBlock.Information = 0;
642 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8);
643 if (Status == STATUS_PENDING)
644 {
645 NtWaitForSingleObject(hEvent, FALSE, NULL);
646 Status = IoStatusBlock.Status;
647 }
648 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
649 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
650
651 Ip[0] = Source;
652 ResetEvent(hEvent);
653 IoStatusBlock.Status = STATUS_SUCCESS;
654 IoStatusBlock.Information = 0;
655 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0);
656 if (Status == STATUS_PENDING)
657 {
658 NtWaitForSingleObject(hEvent, FALSE, NULL);
659 Status = IoStatusBlock.Status;
660 }
661 ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
662 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
663
664 ResetEvent(hEvent);
665 IoStatusBlock.Status = STATUS_SUCCESS;
666 IoStatusBlock.Information = 0;
667 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4);
668 if (Status == STATUS_PENDING)
669 {
670 NtWaitForSingleObject(hEvent, FALSE, NULL);
671 Status = IoStatusBlock.Status;
672 }
673 ok(Status == STATUS_INSUFFICIENT_RESOURCES, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status);
674 ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
675
676 ResetEvent(hEvent);
677 IoStatusBlock.Status = STATUS_SUCCESS;
678 IoStatusBlock.Information = 0;
679 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6);
680 if (Status == STATUS_PENDING)
681 {
682 NtWaitForSingleObject(hEvent, FALSE, NULL);
683 Status = IoStatusBlock.Status;
684 }
685 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
686 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
687
688 ResetEvent(hEvent);
689 IoStatusBlock.Status = STATUS_SUCCESS;
690 IoStatusBlock.Information = 0;
691 Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8);
692 if (Status == STATUS_PENDING)
693 {
694 NtWaitForSingleObject(hEvent, FALSE, NULL);
695 Status = IoStatusBlock.Status;
696 }
697 ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status);
698 ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
699
700 CloseHandle(hEvent);
701 CloseHandle(hDevice);
702 }
703
704 START_TEST(SendARP)
705 {
706 IPAddr Source = 0;
707 IPAddr Gateway = 0;
708
709 TestUM(&Source, &Gateway);
710 if (!Source)
711 {
712 skip("No suitable interface found\n");
713 return;
714 }
715
716 TestKM(Source, Gateway);
717 }