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
)
23 PIP_ADAPTER_ADDRESSES Addresses
, Current
;
25 Err
= SendARP(0, 0, NULL
, NULL
);
26 ok(Err
== ERROR_INVALID_PARAMETER
, "Expected error: ERROR_INVALID_PARAMETER. Got: %lx\n", Err
);
29 Err
= SendARP(0, 0, Hw
, &Size
);
30 ok(Err
== ERROR_GEN_FAILURE
, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err
);
33 Err
= SendARP(0, 0, Hw
, &Size
);
34 ok(Err
== ERROR_GEN_FAILURE
, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err
);
37 Err
= SendARP(0, 0, Hw
, &Size
);
38 ok(Err
== ERROR_GEN_FAILURE
, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err
);
40 Size
= sizeof(IP_ADAPTER_ADDRESSES
);
41 Addresses
= (PIP_ADAPTER_ADDRESSES
)malloc(Size
);
44 skip("Memory failure\n");
48 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
);
49 if (Err
== ERROR_BUFFER_OVERFLOW
)
52 Addresses
= (PIP_ADAPTER_ADDRESSES
)malloc(Size
);
55 skip("Memory failure\n");
59 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
);
62 if (Err
!= ERROR_SUCCESS
)
64 skip("GetAdaptersAddresses() failure\n");
69 for (Current
= Addresses
; Current
; Current
= Current
->Next
)
71 PSOCKADDR_IN SockAddr
;
74 if (Current
->IfType
== IF_TYPE_SOFTWARE_LOOPBACK
)
77 if (Current
->OperStatus
!= IfOperStatusUp
)
80 if (!Current
->FirstUnicastAddress
)
83 SockAddr
= (PSOCKADDR_IN
)Current
->FirstUnicastAddress
->Address
.lpSockaddr
;
84 IpAddr
= SockAddr
->sin_addr
.S_un
.S_addr
;
87 Err
= SendARP(IpAddr
, 0, Hw
, &Size
);
88 ok(Err
== ERROR_NO_SYSTEM_RESOURCES
, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err
);
91 Err
= SendARP(IpAddr
, 0, Hw
, &Size
);
92 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
95 Err
= SendARP(IpAddr
, 0, Hw
, &Size
);
96 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
97 Err
= SendARP(IpAddr
, 0x08080808, Hw
, &Size
);
98 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
101 Err
= SendARP(IpAddr
, IpAddr
, Hw
, &Size
);
102 ok(Err
== ERROR_NO_SYSTEM_RESOURCES
, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err
);
105 Err
= SendARP(IpAddr
, IpAddr
, Hw
, &Size
);
106 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
109 Err
= SendARP(IpAddr
, IpAddr
, Hw
, &Size
);
110 ok(Err
== ERROR_SUCCESS
, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err
);
119 skip("No suitable interface found\n");
125 static VOID
TestKM(IPAddr Source
)
129 IO_STATUS_BLOCK IoStatusBlock
;
130 UNICODE_STRING DevName
= RTL_CONSTANT_STRING(L
"\\Device\\Ip");
131 OBJECT_ATTRIBUTES ObjectAttributes
;
136 InitializeObjectAttributes(&ObjectAttributes
,
138 OBJ_CASE_INSENSITIVE
,
142 Status
= NtCreateFile(&hDevice
, GENERIC_EXECUTE
, &ObjectAttributes
,
143 &IoStatusBlock
, 0, FILE_ATTRIBUTE_NORMAL
, FILE_SHARE_READ
| FILE_SHARE_WRITE
, FILE_OPEN_IF
,
145 if (!NT_SUCCESS(Status
))
147 skip("NtCreateFile() failed with status: %lx\n", Status
);
151 hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
154 skip("CreateEventW() with error: %lx\n", GetLastError());
155 CloseHandle(hDevice
);
159 IoStatusBlock
.Status
= STATUS_SUCCESS
;
160 IoStatusBlock
.Information
= 0;
161 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, NULL
, 0, NULL
, 0);
162 if (Status
== STATUS_PENDING
)
164 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
165 Status
= IoStatusBlock
.Status
;
167 ok(Status
== STATUS_INVALID_BUFFER_SIZE
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
168 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
170 memset(Ip
, 0, sizeof(Ip
));
172 IoStatusBlock
.Status
= STATUS_SUCCESS
;
173 IoStatusBlock
.Information
= 0;
174 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), NULL
, 0);
175 if (Status
== STATUS_PENDING
)
177 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
178 Status
= IoStatusBlock
.Status
;
180 ok(Status
== STATUS_INVALID_BUFFER_SIZE
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
181 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
184 IoStatusBlock
.Status
= STATUS_SUCCESS
;
185 IoStatusBlock
.Information
= 0;
186 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), Hw
, 4);
187 if (Status
== STATUS_PENDING
)
189 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
190 Status
= IoStatusBlock
.Status
;
192 ok(Status
== STATUS_UNSUCCESSFUL
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
193 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
196 IoStatusBlock
.Status
= STATUS_SUCCESS
;
197 IoStatusBlock
.Information
= 0;
198 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), Hw
, 6);
199 if (Status
== STATUS_PENDING
)
201 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
202 Status
= IoStatusBlock
.Status
;
204 ok(Status
== STATUS_UNSUCCESSFUL
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
205 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
208 IoStatusBlock
.Status
= STATUS_SUCCESS
;
209 IoStatusBlock
.Information
= 0;
210 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), Hw
, 8);
211 if (Status
== STATUS_PENDING
)
213 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
214 Status
= IoStatusBlock
.Status
;
216 ok(Status
== STATUS_UNSUCCESSFUL
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
217 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
221 IoStatusBlock
.Status
= STATUS_SUCCESS
;
222 IoStatusBlock
.Information
= 0;
223 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
[0]), NULL
, 0);
224 if (Status
== STATUS_PENDING
)
226 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
227 Status
= IoStatusBlock
.Status
;
229 ok(Status
== STATUS_INVALID_BUFFER_SIZE
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
230 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
233 IoStatusBlock
.Status
= STATUS_SUCCESS
;
234 IoStatusBlock
.Information
= 0;
235 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
[0]), Hw
, 4);
236 if (Status
== STATUS_PENDING
)
238 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
239 Status
= IoStatusBlock
.Status
;
241 ok(Status
== STATUS_INVALID_BUFFER_SIZE
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
242 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
245 IoStatusBlock
.Status
= STATUS_SUCCESS
;
246 IoStatusBlock
.Information
= 0;
247 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
[0]), Hw
, 6);
248 if (Status
== STATUS_PENDING
)
250 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
251 Status
= IoStatusBlock
.Status
;
253 ok(Status
== STATUS_INVALID_BUFFER_SIZE
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
254 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
257 IoStatusBlock
.Status
= STATUS_SUCCESS
;
258 IoStatusBlock
.Information
= 0;
259 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
[0]), Hw
, 8);
260 if (Status
== STATUS_PENDING
)
262 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
263 Status
= IoStatusBlock
.Status
;
265 ok(Status
== STATUS_INVALID_BUFFER_SIZE
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
266 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
269 IoStatusBlock
.Status
= STATUS_SUCCESS
;
270 IoStatusBlock
.Information
= 0;
271 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), NULL
, 0);
272 if (Status
== STATUS_PENDING
)
274 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
275 Status
= IoStatusBlock
.Status
;
277 ok(Status
== STATUS_INVALID_BUFFER_SIZE
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
278 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
281 IoStatusBlock
.Status
= STATUS_SUCCESS
;
282 IoStatusBlock
.Information
= 0;
283 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), Hw
, 4);
284 if (Status
== STATUS_PENDING
)
286 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
287 Status
= IoStatusBlock
.Status
;
289 ok(Status
== STATUS_INSUFFICIENT_RESOURCES
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
290 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
293 IoStatusBlock
.Status
= STATUS_SUCCESS
;
294 IoStatusBlock
.Information
= 0;
295 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), Hw
, 6);
296 if (Status
== STATUS_PENDING
)
298 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
299 Status
= IoStatusBlock
.Status
;
301 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
302 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
305 IoStatusBlock
.Status
= STATUS_SUCCESS
;
306 IoStatusBlock
.Information
= 0;
307 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), Hw
, 8);
308 if (Status
== STATUS_PENDING
)
310 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
311 Status
= IoStatusBlock
.Status
;
313 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
314 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
318 IoStatusBlock
.Status
= STATUS_SUCCESS
;
319 IoStatusBlock
.Information
= 0;
320 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), NULL
, 0);
321 if (Status
== STATUS_PENDING
)
323 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
324 Status
= IoStatusBlock
.Status
;
326 ok(Status
== STATUS_INVALID_BUFFER_SIZE
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
327 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
330 IoStatusBlock
.Status
= STATUS_SUCCESS
;
331 IoStatusBlock
.Information
= 0;
332 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), Hw
, 4);
333 if (Status
== STATUS_PENDING
)
335 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
336 Status
= IoStatusBlock
.Status
;
338 ok(Status
== STATUS_INSUFFICIENT_RESOURCES
, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status
);
339 ok(IoStatusBlock
.Information
== 0, "Excepted 0, got: %lu\n", IoStatusBlock
.Information
);
342 IoStatusBlock
.Status
= STATUS_SUCCESS
;
343 IoStatusBlock
.Information
= 0;
344 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), Hw
, 6);
345 if (Status
== STATUS_PENDING
)
347 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
348 Status
= IoStatusBlock
.Status
;
350 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
351 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
354 IoStatusBlock
.Status
= STATUS_SUCCESS
;
355 IoStatusBlock
.Information
= 0;
356 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), Hw
, 8);
357 if (Status
== STATUS_PENDING
)
359 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
360 Status
= IoStatusBlock
.Status
;
362 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
363 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
367 IoStatusBlock
.Status
= STATUS_SUCCESS
;
368 IoStatusBlock
.Information
= 0;
369 Status
= NtDeviceIoControlFile(hDevice
, hEvent
, NULL
, NULL
, &IoStatusBlock
, IOCTL_QUERY_IP_HW_ADDRESS
, Ip
, sizeof(Ip
), Hw
, 8);
370 if (Status
== STATUS_PENDING
)
372 NtWaitForSingleObject(hEvent
, FALSE
, NULL
);
373 Status
= IoStatusBlock
.Status
;
375 ok(Status
== STATUS_SUCCESS
, "NtDeviceIoControlFile() failed with status: %lx\n", Status
);
376 ok(IoStatusBlock
.Information
== 6, "Excepted 6, got: %lu\n", IoStatusBlock
.Information
);
379 CloseHandle(hDevice
);
389 skip("No suitable interface found\n");