Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371/* * PROJECT: ReactOS API Tests * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) * PURPOSE: Tests for network interface name resolving functions * COPYRIGHT: Copyright 2017 Stanislav Motylkov */
#include <apitest.h>
#define WIN32_NO_STATUS#include <iphlpapi.h>#include <ndk/rtlfuncs.h>#include <initguid.h>
DEFINE_GUID(MY_TEST_GUID, 0x8D1AB70F, 0xADF0, 0x49FC, 0x9D, 0x07, 0x4E, 0x89, 0x29, 0x2D, 0xC5, 0x2B);static DWORD (WINAPI * pNhGetInterfaceNameFromGuid)(PVOID, PVOID, PULONG, DWORD, DWORD);static DWORD (WINAPI * pNhGetInterfaceNameFromDeviceGuid)(PVOID, PVOID, PULONG, DWORD, DWORD);
/* * Tests for NhGetInterfaceNameFromGuid */staticVOIDtest_NhGetInterfaceNameFromGuid(GUID AdapterGUID, DWORD par1, DWORD par2){ DWORD ApiReturn, Error; ULONG ulOutBufLen; WCHAR Name[MAX_INTERFACE_NAME_LEN + 4]; GUID UniqueGUID = MY_TEST_GUID; SIZE_T Length;
// Test NULL GUID SetLastError(0xbeeffeed); Error = 0xbeeffeed; ZeroMemory(&Name, sizeof(Name)); ApiReturn = ERROR_SUCCESS; ulOutBufLen = sizeof(Name); StartSeh() ApiReturn = pNhGetInterfaceNameFromGuid(NULL, &Name, &ulOutBufLen, par1, par2); Error = GetLastError(); EndSeh(GetNTVersion() >= _WIN32_WINNT_VISTA ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION);
ok_long(ApiReturn, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_INVALID_PARAMETER : ERROR_SUCCESS); ok(Error == 0xbeeffeed, "GetLastError() returned %ld, expected 0xbeeffeed\n", Error); ok(ulOutBufLen == sizeof(Name), "ulOutBufLen is %ld, expected = sizeof(Name)\n", ulOutBufLen); ok_wstr(L"", Name);
// Test correct GUID, but NULL name SetLastError(0xbeeffeed); ZeroMemory(&Name, sizeof(Name)); ApiReturn = pNhGetInterfaceNameFromGuid(&AdapterGUID, NULL, &ulOutBufLen, par1, par2); Error = GetLastError();
ok_long(ApiReturn, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_INVALID_PARAMETER : ERROR_SUCCESS); ok_long(Error, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_SUCCESS : 0xbeeffeed); ok(ulOutBufLen > 0, "ulOutBufLen is %ld, expected > 0\n", ulOutBufLen); ok_wstr(L"", Name);
// NhGetInterfaceNameFromGuid will throw exception if pOutBufLen is NULL SetLastError(0xbeeffeed); Error = 0xbeeffeed; ZeroMemory(&Name, sizeof(Name)); ApiReturn = 0xdeadbeef; StartSeh() ApiReturn = pNhGetInterfaceNameFromGuid(&AdapterGUID, &Name, NULL, par1, par2); Error = GetLastError(); EndSeh(STATUS_ACCESS_VIOLATION);
ok(ApiReturn == 0xdeadbeef, "ApiReturn returned %ld, expected 0xdeadbeef\n", ApiReturn); ok(Error == 0xbeeffeed, "GetLastError() returned %ld, expected 0xbeeffeed\n", Error); ok(ulOutBufLen > 0, "ulOutBufLen is %ld, expected > 0\n", ulOutBufLen); ok_wstr(L"", Name);
// Test correct values SetLastError(0xbeeffeed); ZeroMemory(&Name, sizeof(Name)); ulOutBufLen = sizeof(Name); ApiReturn = pNhGetInterfaceNameFromGuid(&AdapterGUID, &Name, &ulOutBufLen, par1, par2); Error = GetLastError();
ok(ApiReturn == ERROR_SUCCESS, "ApiReturn returned %ld, expected ERROR_SUCCESS\n", ApiReturn); ok_long(Error, GetNTVersion() >= _WIN32_WINNT_VISTA ? 0 : 0xbeeffeed); ok(ulOutBufLen > 0, "ulOutBufLen is %ld, expected > 0\n", ulOutBufLen); Length = wcslen(Name); ok(Length > 0, "wcslen(Name) is %ld, expected > 0\n", Length); if (Length > 0) trace("Adapter name: \"%S\"\n", Name);
// Test correct values, but with new unique GUID SetLastError(0xbeeffeed); ZeroMemory(&Name, sizeof(Name)); ulOutBufLen = sizeof(Name); ApiReturn = pNhGetInterfaceNameFromGuid((PVOID)&UniqueGUID, &Name, &ulOutBufLen, par1, par2); Error = GetLastError();
ok_long(ApiReturn, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_INVALID_PARAMETER : ERROR_NOT_FOUND); // Windows 8+ succeeds on x64, Server 2003 x86 returns ERROR_FILE_NOT_FOUND ok(Error == ERROR_FILE_NOT_FOUND || Error == ERROR_SUCCESS, "Unexpected error. (0x%lX)\n", Error); ok(ulOutBufLen == sizeof(Name), "ulOutBufLen is %ld, expected = sizeof(Name)\n", ulOutBufLen); ok_wstr(L"", Name);
// Test correct values, but with small length SetLastError(0xbeeffeed); ZeroMemory(&Name, sizeof(Name)); ulOutBufLen = 0; ApiReturn = pNhGetInterfaceNameFromGuid(&AdapterGUID, &Name, &ulOutBufLen, par1, par2); Error = GetLastError();
ok_long(ApiReturn, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_NOT_ENOUGH_MEMORY : ERROR_INSUFFICIENT_BUFFER); ok_long(Error, GetNTVersion() >= _WIN32_WINNT_VISTA ? 0 : 0xbeeffeed); if (GetNTVersion() != _WIN32_WINNT_VISTA) ok_long(ulOutBufLen, MAX_INTERFACE_NAME_LEN * 2 + (GetNTVersion() >= _WIN32_WINNT_VISTA ? 2 : 0)); else ok_long(ulOutBufLen, 0); ok_wstr(L"", Name);}
/* * Tests for NhGetInterfaceNameFromDeviceGuid */staticVOIDtest_NhGetInterfaceNameFromDeviceGuid(GUID AdapterGUID, DWORD par1, DWORD par2){ DWORD ApiReturn, Error; ULONG ulOutBufLen; WCHAR Name[MAX_INTERFACE_NAME_LEN]; GUID UniqueGUID = MY_TEST_GUID; SIZE_T Length;
// Test NULL GUID // Windows XP: NhGetInterfaceNameFromDeviceGuid throws exception here SetLastError(0xbeeffeed); Error = 0xbeeffeed; ZeroMemory(&Name, sizeof(Name)); ApiReturn = ERROR_SUCCESS; ulOutBufLen = sizeof(Name); StartSeh() ApiReturn = pNhGetInterfaceNameFromDeviceGuid(NULL, &Name, &ulOutBufLen, par1, par2); Error = GetLastError(); EndSeh(GetNTVersion() >= _WIN32_WINNT_VISTA ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION);
ok_long(ApiReturn, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_INVALID_PARAMETER : 0); ok(Error == 0xbeeffeed, "GetLastError() returned %ld, expected ERROR_SUCCESS\n", Error); ok(ulOutBufLen == sizeof(Name), "ulOutBufLen is %ld, expected = sizeof(Name)\n", ulOutBufLen); ok_wstr(L"", Name);
// Test correct GUID, but NULL name SetLastError(0xbeeffeed); Error = 0xbeeffeed; ZeroMemory(&Name, sizeof(Name)); ApiReturn = ERROR_SUCCESS; StartSeh() ApiReturn = pNhGetInterfaceNameFromDeviceGuid(&AdapterGUID, NULL, &ulOutBufLen, par1, par2); Error = GetLastError(); EndSeh(GetNTVersion() >= _WIN32_WINNT_VISTA ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION);
ok_long(ApiReturn, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_INVALID_PARAMETER : 0); ok_long(Error, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_SUCCESS : 0xbeeffeed); ok(ulOutBufLen > 0, "ulOutBufLen is %ld, expected > 0\n", ulOutBufLen); ok_wstr(L"", Name);
// NhGetInterfaceNameFromDeviceGuid will throw exception if pOutBufLen is NULL SetLastError(0xbeeffeed); Error = 0xbeeffeed; ZeroMemory(&Name, sizeof(Name)); ApiReturn = ERROR_SUCCESS; StartSeh() ApiReturn = pNhGetInterfaceNameFromDeviceGuid(&AdapterGUID, &Name, NULL, par1, par2); Error = GetLastError(); EndSeh(STATUS_ACCESS_VIOLATION);
ok_long(ApiReturn, 0); ok_long(Error, 0xbeeffeed); ok(ulOutBufLen > 0, "ulOutBufLen is %ld, expected > 0\n", ulOutBufLen); ok_wstr(L"", Name);
// Test correct values SetLastError(0xbeeffeed); ZeroMemory(&Name, sizeof(Name)); ulOutBufLen = sizeof(Name); ApiReturn = pNhGetInterfaceNameFromDeviceGuid(&AdapterGUID, &Name, &ulOutBufLen, par1, par2); Error = GetLastError();
ok(ApiReturn == ERROR_SUCCESS, "ApiReturn returned %ld, expected ERROR_SUCCESS\n", ApiReturn); ok(Error == ERROR_SUCCESS, "GetLastError() returned %ld, expected ERROR_SUCCESS\n", Error); ok(ulOutBufLen > 0, "ulOutBufLen is %ld, expected > 0\n", ulOutBufLen); Length = wcslen(Name); ok(Length > 0, "wcslen(Name) is %ld, expected > 0\n", Length); if (Length > 0) trace("Adapter name: \"%S\"\n", Name);
// Test correct values, but with new unique GUID SetLastError(0xbeeffeed); ZeroMemory(&Name, sizeof(Name)); ulOutBufLen = sizeof(Name); ApiReturn = pNhGetInterfaceNameFromDeviceGuid((PVOID)&UniqueGUID, &Name, &ulOutBufLen, par1, par2); Error = GetLastError();
ok_long(ApiReturn, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_INVALID_PARAMETER : ERROR_NOT_FOUND); ok(Error == ERROR_SUCCESS, "GetLastError() returned %ld, expected ERROR_SUCCESS\n", Error); ok(ulOutBufLen == sizeof(Name), "ulOutBufLen is %ld, expected = sizeof(Name)\n", ulOutBufLen); ok_wstr(L"", Name);
// Test correct values, but with small length SetLastError(0xbeeffeed); ZeroMemory(&Name, sizeof(Name)); ulOutBufLen = 0; ApiReturn = pNhGetInterfaceNameFromDeviceGuid(&AdapterGUID, &Name, &ulOutBufLen, par1, par2); Error = GetLastError();
ok_long(ApiReturn, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_NOT_ENOUGH_MEMORY : ERROR_INSUFFICIENT_BUFFER); ok(Error == ERROR_SUCCESS, "GetLastError() returned %ld, expected ERROR_SUCCESS\n", Error); if (GetNTVersion() != _WIN32_WINNT_VISTA) ok_long(ulOutBufLen, MAX_INTERFACE_NAME_LEN * 2 + (GetNTVersion() >= _WIN32_WINNT_VISTA ? 2 : 0)); else ok_long(ulOutBufLen, 0); ok_wstr(L"", Name);}
staticVOIDtest_GetInterfaceName(VOID){ PIP_INTERFACE_INFO pInfo = NULL; ULONG ulOutBufLen = 0; DWORD ApiReturn; WCHAR Name[MAX_ADAPTER_NAME]; UNICODE_STRING GuidString; GUID AdapterGUID; HINSTANCE hIpHlpApi;
ApiReturn = GetInterfaceInfo(pInfo, &ulOutBufLen); ok(ApiReturn == ERROR_INSUFFICIENT_BUFFER, "GetInterfaceInfo(pInfo, &ulOutBufLen) returned %ld, expected ERROR_INSUFFICIENT_BUFFER\n", ApiReturn); if (ApiReturn != ERROR_INSUFFICIENT_BUFFER) { skip("Can't determine size of IP_INTERFACE_INFO. Can't proceed\n"); return; }
pInfo = (IP_INTERFACE_INFO *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ulOutBufLen); if (pInfo == NULL) { skip("pInfo is NULL. Can't proceed\n"); return; }
ApiReturn = GetInterfaceInfo(pInfo, &ulOutBufLen); ok(ApiReturn == NO_ERROR, "GetInterfaceInfo(pInfo, &ulOutBufLen) returned %ld, expected NO_ERROR\n", ApiReturn); if (ApiReturn != NO_ERROR || ulOutBufLen == 0) { skip("GetInterfaceInfo failed with error %ld. Can't proceed\n", ApiReturn); return; }
if (pInfo->NumAdapters > 0) CopyMemory(&Name, &pInfo->Adapter[0].Name, sizeof(Name));
if (pInfo->NumAdapters == 0) { HeapFree(GetProcessHeap(), 0, pInfo); skip("pInfo->NumAdapters = 0. Can't proceed\n"); return; } trace("pInfo->NumAdapters: %lu\n", pInfo->NumAdapters);
HeapFree(GetProcessHeap(), 0, pInfo);
ApiReturn = wcsncmp(Name, L"\\DEVICE\\TCPIP_", 14); ok(ApiReturn == 0, "wcsncmp(Name, L\"\\DEVICE\\TCPIP_\", 14) returned %ld, expected 0\n", ApiReturn); if (ApiReturn != 0) { if (wcslen(Name) == 0) { skip("pInfo->Adapter[0].Name is empty. Can't proceed\n"); return; } else { // workaround for ReactOS trace("pInfo->Adapter[0].Name = \"%ls\" is incorrect.\n", Name); RtlInitUnicodeString(&GuidString, &Name[0]); } } else { RtlInitUnicodeString(&GuidString, &Name[14]); }
ApiReturn = RtlGUIDFromString(&GuidString, &AdapterGUID); if (ApiReturn != 0) { skip("RtlGUIDFromString failed. Can't proceed\n"); return; }
hIpHlpApi = GetModuleHandleW(L"iphlpapi.dll"); if (!hIpHlpApi) { skip("Failed to load iphlpapi.dll. Can't proceed\n"); return; }
pNhGetInterfaceNameFromGuid = (void *)GetProcAddress(hIpHlpApi, "NhGetInterfaceNameFromGuid");
if (!pNhGetInterfaceNameFromGuid) skip("NhGetInterfaceNameFromGuid not found. Can't proceed\n"); else test_NhGetInterfaceNameFromGuid(AdapterGUID, 0, 0);
pNhGetInterfaceNameFromDeviceGuid = (void *)GetProcAddress(hIpHlpApi, "NhGetInterfaceNameFromDeviceGuid");
if (!pNhGetInterfaceNameFromDeviceGuid) skip("NhGetInterfaceNameFromDeviceGuid not found. Can't proceed\n"); else test_NhGetInterfaceNameFromDeviceGuid(AdapterGUID, 1, 0);}
START_TEST(GetInterfaceName){ test_GetInterfaceName();}