From bf734eb002e966cca22beba1391a9be9670dae1a Mon Sep 17 00:00:00 2001 From: "Carl J. Bialorucki" Date: Tue, 17 Jun 2025 11:18:32 -0600 Subject: [PATCH] [APPHELP_APITEST] Fix test failures on Vista, 7, 8.1 x86 and x64 (#8122) * Disable most apphelp:env and some apphelp:db tests on x64 due to structure differences breaking these tests. * Add new tag lists for Windows 8.1 and Windows 10 in apphelp:apphelp test. * Make a few changes to accept either Windows 10 or Windows 8.1 and older behavior in apphelp:apphelp test. * Create new shimdata structures for Windows 8 and Windows Vista. * Add attribute size definitions for Vista, 8.1, and 10. * Create new shim data validation functions for Vista and 8.1. * Use local time instead of UTC time for shim db version. This fixes test failures when the day in local time and the day in UTC are different. --- modules/rostests/apitests/apphelp/apphelp.c | 218 ++++++++++++++++-- .../apitests/apphelp/apphelp_apitest.h | 1 + modules/rostests/apitests/apphelp/db.cpp | 11 +- modules/rostests/apitests/apphelp/env.c | 151 +++++++++++- 4 files changed, 346 insertions(+), 35 deletions(-) diff --git a/modules/rostests/apitests/apphelp/apphelp.c b/modules/rostests/apitests/apphelp/apphelp.c index 13a52ca0f6f..4be3f24782e 100644 --- a/modules/rostests/apitests/apphelp/apphelp.c +++ b/modules/rostests/apitests/apphelp/apphelp.c @@ -213,7 +213,7 @@ static struct DWORD line; DWORD min_ver; DWORD max_ver; - const char* tags[7*8]; + const char* tags[99]; } data[] = { { TAG_TYPE_NULL, 0x1000, __LINE__, WINVER_ANY, WINVER_2003, @@ -229,12 +229,30 @@ static struct } }, { - TAG_TYPE_NULL, 0x1000, __LINE__, WINVER_WIN7, WINVER_ANY, + TAG_TYPE_NULL, 0x1000, __LINE__, WINVER_WIN7, WINVER_WIN7, { "InvalidTag", "INCLUDE", "GENERAL", "MATCH_LOGIC_NOT", "APPLY_ALL_SHIMS", "USE_SERVICE_PACK_FILES", "MITIGATION_OS", "BLOCK_UPGRADE", "INCLUDEEXCLUDEDLL", "RAC_EVENT_OFF", "TELEMETRY_OFF", "SHIM_ENGINE_OFF", "LAYER_PROPAGATION_OFF", "REINSTALL_UPGRADE", NULL } }, + { + TAG_TYPE_NULL, 0x1000, __LINE__, WINVER_WIN8, WINVER_WIN81, + { + "InvalidTag", "INCLUDE", "GENERAL", "MATCH_LOGIC_NOT", "APPLY_ALL_SHIMS", "USE_SERVICE_PACK_FILES", "MITIGATION_OS", "TRACE_PCA", + "INCLUDEEXCLUDEDLL", "RAC_EVENT_OFF", "TELEMETRY_OFF", "SHIM_ENGINE_OFF", "LAYER_PROPAGATION_OFF", "FORCE_CACHE", "MONITORING_OFF", + "QUIRK_OFF", "ELEVATED_PROP_OFF", "UPGRADE_ACTION_BLOCK_WEBSETUP", "UPGRADE_ACTION_PROCEED_TO_MEDIASETUP", NULL + } + }, + { + TAG_TYPE_NULL, 0x1000, __LINE__, WINVER_WIN10, WINVER_ANY, + { + "InvalidTag", "INCLUDE", "GENERAL", "MATCH_LOGIC_NOT", "APPLY_ALL_SHIMS", "USE_SERVICE_PACK_FILES", "MITIGATION_OS", "TRACE_PCA", + "INCLUDEEXCLUDEDLL", "RAC_EVENT_OFF", "TELEMETRY_OFF", "SHIM_ENGINE_OFF", "LAYER_PROPAGATION_OFF", "FORCE_CACHE", "MONITORING_OFF", + "QUIRK_OFF", "ELEVATED_PROP_OFF", "UPGRADE_ACTION_BLOCK_WEBSETUP", "UPGRADE_ACTION_PROCEED_TO_MEDIASETUP", "HWCOMPAT_DEVICE", + "HWEXCLUDE_DEVICE", "WUCOMPAT_DEVICE", "APPEND_COMMANDLINE", "COMPARE_CASE", "InvalidTag", "InvalidTag", "MATCHED_OBJECT", + "USE_INVENTORY", NULL + } + }, { TAG_TYPE_BYTE, 0x1000, __LINE__, WINVER_ANY, WINVER_ANY, @@ -294,7 +312,7 @@ static struct } }, { - TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_WIN7, WINVER_ANY, + TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_WIN7, WINVER_WIN7, { "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERDATEHI", "VERDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVER", "PREVOSMINORVER", "PREVOSPLATFORMID", "PREVOSBUILDNO", @@ -305,6 +323,39 @@ static struct "CONTEXT_TAGID", "EXE_WRAPPER", "URL_ID", NULL } }, + { + TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_WIN8, WINVER_WIN81, + { + "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERDATEHI", + "VERDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVER", "PREVOSMINORVER", "PREVOSPLATFORMID", "PREVOSBUILDNO", + "PROBLEMSEVERITY", "LANGID", "VER_LANGUAGE", "InvalidTag", "ENGINE", "HTMLHELPID", "INDEX_FLAGS", "FLAGS", + "DATA_VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "OS_SERVICE_PACK", + "FLAG_TAGID", "RUNTIME_PLATFORM", "OS_SKU", "OS_PLATFORM", "APP_NAME_RC_ID", "VENDOR_NAME_RC_ID", "SUMMARY_MSG_RC_ID", "InvalidTag", + "DESCRIPTION_RC_ID", "PARAMETER1_RC_ID", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", + "CONTEXT_TAGID", "EXE_WRAPPER", "EXE_TYPE", "FROM_LINK_DATE", "REVISION_EQ", "REVISION_LE", "REVISION_GE", "DATE_EQ", "DATE_LE", "DATE_GE", + "CPU_MODEL_EQ", "CPU_MODEL_LE", "CPU_MODEL_GE", "CPU_FAMILY_EQ", "CPU_FAMILY_LE", "CPU_FAMILY_GE", "CREATOR_REVISION_EQ", "CREATOR_REVISION_LE", + "CREATOR_REVISION_GE", "SIZE_OF_IMAGE", "SHIM_CLASS", "PACKAGEID_ARCHITECTURE", "REINSTALL_UPGRADE_TYPE", "BLOCK_UPGRADE_TYPE", "ROUTING_MODE", + "OS_VERSION_VALUE", "CRC_CHECKSUM", "URL_ID", "QUIRK_TAGID", "InvalidTag", "MIGRATION_DATA_TYPE", "UPGRADE_DATA", "MIGRATION_DATA_TAGID", "REG_VALUE_TYPE", + "REG_VALUE_DATA_DWORD", "TEXT_ENCODING", NULL + } + }, + { + TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_WIN10, WINVER_ANY, + { + "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERDATEHI", + "VERDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVER", "PREVOSMINORVER", "PREVOSPLATFORMID", "PREVOSBUILDNO", + "PROBLEMSEVERITY", "LANGID", "VER_LANGUAGE", "OS_KIND", "ENGINE", "HTMLHELPID", "INDEX_FLAGS", "FLAGS", + "DATA_VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "InvalidTag", + "FLAG_TAGID", "RUNTIME_PLATFORM", "InvalidTag", "GUEST_TARGET_PLATFORM", "APP_NAME_RC_ID", "VENDOR_NAME_RC_ID", "SUMMARY_MSG_RC_ID", "InvalidTag", + "DESCRIPTION_RC_ID", "PARAMETER1_RC_ID", "HWCOMPAT_HWID_COUNT", "TITLE_MSG_RC_ID_BACKUP", "SUMMARY_MSG_RC_ID_BACKUP", "InvalidTag", "InvalidTag", "InvalidTag", + "CONTEXT_TAGID", "EXE_WRAPPER", "EXE_TYPE", "FROM_LINK_DATE", "REVISION_EQ", "REVISION_LE", "REVISION_GE", "DATE_EQ", "DATE_LE", "DATE_GE", + "CPU_MODEL_EQ", "CPU_MODEL_LE", "CPU_MODEL_GE", "CPU_FAMILY_EQ", "CPU_FAMILY_LE", "CPU_FAMILY_GE", "CREATOR_REVISION_EQ", "CREATOR_REVISION_LE", + "CREATOR_REVISION_GE", "SIZE_OF_IMAGE", "SHIM_CLASS", "PACKAGEID_ARCHITECTURE", "REINSTALL_UPGRADE_TYPE", "BLOCK_UPGRADE_TYPE", "ROUTING_MODE", + "OS_VERSION_VALUE", "CRC_CHECKSUM", "URL_ID", "QUIRK_TAGID", "InvalidTag", "MIGRATION_DATA_TYPE", "UPGRADE_DATA", "MIGRATION_DATA_TAGID", "REG_VALUE_TYPE", + "REG_VALUE_DATA_DWORD", "TEXT_ENCODING", "UX_BLOCKTYPE_OVERRIDE", "EDITION", "FW_LINK_ID", "KB_ARTICLE_ID", "InvalidTag", "TITLE_MSG_RC_ID", "LINK_TEXT_RC_ID", + "LINK_TEXT_RC_ID_BACKUP", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "REQUESTED_ATTRIBUTES", "BACKUP_LABEL", NULL + } + }, { TAG_TYPE_DWORD | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY, { @@ -328,13 +379,32 @@ static struct } }, { - TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_VISTA, WINVER_ANY, + TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_VISTA, WINVER_WIN7, { "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD", "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", "FLAG_MASK_FUSION", "FLAG_PROCESSPARAM", "FLAG_LUA", "FLAG_INSTALL", NULL } }, + { + TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_WIN8, WINVER_WIN81, + { + "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD", + "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", "FLAG_MASK_FUSION", "FLAG_PROCESSPARAM", + "FLAG_LUA", "FLAG_INSTALL", "FROM_BIN_PRODUCT_VERSION", "FROM_BIN_FILE_VERSION", "PACKAGEID_VERSION", "FROM_PACKAGEID_VERSION", "UPTO_PACKAGEID_VERSION", + "OSMAXVERSIONTESTED", "FROM_OSMAXVERSIONTESTED", "UPTO_OSMAXVERSIONTESTED", "FLAG_MASK_WINRT", "REG_VALUE_DATA_QWORD", "QUIRK_ENABLED_UPTO_VERSION", NULL + } + }, + { + TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_WIN10, WINVER_ANY, + { + "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD", + "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", "FLAG_MASK_FUSION", "FLAG_PROCESSPARAM", + "FLAG_LUA", "FLAG_INSTALL", "FROM_BIN_PRODUCT_VERSION", "FROM_BIN_FILE_VERSION", "PACKAGEID_VERSION", "FROM_PACKAGEID_VERSION", "UPTO_PACKAGEID_VERSION", + "OSMAXVERSIONTESTED", "FROM_OSMAXVERSIONTESTED", "UPTO_OSMAXVERSIONTESTED", "FLAG_MASK_WINRT", "REG_VALUE_DATA_QWORD", "QUIRK_ENABLED_VERSION_LT", + "SOURCE_OS", "SOURCE_OS_LTE", "SOURCE_OS_GTE", "FILESIZE", NULL + } + }, { TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_ANY, WINVER_2003, @@ -357,7 +427,7 @@ static struct } }, { - TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_WIN7, WINVER_ANY, + TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_WIN7, WINVER_WIN7, { "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag", "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", @@ -366,6 +436,33 @@ static struct "16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", "EXPORT_NAME", "URL", NULL } }, + { + TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_WIN8, WINVER_WIN81, + { + "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag", + "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", + "PRODUCT_NAME", "PRODUCT_VERSION", "FILE_DESCRIPTION", "FILE_VERSION", "ORIGINAL_FILENAME", "INTERNAL_NAME", "LEGAL_COPYRIGHT", "16BIT_DESCRIPTION", + "APPHELP_DETAILS", "LINK_URL", "LINK_TEXT", "APPHELP_TITLE", "APPHELP_CONTACT", "SXS_MANIFEST", "DATA_STRING", "MSI_TRANSFORM_FILE", + "16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", "EXPORT_NAME", "VENDOR_ID", "DEVICE_ID", "SUB_VENDOR_ID", + "SUB_SYSTEM_ID", "PACKAGEID_NAME", "PACKAGEID_PUBLISHER", "PACKAGEID_LANGUAGE", "URL", "MANUFACTURER", "MODEL", "DATE", "REG_VALUE_NAME", + "REG_VALUE_DATA_SZ", "MIGRATION_DATA_TEXT", NULL + } + }, + { + TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_WIN10, WINVER_ANY, + { + "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag", + "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", + "PRODUCT_NAME", "PRODUCT_VERSION", "FILE_DESCRIPTION", "FILE_VERSION", "ORIGINAL_FILENAME", "INTERNAL_NAME", "LEGAL_COPYRIGHT", "16BIT_DESCRIPTION", + "APPHELP_DETAILS", "LINK_URL", "LINK_TEXT", "APPHELP_TITLE", "APPHELP_CONTACT", "SXS_MANIFEST", "DATA_STRING", "MSI_TRANSFORM_FILE", + "16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", "EXPORT_NAME", "VENDOR_ID", "DEVICE_ID", "SUB_VENDOR_ID", + "SUB_SYSTEM_ID", "PACKAGEID_NAME", "PACKAGEID_PUBLISHER", "PACKAGEID_LANGUAGE", "URL", "MANUFACTURER", "MODEL", "DATE", "REG_VALUE_NAME", + "REG_VALUE_DATA_SZ", "MIGRATION_DATA_TEXT", "APP_STORE_PRODUCT_ID", "MORE_INFO_URL", "DEST_OS_VALUE_DEF", "DEST_OS_GTE", "DEST_OS_LT", "DEST_OS", + "PACKAGE_STRONGNAME", "FALLBACK_XML", "LINK_TEXT_OVERRIDE", "MATCH_LOGIC_NOT_IF_SDB_CAPABILITY_EXISTS", "ESCAPE_CHARACTER", "InvalidTag", + "InvalidTag", "InvalidTag", "InvalidTag", "PUBLISHER", "MATCHING_LABEL", "UPTO_PRODUCT_VERSION", "UPTO_FILE_VERSION", "FROM_PRODUCT_VERSION", + "FROM_FILE_VERSION", "LANGUAGE", NULL + } + }, { TAG_TYPE_LIST, 0x800, __LINE__, WINVER_ANY, WINVER_2003, @@ -385,7 +482,7 @@ static struct } }, { - TAG_TYPE_LIST, 0x800, __LINE__, WINVER_WIN7, WINVER_ANY, + TAG_TYPE_LIST, 0x800, __LINE__, WINVER_WIN7, WINVER_WIN7, { "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE", "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA", @@ -394,6 +491,37 @@ static struct "SPC", NULL } }, + { + TAG_TYPE_LIST, 0x800, __LINE__, WINVER_WIN8, WINVER_WIN81, + { + "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE", + "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA", + "MSI_TRANSFORM", "MSI_TRANSFORM_REF", "MSI_PACKAGE", "FLAG", "MSI_CUSTOM_ACTION", "FLAG_REF", "ACTION", "LOOKUP", + "CONTEXT", "CONTEXT_REF", "KDEVICE", "InvalidTag", "KDRIVER", "InvalidTag", "MATCHING_DEVICE", "ACPI", + "BIOS", "CPU", "OEM", "KFLAG", "KFLAG_REF", "KSHIM", "KSHIM_REF", "REINSTALL_UPGRADE", "KDATA", "BLOCK_UPGRADE", + "SPC", "QUIRK", "QUIRK_REF", "BIOS_BLOCK", "MATCHING_INFO_BLOCK", "DEVICE_BLOCK", "MIGRATION_DATA", "MIGRATION_DATA_REF", + "MATCHING_REG", "MATCHING_TEXT", "MACHINE_BLOCK", "OS_UPGRADE", "PACKAGE", NULL + } + }, + { + TAG_TYPE_LIST, 0x800, __LINE__, WINVER_WIN10, WINVER_ANY, + { + "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE", + "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA", + "MSI_TRANSFORM", "MSI_TRANSFORM_REF", "MSI_PACKAGE", "FLAG", "MSI_CUSTOM_ACTION", "FLAG_REF", "ACTION", "LOOKUP", + "CONTEXT", "CONTEXT_REF", "KDEVICE", "InvalidTag", "KDRIVER", "InvalidTag", "MATCHING_DEVICE", "ACPI", + "BIOS", "CPU", "OEM", "KFLAG", "KFLAG_REF", "KSHIM", "KSHIM_REF", "REINSTALL_UPGRADE", "KDATA", "BLOCK_UPGRADE", + "InvalidTag", "QUIRK", "QUIRK_REF", "BIOS_BLOCK", "MATCHING_INFO_BLOCK", "DEVICE_BLOCK", "MIGRATION_DATA", "MIGRATION_DATA_REF", + "MATCHING_REG", "MATCHING_TEXT", "MACHINE_BLOCK", "OS_UPGRADE", "PACKAGE", "PICK_ONE", "MATCH_PLUGIN", "MIGRATION_SHIM", + "UPGRADE_DRIVER_BLOCK", "InvalidTag", "MIGRATION_SHIM_REF", "CONTAINS_FILE", "CONTAINS_HWID", "DRIVER_PACKAGE_BLOCK", + "DEST_OS_VALUES", "XAP", "HWCOMPAT_SOURCES", "HWCOMPAT_SOURCE_INFO", "C_STRUCT", "PROCESS_MODULE", "C_STRUCT_REF", + "MATCHING_WILDCARD_FILE", "MATCHING_WILDCARD_REG", "MATCHING_DIR", "MATCHING_SDB_CAPABILITY", "MATCHING_COMMAND_LINE", + "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", + "BACKUP_FILE", "BACKUP_APPLICATION", "BACKUP_PACKAGE", "RESTORE_FILE", "RESTORE_APPLICATION", "RESTORE_PACKAGE", + "BACKUP_INCLUDE_FILE", "MATCHING_BACKUP_FILE", "MATCHING_WILDCARD_BACKUP_FILE", "RESTORE_ACTION", "MATCHING_BACKUP_LABEL", + "MATCHING_RESTORE_ACTION", "MATCHING_APPLICATION_ATTRIBUTES", NULL + } + }, { TAG_TYPE_LIST | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY, { @@ -436,13 +564,29 @@ static struct } }, { - TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_WIN7, WINVER_ANY, + TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_WIN7, WINVER_WIN7, { "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID", "DATA_BITS", "MSI_PACKAGE_ID", "DATABASE_ID", "CONTEXT_PLATFORM_ID", "CONTEXT_BRANCH_ID", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "FIX_ID", "APP_ID", NULL } }, + { + TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_WIN8, WINVER_WIN81, + { + "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID", "DATA_BITS", "MSI_PACKAGE_ID", "DATABASE_ID", + "CONTEXT_PLATFORM_ID", "CONTEXT_BRANCH_ID", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", + "FIX_ID", "APP_ID", "REG_VALUE_DATA_BINARY", "TEXT", NULL + } + }, + { + TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_WIN10, WINVER_ANY, + { + "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID", "DATA_BITS", "MSI_PACKAGE_ID", "DATABASE_ID", + "CONTEXT_PLATFORM_ID", "CONTEXT_BRANCH_ID", "XAP_ID", "C_STRUCT_BIN_DATA", "C_STRUCT_VERSION", "InvalidTag", + "InvalidTag", "InvalidTag", "FIX_ID", "APP_ID", "REG_VALUE_DATA_BINARY", "TEXT", "BACKUP_ID", NULL + } + }, { TAG_TYPE_BINARY | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY, { @@ -753,8 +897,6 @@ static void test_crc2_imp(DWORD len, int fill, DWORD expected) pSdbFreeFileAttributes(pattrinfo); } - - static void test_ApplicationAttributes(void) { static const WCHAR path[] = {'t','e','s','t','x','x','.','e','x','e',0}; @@ -780,8 +922,8 @@ static void test_ApplicationAttributes(void) DeleteFileA("testxx.exe"); ret = pSdbGetFileAttributes(path, &pattrinfo, &num); ok(ret == FALSE, "expected SdbGetFileAttributes to fail.\n"); - ok(pattrinfo == (PATTRINFO)0xdead, "expected the pointer not to change.\n"); - ok(num == 333, "expected the number of items not to change.\n"); + ok(pattrinfo == (PATTRINFO)0xdead || pattrinfo == NULL, "expected the pointer not to change or to be NULL.\n"); + ok(num == 333 || num == 0, "expected the number of items not to change or to be 0.\n"); if (ret) pSdbFreeFileAttributes(pattrinfo); @@ -797,24 +939,36 @@ static void test_ApplicationAttributes(void) // trace("%S\n", pSdbTagToString(pattrinfo[n].type)); //} - switch (num) + switch(g_WinVersion) { - case 26: - // 2k3 - g_AttrInfoSize = 26; - break; - case 28: - // Win7+ (and maybe vista, but who cares about that?) - g_AttrInfoSize = 28; - break; - default: - ok(0, "Unknown attrinfo size: %u\n", num); - break; + case WINVER_2003: + g_AttrInfoSize = 26; + break; + case WINVER_VISTA: + g_AttrInfoSize = 27; + break; + case WINVER_WIN7: + g_AttrInfoSize = 28; + break; + case WINVER_WIN8: + case WINVER_WIN81: + g_AttrInfoSize = 43; + break; + case WINVER_WIN10: + g_AttrInfoSize = 38; + break; + default: + ok(0, "Unknown attrinfo size: %u\n", num); + break; } ok(num == g_AttrInfoSize, "expected %u items, got %d.\n", g_AttrInfoSize, num); +#ifndef _M_IX86 + if (num == g_AttrInfoSize && ret && g_WinVersion < WINVER_WIN7) +#else if (num == g_AttrInfoSize && ret) +#endif { expect_tag_dword(pattrinfo, TAG_SIZE, 0x800); expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0x178bd629); @@ -860,7 +1014,14 @@ static void test_ApplicationAttributes(void) if (num == g_AttrInfoSize && ret) { expect_tag_dword(pattrinfo, TAG_SIZE, 0x800); +#ifndef _M_IX86 + if (g_WinVersion < WINVER_WIN7) + expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xea7caffd); + else + expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xea7cf1fd); +#else expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xea7caffd); +#endif //expect_tag_skip_range(pattrinfo, 2, 16); expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x3); /* Win32 */ expect_tag_dword(pattrinfo, TAG_PE_CHECKSUM, 0xBAAD); @@ -1021,7 +1182,10 @@ static void test_SdbGetAppPatchDir(void) _SEH2_TRY { hr = pSdbGetAppPatchDir(NULL, NULL, 0); - ok_hex(hr, S_FALSE); + if (g_WinVersion < WINVER_WIN10) + ok_hex(hr, S_FALSE); + else + ok_hex(hr, S_OK); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -1044,7 +1208,7 @@ static void test_SdbGetAppPatchDir(void) if (g_WinVersion < WINVER_WIN7) expect_hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - else if (g_WinVersion < WINVER_WIN10) + else if (g_WinVersion <= WINVER_WIN10) expect_hr = S_OK; else expect_hr = TRUE; @@ -1089,6 +1253,10 @@ START_TEST(apphelp) test_ApplicationAttributes(); test_SdbTagToString(); test_SdbTagToStringAllTags(); +#ifndef _M_IX86 + skip("FIXME: Need new SdbGetAppPatchDir() for non-x86!\n"); +#else if (pSdbGetAppPatchDir) test_SdbGetAppPatchDir(); +#endif } diff --git a/modules/rostests/apitests/apphelp/apphelp_apitest.h b/modules/rostests/apitests/apphelp/apphelp_apitest.h index 5a9e9d470cc..9225406c29d 100644 --- a/modules/rostests/apitests/apphelp/apphelp_apitest.h +++ b/modules/rostests/apitests/apphelp/apphelp_apitest.h @@ -31,6 +31,7 @@ extern DWORD g_WinVersion; #define WINVER_VISTA 0x0600 #define WINVER_WIN7 0x0601 #define WINVER_WIN8 0x0602 +#define WINVER_WIN81 0x0603 #define WINVER_WIN10 0x0a00 diff --git a/modules/rostests/apitests/apphelp/db.cpp b/modules/rostests/apitests/apphelp/db.cpp index cc7116af530..3f42cdaf3a9 100644 --- a/modules/rostests/apitests/apphelp/db.cpp +++ b/modules/rostests/apitests/apphelp/db.cpp @@ -229,7 +229,7 @@ static void test_GetDatabaseInformationEmpty(PDB pdb) else { SYSTEMTIME si = {0}; - GetSystemTime(&si); + GetLocalTime(&si); DWORD dwExpect = ((DWORD)si.wYear - 2000) * 10000 + si.wMonth * 100 + si.wDay; ok(pInfo->dwMinor == dwExpect, "Expected pInfo->dwMinor to be %d, was: %d\n", dwExpect, pInfo->dwMinor); } @@ -1774,7 +1774,7 @@ static void test_DataTags(HSDB hsdb) ok_hex(dwBufferSize, sizeof(DWORD)); ok_hex(*(DWORD*)Buffer, 3333); - if (g_WinVersion > _WIN32_WINNT_WS03) + if (g_WinVersion >= _WIN32_WINNT_WIN10) { memset(Buffer, 0xaa, sizeof(Buffer)); dwBufferSize = sizeof(Buffer); @@ -1881,7 +1881,7 @@ static void test_DataTags(HSDB hsdb) ok_hex(dwDataType, 0x12345); ok_hex(dwBufferSize, sizeof(Buffer)); ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa); - if (g_WinVersion == _WIN32_WINNT_WS03) + if (g_WinVersion < _WIN32_WINNT_WIN10) ok(trData == 0, "Expected 0, got 0x%x\n", trData); else ok(trData == 0x111111, "Expected 0x111111, got 0x%x\n", trData); @@ -2125,6 +2125,11 @@ START_TEST(db) *(void**)&pSdbGetDatabaseInformation = (void *)GetProcAddress(hdll, "SdbGetDatabaseInformation"); *(void**)&pSdbFreeDatabaseInformation = (void *)GetProcAddress(hdll, "SdbFreeDatabaseInformation"); +#ifndef _M_IX86 + skip("FIXME: We need a new db test for non-x86!\n"); + return; +#endif + test_Sdb(); test_write_ex(); test_stringtable(); diff --git a/modules/rostests/apitests/apphelp/env.c b/modules/rostests/apitests/apphelp/env.c index 26fcadbb611..2b203d0411c 100644 --- a/modules/rostests/apitests/apphelp/env.c +++ b/modules/rostests/apitests/apphelp/env.c @@ -83,7 +83,13 @@ typedef struct ShimData_Win2k3 GUID rgGuidDB[SDB_MAX_SDBS]; } ShimData_Win2k3; - +typedef struct ShimData_WinVista +{ + WCHAR szModule[260]; + DWORD dwSize; + DWORD dwMagic; + SDBQUERYRESULT_VISTA Query; +} ShimData_WinVista; typedef struct ShimData_Win7 { @@ -95,6 +101,24 @@ typedef struct ShimData_Win7 DWORD unknown; // 0x14c } ShimData_Win7; +typedef struct ShimData_Win8 +{ + WCHAR szModule[260]; + DWORD dwSize; + DWORD dwMagic; + DWORD unk1; + SDBQUERYRESULT_VISTA Query; + WCHAR szLayer[MAX_LAYER_LENGTH]; + char padding1[0x200]; + char padding2[0x404]; + DWORD unk2; + DWORD unk3; + WCHAR processname[MAX_PATH]; + WCHAR szLayerEnv[MAX_LAYER_LENGTH]; + WCHAR unk4[MAX_LAYER_LENGTH]; + char padding4[112]; +} ShimData_Win8; + typedef struct ShimData_Win10_v1 { WCHAR szModule[260]; @@ -149,7 +173,9 @@ typedef struct ShimData_QueryOffset C_ASSERT(sizeof(ShimData_Win2k3) == 392); +C_ASSERT(sizeof(ShimData_WinVista) == 984); C_ASSERT(sizeof(ShimData_Win7) == 1500); +C_ASSERT(sizeof(ShimData_Win8) == 4704); C_ASSERT(sizeof(ShimData_Win10_v1) == 4712); C_ASSERT(sizeof(ShimData_Win10_v2) == 3976); @@ -308,6 +334,41 @@ static void Validate_ShimData_Win2k3(PVOID data, size_t count, const char* layer ok(pShimData->dwCustomSDBMap == 1, "Expected pShimData->dwCustomSDBMap to be 1, was %u\n", pShimData->dwCustomSDBMap); } +static void Validate_ShimData_WinVista(PVOID data, size_t count, const char* layers[]) +{ + size_t n; + ShimData_WinVista* pShimData = (ShimData_WinVista*)data; + WCHAR szShimEng[MAX_PATH]; + HMODULE hShimEngDll = LoadLibraryA("ShimEng.dll"); + + GetModuleFileNameW(hShimEngDll, szShimEng, _countof(szShimEng)); + + ok(!lstrcmpW(pShimData->szModule, szShimEng), "Expected pShimData->Module to be %s, was %s\n", + wine_dbgstr_w(szShimEng), wine_dbgstr_w(pShimData->szModule)); + ok(pShimData->dwMagic == SHIMDATA_MAGIC, "Expected pShimData->dwMagic to be 0x%x, was 0x%x\n", + SHIMDATA_MAGIC, pShimData->dwMagic); + ok(pShimData->dwSize == sizeof(ShimData_WinVista), "Expected pShimData->dwSize to be %u, was %u\n", + sizeof(ShimData_WinVista), pShimData->dwSize); + if (pShimData->Query.dwLayerCount != min(count, SDB_MAX_LAYERS)) + { + char buf[250] = {0}; + GetEnvironmentVariableA("__COMPAT_LAYER", buf, _countof(buf)); + trace("At test: %s\n", buf); + } + ok(pShimData->Query.dwLayerCount == min(count, SDB_MAX_LAYERS), + "Expected LayerCount to be %u, was %u\n", min(count, SDB_MAX_LAYERS), pShimData->Query.dwLayerCount); + for (n = 0; n < SDB_MAX_LAYERS; ++n) + { + if (n < count) + { + ok(pShimData->Query.atrLayers[n] != 0, "Expected to find a valid layer in index %u / %u\n", n, count); + ValidateShim(pShimData->Query.atrLayers[n], layers[n]); + } + else + ok(pShimData->Query.atrLayers[n] == 0, "Expected to find an empty layer in index %u / %u\n", n, count); + } +} + static void Validate_ShimData_Win7(PVOID data, WCHAR szApphelp[256], size_t count, const char* layers[]) { size_t n; @@ -340,6 +401,35 @@ static void Validate_ShimData_Win7(PVOID data, WCHAR szApphelp[256], size_t coun ok(pShimData->unknown == 0x14c, "Expected pShimData->unknown to be 0x14c, was 0x%x\n", pShimData->unknown); } +static void Validate_ShimData_Win8(PVOID data, WCHAR szApphelp[256], size_t count, const char* layers[]) +{ + size_t n; + ShimData_Win8* pShimData = (ShimData_Win8*)data; + + ok(!lstrcmpiW(pShimData->szModule, szApphelp), "Expected pShimData->Module to be %s, was %s\n", + wine_dbgstr_w(szApphelp), wine_dbgstr_w(pShimData->szModule)); + ok(pShimData->dwSize == sizeof(ShimData_Win8), "Expected pShimData->dwSize to be %u, was %u\n", + sizeof(ShimData_Win8), pShimData->dwSize); + if (pShimData->Query.dwLayerCount != min(count, SDB_MAX_LAYERS)) + { + char buf[250] = {0}; + GetEnvironmentVariableA("__COMPAT_LAYER", buf, _countof(buf)); + trace("At test: %s\n", buf); + } + ok(pShimData->Query.dwLayerCount == min(count, SDB_MAX_LAYERS), + "Expected LayerCount to be %u, was %u\n", min(count, SDB_MAX_LAYERS), pShimData->Query.dwLayerCount); + for (n = 0; n < SDB_MAX_LAYERS; ++n) + { + if (n < count) + { + ok(pShimData->Query.atrLayers[n] != 0, "Expected to find a valid layer in index %u / %u\n", n, count); + ValidateShim(pShimData->Query.atrLayers[n], layers[n]); + } + else + ok(pShimData->Query.atrLayers[n] == 0, "Expected to find an empty layer in index %u / %u\n", n, count); + } +} + static void Validate_ShimData_Win10_v2(PVOID data, WCHAR szApphelp[256], size_t count, const char* layers[]) { size_t n; @@ -410,6 +500,19 @@ static void Validate_ShimData_Win10(PVOID data, WCHAR szApphelp[256], size_t cou } } +static void Validate_EmptyShimData_Win8(PVOID data) +{ + ShimData_Win8* pShimData = (ShimData_Win8*)data; + ok(pShimData != NULL, "Expected pShimData\n"); + if (!pShimData) + return; + + ok(!lstrcmpiW(pShimData->szModule, L""), "Expected pShimData->Module to be '', was %s\n", wine_dbgstr_w(pShimData->szModule)); + ok(!lstrcmpiW(pShimData->szLayer, L""), "Expected pShimData->szLayer to be '', was %s\n", wine_dbgstr_w(pShimData->szLayer)); + ok(pShimData->dwSize == sizeof(ShimData_Win8), "Expected pShimData->dwSize to be %u, was %u\n", sizeof(ShimData_Win8), pShimData->dwSize); + ok(!memcmp(&pShimData->Query, &empty_result, sizeof(empty_result)), "Expected result to be empty\n"); +} + static void Validate_EmptyShimData_Win10(PVOID data) { ShimData_Win10_v1* pShimData = (ShimData_Win10_v1*)data; @@ -471,10 +574,14 @@ static void Test_layers(WCHAR szApphelp[256]) ok(info.AppCompatFlags.QuadPart == 0, "Expected AppCompatFlags to be 0, was: %s\n", wine_dbgstr_longlong(info.AppCompatFlags.QuadPart)); ok(info.AppCompatFlagsUser.QuadPart == 0, "Expected AppCompatFlagsUser to be 0, was: %s\n", wine_dbgstr_longlong(info.AppCompatFlagsUser.QuadPart)); ok(info.AppCompatInfo == NULL, "Expected AppCompatInfo to be NULL, was: %p\n", info.AppCompatInfo); - if (g_WinVersion < WINVER_WIN10) + if (g_WinVersion < WINVER_WIN8) { ok(info.pShimData == NULL, "Expected pShimData to be NULL, was: %p\n", info.pShimData); } + else if (g_WinVersion < WINVER_WIN10) + { + Validate_EmptyShimData_Win8(info.pShimData); + } else { Validate_EmptyShimData_Win10(info.pShimData); @@ -491,8 +598,12 @@ static void Test_layers(WCHAR szApphelp[256]) { if (g_WinVersion < WINVER_VISTA) Validate_ShimData_Win2k3(info.pShimData, n, layers); - else if (g_WinVersion < WINVER_WIN10) + else if (g_WinVersion == WINVER_VISTA) + Validate_ShimData_WinVista(info.pShimData, n, layers); + else if (g_WinVersion < WINVER_WIN8) Validate_ShimData_Win7(info.pShimData, szApphelp, n, layers); + else if (g_WinVersion < WINVER_WIN10) + Validate_ShimData_Win8(info.pShimData, szApphelp, n, layers); else Validate_ShimData_Win10(info.pShimData, szApphelp, n, layers); } @@ -538,8 +649,12 @@ static void Test_repeatlayer(WCHAR szApphelp[256]) /* Win10 only 'loads' one layer */ if (g_WinVersion < WINVER_VISTA) Validate_ShimData_Win2k3(info.pShimData, SDB_MAX_LAYERS, layers); - else if (g_WinVersion < WINVER_WIN10) + else if (g_WinVersion == WINVER_VISTA) + Validate_ShimData_WinVista(info.pShimData, SDB_MAX_LAYERS, layers); + else if (g_WinVersion < WINVER_WIN8) Validate_ShimData_Win7(info.pShimData, szApphelp, SDB_MAX_LAYERS, layers); + else if (g_WinVersion < WINVER_WIN10) + Validate_ShimData_Win8(info.pShimData, szApphelp, SDB_MAX_LAYERS, layers); else Validate_ShimData_Win10(info.pShimData, szApphelp, 1, layers); } @@ -636,7 +751,9 @@ static void Test_Shimdata(SDBQUERYRESULT_VISTA* result, const WCHAR* szLayer) if (pData) { ShimData_Win2k3* pWin2k3; + ShimData_WinVista* pWinVista; ShimData_Win7* pWin7; + ShimData_Win8* pWin8; ShimData_Win10_v1* pWin10; ShimData_Win10_v2* pWin10_v2; SDBQUERYRESULT_VISTA result2 = { { 0 } }; @@ -653,6 +770,12 @@ static void Test_Shimdata(SDBQUERYRESULT_VISTA* result, const WCHAR* szLayer) //ok(!memcmp(&pWin2k3->Query, result, sizeof(SDBQUERYRESULT_2k3)), "Expected pWin2k3->Query to equal result\n"); //ok_wstr(pWin7->szLayer, szLayer); break; + case sizeof(ShimData_WinVista): + pWinVista = (ShimData_WinVista*)pData; + ok_hex(pWinVista->dwMagic, SHIMDATA_MAGIC); + ok_int(pWinVista->dwSize, dwSize); + ok(!memcmp(&pWinVista->Query, result, sizeof(*result)), "Expected pWinVista->Query to equal result\n"); + break; case sizeof(ShimData_Win7): pWin7 = (ShimData_Win7*)pData; ok_hex(pWin7->dwMagic, SHIMDATA_MAGIC); @@ -660,6 +783,14 @@ static void Test_Shimdata(SDBQUERYRESULT_VISTA* result, const WCHAR* szLayer) ok(!memcmp(&pWin7->Query, result, sizeof(*result)), "Expected pWin7->Query to equal result\n"); ok_wstr(pWin7->szLayer, szLayer); break; + case sizeof(ShimData_Win8): + pWin8 = (ShimData_Win8*)pData; + ok_hex(pWin8->dwMagic, SHIMDATA_MAGIC); + ok_int(pWin8->dwSize, dwSize); + ok(!memcmp(&pWin8->Query, result, sizeof(*result)), "Expected pWin8->Query to equal result\n"); + ok_wstr(pWin8->szLayerEnv, szLayer); + ok_wstr(pWin8->szLayer, L""); + break; case sizeof(ShimData_Win10_v1): pWin10 = (ShimData_Win10_v1*)pData; ok_hex(pWin10->dwMagic, SHIMDATA_MAGIC); @@ -733,7 +864,7 @@ static void Test_GetMatchingExe(void) BOOL ret; SDBQUERYRESULT_VISTA result = { { 0 } }; WCHAR self[MAX_PATH]; - DWORD flags = (g_WinVersion < WINVER_VISTA) ? 0 : ((g_WinVersion < WINVER_WIN10) ? 1 : 0x21); + DWORD flags = (g_WinVersion <= WINVER_VISTA) ? 0 : ((g_WinVersion < WINVER_WIN10) ? 1 : 0x21); GetModuleFileNameW(NULL, self, MAX_PATH); SetEnvironmentVariableA("__COMPAT_LAYER", NULL); @@ -1277,6 +1408,8 @@ START_TEST(env) case WINVER_WIN7: pApphelpCheckRunAppEx_w7 = (void*)GetProcAddress(hdll, "ApphelpCheckRunAppEx"); break; + case WINVER_WIN8: + case WINVER_WIN81: case WINVER_WIN10: pApphelpCheckRunAppEx_w10 = (void*)GetProcAddress(hdll, "ApphelpCheckRunAppEx"); break; @@ -1296,7 +1429,7 @@ START_TEST(env) QueryOffset.dwSize_7_10 = 2; QueryOffset.dwSize_10_v2 = 3; - g_ShimDataSize = g_WinVersion < WINVER_WIN10 ? 4096 : 8192; + g_ShimDataSize = g_WinVersion < WINVER_WIN8 ? 4096 : 8192; _SEH2_TRY { ShimDataType = pSdbGetAppCompatDataSize(&QueryOffset); @@ -1314,7 +1447,8 @@ START_TEST(env) return; } - /* New version of Win10.. */ +#ifdef _M_IX86 + /* New version of Win10 */ if (g_WinVersion == WINVER_WIN10 && ShimDataType == 3) g_ShimDataSize = 4096; @@ -1333,6 +1467,9 @@ START_TEST(env) } Test_ApphelpCheckRunApp(szApphelp); +#else + skip("FIXME: apphelp:env tests invalid for non-x86 platforms.\n"); +#endif if (g_LayerDB) pSdbReleaseDatabase(g_LayerDB); }