Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718/* * PROJECT: ReactOS api tests * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory * PURPOSE: Test for SendARP * PROGRAMMER: Pierre Schweitzer <pierre@reactos.org> */
#include <apitest.h>#include <winsock2.h>#include <iphlpapi.h>#include <tcpioctl.h>#define NTOS_MODE_USER#include <ndk/iofuncs.h>#include <ndk/obfuncs.h>#include <ndk/rtlfuncs.h>
static VOID TestUM(IPAddr * Source, IPAddr * Gateway){ DWORD Err; ULONG Hw[2]; DWORD Size; BOOL Tested = FALSE; PIP_ADAPTER_ADDRESSES Addresses, Current; PIP_ADAPTER_INFO Adapters, CurrentA;
Err = SendARP(0, 0, NULL, NULL); ok(Err == ERROR_INVALID_PARAMETER, "Expected error: ERROR_INVALID_PARAMETER. Got: %lx\n", Err);
Size = 4; Err = SendARP(0, 0, Hw, &Size); ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err);
Size = 6; Err = SendARP(0, 0, Hw, &Size); ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err);
Size = 8; Err = SendARP(0, 0, Hw, &Size); ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err);
Size = sizeof(IP_ADAPTER_ADDRESSES); Addresses = (PIP_ADAPTER_ADDRESSES)malloc(Size); if (!Addresses) { skip("Memory failure\n"); return; }
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); if (Err == ERROR_BUFFER_OVERFLOW) { free(Addresses); Addresses = (PIP_ADAPTER_ADDRESSES)malloc(Size); if (!Addresses) { skip("Memory failure\n"); return; }
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); }
if (Err != ERROR_SUCCESS) { skip("GetAdaptersAddresses() failure\n"); free(Addresses); return; }
for (Current = Addresses; Current; Current = Current->Next) { PSOCKADDR_IN SockAddr; IPAddr IpAddr;
if (Current->IfType == IF_TYPE_SOFTWARE_LOOPBACK) continue;
if (Current->OperStatus != IfOperStatusUp) continue;
if (!Current->FirstUnicastAddress) continue;
ok(Current->FirstUnicastAddress->Address.iSockaddrLength == sizeof(SOCKADDR_IN), "Unexpected length: %u\n", Current->FirstUnicastAddress->Address.iSockaddrLength); SockAddr = (PSOCKADDR_IN)Current->FirstUnicastAddress->Address.lpSockaddr; IpAddr = SockAddr->sin_addr.S_un.S_addr;
trace("IP address found: %lu.%lu.%lu.%lu\n", IpAddr & 0xFF, (IpAddr >> 8) & 0xFF, (IpAddr >> 16) & 0xFF, (IpAddr >> 24) & 0xFF);
Size = 4; Err = SendARP(IpAddr, 0, Hw, &Size); ok(Err == ERROR_NO_SYSTEM_RESOURCES, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err);
Size = 6; Err = SendARP(IpAddr, 0, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
Size = 8; Err = SendARP(IpAddr, 0, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err); Err = SendARP(IpAddr, 0x08080808, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
Size = 4; Err = SendARP(IpAddr, IpAddr, Hw, &Size); ok(Err == ERROR_NO_SYSTEM_RESOURCES, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err);
Size = 6; Err = SendARP(IpAddr, IpAddr, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
Size = 8; Err = SendARP(IpAddr, IpAddr, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
*Source = IpAddr; Tested = TRUE; break; }
free(Addresses);
if (!Tested) { skip("No suitable interface found\n"); return; }
Size = sizeof(IP_ADAPTER_INFO); Adapters = (PIP_ADAPTER_INFO)malloc(Size); if (!Adapters) { skip("Memory failure\n"); return; }
Err = GetAdaptersInfo(Adapters, &Size); if (Err == ERROR_BUFFER_OVERFLOW) { free(Adapters); Adapters = (PIP_ADAPTER_INFO)malloc(Size); if (!Adapters) { skip("Memory failure\n"); return; }
Err = GetAdaptersInfo(Adapters, &Size); }
if (Err != ERROR_SUCCESS) { skip("GetAdaptersInfo() failure\n"); free(Adapters); return; }
Tested = FALSE; for (CurrentA = Adapters; CurrentA; CurrentA = CurrentA->Next) { IPAddr IpAddr; NTSTATUS Status; const CHAR * Terminator;
Status = RtlIpv4StringToAddressA(CurrentA->IpAddressList.IpAddress.String, TRUE, &Terminator, (struct in_addr *)&IpAddr); if (!NT_SUCCESS(Status)) continue;
if (IpAddr != *Source) continue;
Status = RtlIpv4StringToAddressA(CurrentA->GatewayList.IpAddress.String, TRUE, &Terminator, (struct in_addr *)&IpAddr); if (NT_SUCCESS(Status)) { trace("Gateway found: %lu.%lu.%lu.%lu\n", IpAddr & 0xFF, (IpAddr >> 8) & 0xFF, (IpAddr >> 16) & 0xFF, (IpAddr >> 24) & 0xFF); Tested = TRUE; *Gateway = IpAddr; }
break; }
free(Adapters);
if (!Tested) { skip("No suitable gateway found\n"); return; }
Size = 4; Err = SendARP(*Gateway, *Source, Hw, &Size); ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err);
Size = 6; Err = SendARP(*Gateway, *Source, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
Size = 8; Err = SendARP(*Gateway, *Source, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
Size = 4; Err = SendARP(*Source, *Gateway, Hw, &Size); ok(Err == ERROR_NO_SYSTEM_RESOURCES, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err);
Size = 6; Err = SendARP(*Source, *Gateway, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
Size = 8; Err = SendARP(*Source, *Gateway, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
Size = 4; Err = SendARP(*Gateway, 0x08080808, Hw, &Size); ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err);
Size = 6; Err = SendARP(*Gateway, 0x08080808, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
Size = 8; Err = SendARP(*Gateway, 0x08080808, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
Size = 4; Err = SendARP(*Source, 0x08080808, Hw, &Size); ok(Err == ERROR_NO_SYSTEM_RESOURCES, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err);
Size = 6; Err = SendARP(*Source, 0x08080808, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);
Size = 8; Err = SendARP(*Source, 0x08080808, Hw, &Size); ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err);}
static VOID TestKM(IPAddr Source, IPAddr Gateway){ HANDLE hDevice; NTSTATUS Status; IO_STATUS_BLOCK IoStatusBlock; UNICODE_STRING DevName = RTL_CONSTANT_STRING(L"\\Device\\Ip"); OBJECT_ATTRIBUTES ObjectAttributes; HANDLE hEvent; ULONG Hw[2]; ULONG Ip[2];
InitializeObjectAttributes(&ObjectAttributes, &DevName, OBJ_CASE_INSENSITIVE, NULL, NULL);
Status = NtCreateFile(&hDevice, GENERIC_EXECUTE, &ObjectAttributes, &IoStatusBlock, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF, 0, NULL, 0); if (!NT_SUCCESS(Status)) { skip("NtCreateFile() failed with status: %lx\n", Status); return; }
hEvent = CreateEventW(NULL, TRUE, FALSE, NULL); if (!hEvent) { skip("CreateEventW() with error: %lx\n", GetLastError()); CloseHandle(hDevice); return; }
IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, NULL, 0, NULL, 0); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
memset(Ip, 0, sizeof(Ip)); ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
Ip[0] = Source; ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip[0]), NULL, 0); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip[0]), Hw, 4); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip[0]), Hw, 6); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip[0]), Hw, 8); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INSUFFICIENT_RESOURCES, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
Ip[1] = Source; ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INSUFFICIENT_RESOURCES, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
Ip[1] = 0x08080808; ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
if (!Gateway) { skip("No suitable gateway found\n"); CloseHandle(hEvent); CloseHandle(hDevice); return; }
Ip[0] = Gateway; Ip[1] = Source; ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
Ip[0] = Source; Ip[1] = Gateway; ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INSUFFICIENT_RESOURCES, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
Ip[0] = Gateway; Ip[1] = 0x08080808; ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
Ip[0] = Source; ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_INSUFFICIENT_RESOURCES, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
ResetEvent(hEvent); IoStatusBlock.Status = STATUS_SUCCESS; IoStatusBlock.Information = 0; Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); if (Status == STATUS_PENDING) { NtWaitForSingleObject(hEvent, FALSE, NULL); Status = IoStatusBlock.Status; } ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
CloseHandle(hEvent); CloseHandle(hDevice);}
START_TEST(SendARP){ IPAddr Source = 0; IPAddr Gateway = 0;
TestUM(&Source, &Gateway); if (!Source) { skip("No suitable interface found\n"); return; }
TestKM(Source, Gateway);}