From 410db43f20aa06d5426d646cb15e4a511f2b3f24 Mon Sep 17 00:00:00 2001 From: "Carl J. Bialorucki" Date: Fri, 4 Jul 2025 19:14:24 -0600 Subject: [PATCH] [IPHLPAPI_APITEST] Test failure fixes (#8214) - liCreateTimestamp isn't set in TCP tables on several Windows versions. If it isn't, then we can't compare it to the current system time; so don't. - GetInterfaceName had some test failures unique to Vista, guard them. - icmp: Accept either ERROR_INVALID_HANDLE or ERROR_INVALID_PARAMETER as a last error in a couple tests. --- .../apitests/iphlpapi/GetExtendedTcpTable.c | 16 +++++-- .../apitests/iphlpapi/GetInterfaceName.c | 47 ++++++++++--------- .../apitests/iphlpapi/GetNetworkParams.c | 5 +- .../iphlpapi/GetOwnerModuleFromTcpEntry.c | 8 +++- modules/rostests/apitests/iphlpapi/icmp.c | 9 +++- 5 files changed, 51 insertions(+), 34 deletions(-) diff --git a/modules/rostests/apitests/iphlpapi/GetExtendedTcpTable.c b/modules/rostests/apitests/iphlpapi/GetExtendedTcpTable.c index 87f3b65d3a2..fa04af50728 100644 --- a/modules/rostests/apitests/iphlpapi/GetExtendedTcpTable.c +++ b/modules/rostests/apitests/iphlpapi/GetExtendedTcpTable.c @@ -273,8 +273,12 @@ START_TEST(GetExtendedTcpTable) { ok(TcpTableOwnerMod->table[i].dwOwningPid == Pid, "Invalid owner\n"); - ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart >= CreationTime.QuadPart, "Invalid time\n"); - ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart <= CreationTime.QuadPart + 60000000000LL, "Invalid time\n"); + // liCreateTimestamp may not be populated on Vista, 7, and 8.1 + if (TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart != 0) + { + ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart >= CreationTime.QuadPart, "Invalid time\n"); + ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart <= CreationTime.QuadPart + 60000000000LL, "Invalid time\n"); + } } HeapFree(GetProcessHeap(), 0, TcpTableOwnerMod); @@ -332,8 +336,12 @@ START_TEST(GetExtendedTcpTable) { ok(TcpTableOwnerMod->table[i].dwOwningPid == Pid, "Invalid owner\n"); - ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart >= CreationTime.QuadPart, "Invalid time\n"); - ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart <= CreationTime.QuadPart + 60000000000LL, "Invalid time\n"); + // liCreateTimestamp may not be populated on Vista, 7, and 8.1 + if (TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart != 0) + { + ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart >= CreationTime.QuadPart, "Invalid time\n"); + ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart <= CreationTime.QuadPart + 60000000000LL, "Invalid time\n"); + } } HeapFree(GetProcessHeap(), 0, TcpTableOwnerMod); diff --git a/modules/rostests/apitests/iphlpapi/GetInterfaceName.c b/modules/rostests/apitests/iphlpapi/GetInterfaceName.c index 988c54572e0..87c6c4990eb 100644 --- a/modules/rostests/apitests/iphlpapi/GetInterfaceName.c +++ b/modules/rostests/apitests/iphlpapi/GetInterfaceName.c @@ -38,9 +38,9 @@ test_NhGetInterfaceNameFromGuid(GUID AdapterGUID, DWORD par1, DWORD par2) StartSeh() ApiReturn = pNhGetInterfaceNameFromGuid(NULL, &Name, &ulOutBufLen, par1, par2); Error = GetLastError(); - EndSeh(((GetVersion() & 0xFF) >= 6) ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION); + EndSeh(GetNTVersion() >= _WIN32_WINNT_VISTA ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION); - ok_long(ApiReturn, ((GetVersion() & 0xFF) >= 6) ? ERROR_INVALID_PARAMETER : ERROR_SUCCESS); + ok_long(ApiReturn, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_INVALID_PARAMETER : ERROR_SUCCESS); ok(Error == 0xbeeffeed, "GetLastError() returned %ld, expected 0xbeeffeed\n", Error); @@ -55,8 +55,8 @@ test_NhGetInterfaceNameFromGuid(GUID AdapterGUID, DWORD par1, DWORD par2) ApiReturn = pNhGetInterfaceNameFromGuid(&AdapterGUID, NULL, &ulOutBufLen, par1, par2); Error = GetLastError(); - ok_long(ApiReturn, ((GetVersion() & 0xFF) >= 6) ? ERROR_INVALID_PARAMETER : ERROR_SUCCESS); - ok_long(Error, ((GetVersion() & 0xFF) >= 6) ? ERROR_SUCCESS : 0xbeeffeed); + 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); @@ -93,7 +93,7 @@ test_NhGetInterfaceNameFromGuid(GUID AdapterGUID, DWORD par1, DWORD par2) ok(ApiReturn == ERROR_SUCCESS, "ApiReturn returned %ld, expected ERROR_SUCCESS\n", ApiReturn); - ok_long(Error, ((GetVersion() & 0xFF) >= 6) ? 0 : 0xbeeffeed); + ok_long(Error, GetNTVersion() >= _WIN32_WINNT_VISTA ? 0 : 0xbeeffeed); ok(ulOutBufLen > 0, "ulOutBufLen is %ld, expected > 0\n", ulOutBufLen); @@ -111,12 +111,9 @@ test_NhGetInterfaceNameFromGuid(GUID AdapterGUID, DWORD par1, DWORD par2) ApiReturn = pNhGetInterfaceNameFromGuid((PVOID)&UniqueGUID, &Name, &ulOutBufLen, par1, par2); Error = GetLastError(); - ok_long(ApiReturn, ((GetVersion() & 0xFF) >= 6) ? ERROR_INVALID_PARAMETER : ERROR_NOT_FOUND); -#ifdef _M_AMD64 - ok_long(Error, ERROR_FILE_NOT_FOUND); -#else - ok_long(Error, 0); -#endif + 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); @@ -129,9 +126,12 @@ test_NhGetInterfaceNameFromGuid(GUID AdapterGUID, DWORD par1, DWORD par2) ApiReturn = pNhGetInterfaceNameFromGuid(&AdapterGUID, &Name, &ulOutBufLen, par1, par2); Error = GetLastError(); - ok_long(ApiReturn, ((GetVersion() & 0xFF) >= 6) ? ERROR_NOT_ENOUGH_MEMORY : ERROR_INSUFFICIENT_BUFFER); - ok_long(Error, ((GetVersion() & 0xFF) >= 6) ? 0 : 0xbeeffeed); - ok_long(ulOutBufLen, MAX_INTERFACE_NAME_LEN * 2 + ((GetVersion() & 0xFF) >= 6 ? 2 : 0)); + 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); } @@ -158,9 +158,9 @@ test_NhGetInterfaceNameFromDeviceGuid(GUID AdapterGUID, DWORD par1, DWORD par2) StartSeh() ApiReturn = pNhGetInterfaceNameFromDeviceGuid(NULL, &Name, &ulOutBufLen, par1, par2); Error = GetLastError(); - EndSeh(((GetVersion() & 0xFF) >= 6) ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION); + EndSeh(GetNTVersion() >= _WIN32_WINNT_VISTA ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION); - ok_long(ApiReturn, ((GetVersion() & 0xFF) >= 6) ? ERROR_INVALID_PARAMETER : 0); + ok_long(ApiReturn, GetNTVersion() >= _WIN32_WINNT_VISTA ? ERROR_INVALID_PARAMETER : 0); ok(Error == 0xbeeffeed, "GetLastError() returned %ld, expected ERROR_SUCCESS\n", Error); @@ -177,10 +177,10 @@ test_NhGetInterfaceNameFromDeviceGuid(GUID AdapterGUID, DWORD par1, DWORD par2) StartSeh() ApiReturn = pNhGetInterfaceNameFromDeviceGuid(&AdapterGUID, NULL, &ulOutBufLen, par1, par2); Error = GetLastError(); - EndSeh(((GetVersion() & 0xFF) >= 6) ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION); + EndSeh(GetNTVersion() >= _WIN32_WINNT_VISTA ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION); - ok_long(ApiReturn, ((GetVersion() & 0xFF) >= 6) ? ERROR_INVALID_PARAMETER : 0); - ok_long(Error, ((GetVersion() & 0xFF) >= 6) ? ERROR_SUCCESS : 0xbeeffeed); + 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); @@ -233,7 +233,7 @@ test_NhGetInterfaceNameFromDeviceGuid(GUID AdapterGUID, DWORD par1, DWORD par2) ApiReturn = pNhGetInterfaceNameFromDeviceGuid((PVOID)&UniqueGUID, &Name, &ulOutBufLen, par1, par2); Error = GetLastError(); - ok_long(ApiReturn, ((GetVersion() & 0xFF) >= 6) ? ERROR_INVALID_PARAMETER : ERROR_NOT_FOUND); + 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); @@ -249,11 +249,14 @@ test_NhGetInterfaceNameFromDeviceGuid(GUID AdapterGUID, DWORD par1, DWORD par2) ApiReturn = pNhGetInterfaceNameFromDeviceGuid(&AdapterGUID, &Name, &ulOutBufLen, par1, par2); Error = GetLastError(); - ok_long(ApiReturn, ((GetVersion() & 0xFF) >= 6) ? ERROR_NOT_ENOUGH_MEMORY : ERROR_INSUFFICIENT_BUFFER); + 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); - ok_long(ulOutBufLen, MAX_INTERFACE_NAME_LEN * 2 + (((GetVersion() & 0xFF) >= 6) ? 2 : 0)); + 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); } diff --git a/modules/rostests/apitests/iphlpapi/GetNetworkParams.c b/modules/rostests/apitests/iphlpapi/GetNetworkParams.c index ef0bd6a768e..7459b46da7d 100644 --- a/modules/rostests/apitests/iphlpapi/GetNetworkParams.c +++ b/modules/rostests/apitests/iphlpapi/GetNetworkParams.c @@ -187,10 +187,7 @@ test_GetNetworkParams(VOID) 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); + ok(strcmp(FixedInfo->DomainName, OrigDomainName) == 0, "FixedInfo->DomainName is wrong '%s' != '%s'\n", FixedInfo->DomainName, OrigDomainName); if (!OrigDhcpHostnameExists) { ErrorCode = WriteRegistryValue("DhcpHostname", ROSTESTDHCPHOST); diff --git a/modules/rostests/apitests/iphlpapi/GetOwnerModuleFromTcpEntry.c b/modules/rostests/apitests/iphlpapi/GetOwnerModuleFromTcpEntry.c index a57142118f7..0968ef4effb 100644 --- a/modules/rostests/apitests/iphlpapi/GetOwnerModuleFromTcpEntry.c +++ b/modules/rostests/apitests/iphlpapi/GetOwnerModuleFromTcpEntry.c @@ -112,8 +112,12 @@ START_TEST(GetOwnerModuleFromTcpEntry) ok(TcpTableOwnerMod->table[i].dwOwningPid == Pid, "Invalid owner\n"); - ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart >= CreationTime.QuadPart, "Invalid time\n"); - ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart <= CreationTime.QuadPart + 60000000000LL, "Invalid time\n"); + // liCreateTimestamp may not be populated on Vista, 7, and 8.1 + if (TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart != 0) + { + ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart >= CreationTime.QuadPart, "Invalid time\n"); + ok(TcpTableOwnerMod->table[i].liCreateTimestamp.QuadPart <= CreationTime.QuadPart + 60000000000LL, "Invalid time\n"); + } if (GetOwnerModuleFromTcpEntry(&TcpTableOwnerMod->table[i], TCPIP_OWNER_MODULE_INFO_BASIC, BasicInfo, &Size) == ERROR_INSUFFICIENT_BUFFER) { diff --git a/modules/rostests/apitests/iphlpapi/icmp.c b/modules/rostests/apitests/iphlpapi/icmp.c index 81df6e8e8dd..e6c1726d9a1 100644 --- a/modules/rostests/apitests/iphlpapi/icmp.c +++ b/modules/rostests/apitests/iphlpapi/icmp.c @@ -52,6 +52,7 @@ test_IcmpCloseHandle(void) { HANDLE hIcmp; BOOL bRet; + DWORD LastError; SetLastError(0xDEADBEEF); hIcmp = IcmpCreateFile(); @@ -73,13 +74,17 @@ test_IcmpCloseHandle(void) SetLastError(0xDEADBEEF); bRet = IcmpCloseHandle(hIcmp); ok(!bRet, "IcmpCloseHandle succeeded unexpectedly\n"); - ok_err(ERROR_INVALID_HANDLE); + LastError = GetLastError(); + ok(LastError == ERROR_INVALID_HANDLE || LastError == ERROR_INVALID_PARAMETER, + "Unexpected last error (0x%lX)\n", LastError); hIcmp = NULL; SetLastError(0xDEADBEEF); bRet = IcmpCloseHandle(hIcmp); ok(!bRet, "IcmpCloseHandle succeeded unexpectedly\n"); - ok_err(ERROR_INVALID_HANDLE); + LastError = GetLastError(); + ok(LastError == ERROR_INVALID_HANDLE || LastError == ERROR_INVALID_PARAMETER, + "Unexpected last error (0x%lX)\n", LastError); } static