Index: modules/rostests/apitests/iphlpapi/CMakeLists.txt =================================================================== --- modules/rostests/apitests/iphlpapi/CMakeLists.txt (revision 72796) +++ modules/rostests/apitests/iphlpapi/CMakeLists.txt (working copy) @@ -1,5 +1,6 @@ list(APPEND SOURCE + GetNetworkParams.c icmp.c SendARP.c testlist.c) @@ -7,5 +8,5 @@ add_executable(iphlpapi_apitest ${SOURCE}) target_link_libraries(iphlpapi_apitest wine ${PSEH_LIB}) set_module_type(iphlpapi_apitest win32cui) -add_importlibs(iphlpapi_apitest iphlpapi msvcrt kernel32 ntdll) +add_importlibs(iphlpapi_apitest iphlpapi advapi32 msvcrt kernel32 ntdll) add_cd_file(TARGET iphlpapi_apitest DESTINATION reactos/bin FOR all) Index: modules/rostests/apitests/iphlpapi/GetNetworkParams.c =================================================================== --- modules/rostests/apitests/iphlpapi/GetNetworkParams.c (revision 0) +++ modules/rostests/apitests/iphlpapi/GetNetworkParams.c (working copy) @@ -0,0 +1,275 @@ +/* + * PROJECT: ReactOS API Tests + * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory + * PURPOSE: Tests for GetNetworkParams function + * PROGRAMMERS: Peter Hater + */ + +#include + +#define WIN32_NO_STATUS +#include +#include + +#define ROSTESTDHCPHOST "testdhcproshost" +#define ROSTESTDHCPDOMAIN "testrosdomain" + +static +INT +ReadRegistryValue(PCHAR ValueName, PCHAR Value) +{ + INT ErrorCode; + HKEY ParametersKey; + DWORD RegType; + DWORD RegSize = 0; + + /* Open the database path key */ + ErrorCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "System\\CurrentControlSet\\Services\\Tcpip\\Parameters", + 0, + KEY_READ, + &ParametersKey); + if (ErrorCode == NO_ERROR) + { + /* Read the actual path */ + ErrorCode = RegQueryValueExA(ParametersKey, + ValueName, + NULL, + &RegType, + NULL, + &RegSize); + if (RegSize) + { + /* Read the actual path */ + ErrorCode = RegQueryValueExA(ParametersKey, + ValueName, + NULL, + &RegType, + (LPBYTE)Value, + &RegSize); + } + + /* Close the key */ + RegCloseKey(ParametersKey); + } + return ErrorCode; +} + +static +INT +WriteRegistryValue(PCHAR ValueName, PCHAR Value) +{ + INT ErrorCode; + HKEY ParametersKey; + + /* Open the database path key */ + ErrorCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "System\\CurrentControlSet\\Services\\Tcpip\\Parameters", + 0, + KEY_WRITE, + &ParametersKey); + if (ErrorCode == NO_ERROR) + { + /* Read the actual path */ + ErrorCode = RegSetValueExA(ParametersKey, + ValueName, + 0, + REG_SZ, + (LPBYTE)Value, + strlen(Value) + 1); + + /* Close the key */ + RegCloseKey(ParametersKey); + } + return ErrorCode; +} + +static +INT +DeleteRegistryValue(PCHAR ValueName) +{ + INT ErrorCode; + HKEY ParametersKey; + + /* Open the database path key */ + ErrorCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "System\\CurrentControlSet\\Services\\Tcpip\\Parameters", + 0, + KEY_WRITE, + &ParametersKey); + if (ErrorCode == NO_ERROR) + { + /* Read the actual path */ + ErrorCode = RegDeleteValueA(ParametersKey, ValueName); + + /* Close the key */ + RegCloseKey(ParametersKey); + } + return ErrorCode; +} + +static +VOID +test_GetNetworkParams(VOID) +{ + DWORD len = 0; + INT ErrorCode; + CHAR OrigHostname[128]; + CHAR OrigDomainName[128]; + CHAR OrigDhcpHostname[128]; + CHAR OrigDhcpDomainName[128]; + BOOL OrigHostnameExists; + BOOL OrigDomainNameExists; + BOOL OrigDhcpHostnameExists; + BOOL OrigDhcpDomainNameExists; + PFIXED_INFO FixedInfo; + DWORD ApiReturn; + + memset(OrigHostname, 0, sizeof(OrigHostname)); + memset(OrigDomainName, 0, sizeof(OrigDomainName)); + memset(OrigDhcpHostname, 0, sizeof(OrigDhcpHostname)); + memset(OrigDhcpDomainName, 0, sizeof(OrigDhcpDomainName)); + /* read current registry values */ + ErrorCode = ReadRegistryValue("Hostname", OrigHostname); + ok(ErrorCode == ERROR_SUCCESS, "Failed to read registry key Hostname %d\n", ErrorCode); + OrigHostnameExists = ErrorCode == NO_ERROR; + ErrorCode = ReadRegistryValue("Domain", OrigDomainName); + ok(ErrorCode == ERROR_SUCCESS || ErrorCode == ERROR_FILE_NOT_FOUND, "Failed to read registry key DomainName %d\n", ErrorCode); + OrigDomainNameExists = ErrorCode == NO_ERROR; + ErrorCode = ReadRegistryValue("DhcpHostname", OrigDhcpHostname); + ok(ErrorCode == ERROR_SUCCESS || ErrorCode == ERROR_FILE_NOT_FOUND, "Failed to read registry key DhcpHostname %d\n", ErrorCode); + OrigDhcpHostnameExists = ErrorCode == NO_ERROR; + ErrorCode = ReadRegistryValue("DhcpDomain", OrigDhcpDomainName); + ok(ErrorCode == ERROR_SUCCESS || ErrorCode == ERROR_FILE_NOT_FOUND, "Failed to read registry key DhcpDomainName %d\n", ErrorCode); + OrigDhcpDomainNameExists = ErrorCode == NO_ERROR; + + trace("Starting values:\n"); + trace("Hostname: %s, exists %s\n", OrigHostname, OrigHostnameExists ? "yes" : "no"); + trace("Domain: %s, exists %s\n", OrigDomainName, OrigDomainNameExists ? "yes" : "no"); + trace("DhcpHostname: %s, exists %s\n", OrigDhcpHostnameExists ? OrigDhcpHostname : "", OrigDhcpHostnameExists ? "yes" : "no"); + trace("DhcpDomain: %s, exists %s\n", OrigDhcpDomainNameExists ? OrigDhcpDomainName : "", OrigDhcpDomainNameExists ? "yes" : "no"); + + ApiReturn = GetNetworkParams(NULL, &len); + ok(ApiReturn == ERROR_BUFFER_OVERFLOW, + "GetNetworkParams returned %ld, expected ERROR_BUFFER_OVERFLOW\n", + ApiReturn); + if (ApiReturn != ERROR_BUFFER_OVERFLOW) + skip("Can't determine size of FIXED_INFO. Can't proceed\n"); + FixedInfo = HeapAlloc(GetProcessHeap(), 0, len); + if (FixedInfo == NULL) + skip("FixedInfo is NULL. Can't proceed\n"); + + ApiReturn = GetNetworkParams(FixedInfo, &len); + ok(ApiReturn == NO_ERROR, + "GetNetworkParams(buf, &dwSize) returned %ld, expected NO_ERROR\n", + ApiReturn); + if (ApiReturn != NO_ERROR) + { + HeapFree(GetProcessHeap(), 0, FixedInfo); + skip("GetNetworkParams failed. Can't proceed\n"); + } + ok(FixedInfo->HostName != NULL, "FixedInfo->HostName is NULL\n"); + if (FixedInfo->HostName == NULL) + { + HeapFree(GetProcessHeap(), 0, FixedInfo); + skip("FixedInfo->HostName is NULL. Can't proceed\n"); + } + if (OrigDhcpHostnameExists) + { + /* Windows doesn't honor DHCP option 12 even if RFC requires it if it is returned by DHCP server! */ + //ok(strcmp(FixedInfo->HostName, OrigDhcpHostname) == 0, "FixedInfo->HostName is wrong '%s' != '%s'\n", FixedInfo->HostName, OrigDhcpHostname); + } + else + ok(strcmp(FixedInfo->HostName, OrigHostname) == 0, "FixedInfo->HostName is wrong '%s' != '%s'\n", FixedInfo->HostName, OrigHostname); + ok(FixedInfo->DomainName != NULL, "FixedInfo->DomainName is NULL\n"); + if (FixedInfo->DomainName == NULL) + { + HeapFree(GetProcessHeap(), 0, FixedInfo); + skip("FixedInfo->DomainName is NULL. Can't proceed\n"); + } + if(OrigDhcpDomainNameExists) + ok(strcmp(FixedInfo->DomainName, OrigDhcpDomainName) == 0, "FixedInfo->DomainName is wrong '%s' != '%s'\n", FixedInfo->DomainName, OrigDhcpDomainName); + else + ok(strcmp(FixedInfo->DomainName, OrigDomainName) == 0, "FixedInfo->DomainName is wrong '%s' != '%s'\n", FixedInfo->DomainName, OrigDomainName); + if (!OrigDhcpHostnameExists) + { + ErrorCode = WriteRegistryValue("DhcpHostname", ROSTESTDHCPHOST); + ok(ErrorCode == NO_ERROR, "Failed to write registry key DhcpHostname %d\n", ErrorCode); + } + else + { + ErrorCode = DeleteRegistryValue("DhcpHostname"); + ok(ErrorCode == NO_ERROR, "Failed to remove registry key DhcpHostname %d\n", ErrorCode); + } + if (!OrigDhcpDomainNameExists) + { + ErrorCode = WriteRegistryValue("DhcpDomain", ROSTESTDHCPDOMAIN); + ok(ErrorCode == NO_ERROR, "Failed to write registry key DhcpDomainName %d\n", ErrorCode); + } + else + { + ErrorCode = DeleteRegistryValue("DhcpDomain"); + ok(ErrorCode == NO_ERROR, "Failed to remove registry key DhcpDomainName %d\n", ErrorCode); + } + + HeapFree(GetProcessHeap(), 0, FixedInfo); + len = 0; + ApiReturn = GetNetworkParams(NULL, &len); + ok(ApiReturn == ERROR_BUFFER_OVERFLOW, + "GetNetworkParams returned %ld, expected ERROR_BUFFER_OVERFLOW\n", + ApiReturn); + if (ApiReturn != ERROR_BUFFER_OVERFLOW) + skip("Can't determine size of FIXED_INFO. Can't proceed\n"); + FixedInfo = HeapAlloc(GetProcessHeap(), 0, len); + if (FixedInfo == NULL) + skip("FixedInfo is NULL. Can't proceed\n"); + ApiReturn = GetNetworkParams(FixedInfo, &len); + ok(ApiReturn == NO_ERROR, + "GetNetworkParams(buf, &dwSize) returned %ld, expected NO_ERROR\n", + ApiReturn); + if (ApiReturn != NO_ERROR) + { + HeapFree(GetProcessHeap(), 0, FixedInfo); + skip("GetNetworkParams failed. Can't proceed\n"); + } + + /* restore registry values */ + if (OrigDhcpHostnameExists) + ErrorCode = WriteRegistryValue("DhcpHostname", OrigDhcpHostname); + else + ErrorCode = DeleteRegistryValue("DhcpHostname"); + ok(ErrorCode == NO_ERROR, "Failed to restore registry key DhcpHostname %d\n", ErrorCode); + if (OrigDhcpDomainNameExists) + ErrorCode = WriteRegistryValue("DhcpDomain", OrigDhcpDomainName); + else + ErrorCode = DeleteRegistryValue("DhcpDomain"); + ok(ErrorCode == NO_ERROR, "Failed to restore registry key DhcpDomainName %d\n", ErrorCode); + + ok(ApiReturn == NO_ERROR, + "GetNetworkParams(buf, &dwSize) returned %ld, expected NO_ERROR\n", + ApiReturn); + ok(FixedInfo->HostName != NULL, "FixedInfo->HostName is NULL\n"); + if (FixedInfo->HostName == NULL) + skip("FixedInfo->HostName is NULL. Can't proceed\n"); + if (!OrigDhcpHostnameExists) + { + /* Windows doesn't honor DHCP option 12 even if RFC requires it if it is returned by DHCP server! */ + //ok(strcmp(FixedInfo->HostName, ROSTESTDHCPHOST) == 0, "FixedInfo->HostName is wrong '%s' != '%s'\n", FixedInfo->HostName, ROSTESTDHCPHOST); + } + else + ok(strcmp(FixedInfo->HostName, OrigHostname) == 0, "FixedInfo->HostName is wrong '%s' != '%s'\n", FixedInfo->HostName, OrigHostname); + ok(FixedInfo->DomainName != NULL, "FixedInfo->DomainName is NULL\n"); + if (FixedInfo->DomainName == NULL) + skip("FixedInfo->DomainName is NULL. Can't proceed\n"); + if (!OrigDhcpDomainNameExists) + ok(strcmp(FixedInfo->DomainName, ROSTESTDHCPDOMAIN) == 0, "FixedInfo->DomainName is wrong '%s' != '%s'\n", FixedInfo->DomainName, ROSTESTDHCPDOMAIN); + else + ok(strcmp(FixedInfo->DomainName, OrigDomainName) == 0, "FixedInfo->DomainName is wrong '%s' != '%s'\n", FixedInfo->DomainName, OrigDomainName); + + HeapFree(GetProcessHeap(), 0, FixedInfo); +} + +START_TEST(GetNetworkParams) +{ + test_GetNetworkParams(); +} Index: modules/rostests/apitests/iphlpapi/testlist.c =================================================================== --- modules/rostests/apitests/iphlpapi/testlist.c (revision 72796) +++ modules/rostests/apitests/iphlpapi/testlist.c (working copy) @@ -5,11 +5,13 @@ extern void func_icmp(void); extern void func_SendARP(void); +extern void func_GetNetworkParams(void); const struct test winetest_testlist[] = { { "icmp", func_icmp }, { "SendARP", func_SendARP }, + { "GetNetworkParams", func_GetNetworkParams }, { 0, 0 } };