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>
12 #define NTOS_MODE_USER
13 #include <ndk/iofuncs.h>
14 #include <ndk/obfuncs.h>
15 #include <ndk/rtlfuncs.h>
17 static VOID
TestUM(IPAddr
* Source
, IPAddr
* Gateway
)
23 PIP_ADAPTER_ADDRESSES Addresses
, Current
;
24 PIP_ADAPTER_INFO Adapters
, CurrentA
;
26 Err
= SendARP(0, 0, NULL
, NULL
);
27 ok(Err
== ERROR_INVALID_PARAMETER
, "Expected error: ERROR_INVALID_PARAMETER. Got: %lx\n", Err
);
30 Err
= SendARP(0, 0, Hw
, &Size
);
31 ok(Err
== ERROR_GEN_FAILURE
, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err
);
34 Err
= SendARP(0, 0, Hw
, &Size
);
35 ok(Err
== ERROR_GEN_FAILURE
, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err
);
38 Err
= SendARP(0, 0, Hw
, &Size
);
39 ok(Err
== ERROR_GEN_FAILURE
, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err
);
41 Size
= sizeof(IP_ADAPTER_ADDRESSES
);
42 Addresses
= (PIP_ADAPTER_ADDRESSES
)malloc(Size
);
45 skip("Memory failure\n");
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
)
53 Addresses
= (PIP_ADAPTER_ADDRESSES
)malloc(Size
);
56 skip("Memory failure\n");
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
);
63 if (Err
!= ERROR_SUCCESS
)
65 skip("GetAdaptersAddresses() failure\n");
70 for (Current
= Addresses
; Current
; Current
= Current
->Next
)
72 PSOCKADDR_IN SockAddr
;
75 if (Current
->IfType
== IF_TYPE_SOFTWARE_LOOPBACK
)
78 if (Current
->OperStatus
!= IfOperStatusUp
)
81 if (!Current
->FirstUnicastAddress
)
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
;
88 trace("IP address found: %lu.%lu.%lu.%lu\n", IpAddr
& 0xFF, (IpAddr
>> 8) & 0xFF, (IpAddr
>> 16) & 0xFF, (IpAddr
>> 24) & 0xFF);
91 Err
= SendARP(IpAddr
, 0, Hw
, &Size
);
92 ok(Err
== ERROR_NO_SYSTEM_RESOURCES
, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err
);
95 Err
= SendARP(IpAddr
, 0, Hw
, &Size
);
96 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
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
);
105 Err
= SendARP(IpAddr
, IpAddr
, Hw
, &Size
);
106 ok(Err
== ERROR_NO_SYSTEM_RESOURCES
, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err
);
109 Err
= SendARP(IpAddr
, IpAddr
, Hw
, &Size
);
110 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
113 Err
= SendARP(IpAddr
, IpAddr
, Hw
, &Size
);
114 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
125 skip("No suitable interface found\n");
129 Size
= sizeof(IP_ADAPTER_INFO
);
130 Adapters
= (PIP_ADAPTER_INFO
)malloc(Size
);
133 skip("Memory failure\n");
137 Err
= GetAdaptersInfo(Adapters
, &Size
);
138 if (Err
== ERROR_BUFFER_OVERFLOW
)
141 Adapters
= (PIP_ADAPTER_INFO
)malloc(Size
);
144 skip("Memory failure\n");
148 Err
= GetAdaptersInfo(Adapters
, &Size
);
151 if (Err
!= ERROR_SUCCESS
)
153 skip("GetAdaptersInfo() failure\n");
159 for (CurrentA
= Adapters
; CurrentA
; CurrentA
= CurrentA
->Next
)
163 const CHAR
* Terminator
;
165 Status
= RtlIpv4StringToAddressA(CurrentA
->IpAddressList
.IpAddress
.String
, TRUE
, &Terminator
, (struct in_addr
*)&IpAddr
);
166 if (!NT_SUCCESS(Status
))
169 if (IpAddr
!= *Source
)
172 Status
= RtlIpv4StringToAddressA(CurrentA
->GatewayList
.IpAddress
.String
, TRUE
, &Terminator
, (struct in_addr
*)&IpAddr
);
173 if (NT_SUCCESS(Status
))
175 trace("Gateway found: %lu.%lu.%lu.%lu\n", IpAddr
& 0xFF, (IpAddr
>> 8) & 0xFF, (IpAddr
>> 16) & 0xFF, (IpAddr
>> 24) & 0xFF);
187 skip("No suitable gateway found\n");
192 Err
= SendARP(*Gateway
, *Source
, Hw
, &Size
);
193 ok(Err
== ERROR_GEN_FAILURE
, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err
);
196 Err
= SendARP(*Gateway
, *Source
, Hw
, &Size
);
197 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
200 Err
= SendARP(*Gateway
, *Source
, Hw
, &Size
);
201 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
204 Err
= SendARP(*Source
, *Gateway
, Hw
, &Size
);
205 ok(Err
== ERROR_NO_SYSTEM_RESOURCES
, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err
);
208 Err
= SendARP(*Source
, *Gateway
, Hw
, &Size
);
209 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
212 Err
= SendARP(*Source
, *Gateway
, Hw
, &Size
);
213 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
216 Err
= SendARP(*Gateway
, 0x08080808, Hw
, &Size
);
217 ok(Err
== ERROR_GEN_FAILURE
, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err
);
220 Err
= SendARP(*Gateway
, 0x08080808, Hw
, &Size
);
221 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
224 Err
= SendARP(*Gateway
, 0x08080808, Hw
, &Size
);
225 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
228 Err
= SendARP(*Source
, 0x08080808, Hw
, &Size
);
229 ok(Err
== ERROR_NO_SYSTEM_RESOURCES
, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err
);
232 Err
= SendARP(*Source
, 0x08080808, Hw
, &Size
);
233 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
236 Err
= SendARP(*Source
, 0x08080808, Hw
, &Size
);
237 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
240 static VOID
TestKM(IPAddr Source
, IPAddr Gateway
)
244 IO_STATUS_BLOCK IoStatusBlock
;
245 UNICODE_STRING DevName
= RTL_CONSTANT_STRING(L
"\\Device\\Ip");
246 OBJECT_ATTRIBUTES ObjectAttributes
;
251 InitializeObjectAttributes(&ObjectAttributes
,
253 OBJ_CASE_INSENSITIVE
,
257 Status
= NtCreateFile(&hDevice
, GENERIC_EXECUTE
, &ObjectAttributes
,
258 &IoStatusBlock
, 0, FILE_ATTRIBUTE_NORMAL
, FILE_SHARE_READ
| FILE_SHARE_WRITE
, FILE_OPEN_IF
,
260 if (!NT_SUCCESS(Status
))
262 skip("NtCreateFile() failed with status: %lx\n", Status
);
266 hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
269 skip("CreateEventW() with error: %lx\n", GetLastError());
270 CloseHandle(hDevice
);
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
)
279 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
280 Status
= IoStatusBlock
.Status
;
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
);
285 memset(Ip
, 0, sizeof(Ip
));
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
)
292 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
293 Status
= IoStatusBlock
.Status
;
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
);
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
)
304 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
305 Status
= IoStatusBlock
.Status
;
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
);
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
)
316 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
317 Status
= IoStatusBlock
.Status
;
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
);
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
)
328 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
329 Status
= IoStatusBlock
.Status
;
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
);
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
)
341 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
342 Status
= IoStatusBlock
.Status
;
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
);
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
)
353 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
354 Status
= IoStatusBlock
.Status
;
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
);
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
)
365 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
366 Status
= IoStatusBlock
.Status
;
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
);
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
)
377 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
378 Status
= IoStatusBlock
.Status
;
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
);
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
)
389 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
390 Status
= IoStatusBlock
.Status
;
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
);
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
)
401 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
402 Status
= IoStatusBlock
.Status
;
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
);
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
)
413 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
414 Status
= IoStatusBlock
.Status
;
416 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
417 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
425 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
426 Status
= IoStatusBlock
.Status
;
428 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
429 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
438 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
439 Status
= IoStatusBlock
.Status
;
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
);
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
)
450 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
451 Status
= IoStatusBlock
.Status
;
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
);
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
)
462 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
463 Status
= IoStatusBlock
.Status
;
465 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
466 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
474 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
475 Status
= IoStatusBlock
.Status
;
477 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
478 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
487 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
488 Status
= IoStatusBlock
.Status
;
490 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
491 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
495 skip("No suitable gateway found\n");
497 CloseHandle(hDevice
);
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
)
509 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
510 Status
= IoStatusBlock
.Status
;
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
);
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
)
521 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
522 Status
= IoStatusBlock
.Status
;
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
);
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
)
533 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
534 Status
= IoStatusBlock
.Status
;
536 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
537 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
545 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
546 Status
= IoStatusBlock
.Status
;
548 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
549 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
559 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
560 Status
= IoStatusBlock
.Status
;
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
);
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
)
571 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
572 Status
= IoStatusBlock
.Status
;
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
);
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
)
583 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
584 Status
= IoStatusBlock
.Status
;
586 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
587 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
595 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
596 Status
= IoStatusBlock
.Status
;
598 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
599 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
609 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
610 Status
= IoStatusBlock
.Status
;
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
);
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
)
621 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
622 Status
= IoStatusBlock
.Status
;
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
);
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
)
633 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
634 Status
= IoStatusBlock
.Status
;
636 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
637 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
645 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
646 Status
= IoStatusBlock
.Status
;
648 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
649 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
658 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
659 Status
= IoStatusBlock
.Status
;
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
);
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
)
670 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
671 Status
= IoStatusBlock
.Status
;
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
);
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
)
682 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
683 Status
= IoStatusBlock
.Status
;
685 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
686 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
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
)
694 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
695 Status
= IoStatusBlock
.Status
;
697 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
698 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
701 CloseHandle(hDevice
);
709 TestUM(&Source
, &Gateway
);
712 skip("No suitable interface found\n");
716 TestKM(Source
, Gateway
);