/* Sets *matches to whether the file (whose path is filePath) matches the * versions set in sig. * Return ERROR_SUCCESS in case of success (whether or not the file matches), * something else if an install-halting error occurs. */ static UINT file_version_matches( MSIPACKAGE *package, const MSISIGNATURE *sig, const WCHAR *filePath, BOOL *matches ) { UINT len; void *version; VS_FIXEDFILEINFO *info = NULL; DWORD size = msi_get_file_version_info( package, filePath, 0, NULL ); *matches = FALSE; if (!size) return ERROR_SUCCESS; if (!(version = msi_alloc( size ))) return ERROR_OUTOFMEMORY; if (msi_get_file_version_info( package, filePath, size, version )) VerQueryValueW( version, szBackSlash, (void **)&info, &len ); if (info) { TRACE("comparing file version %d.%d.%d.%d:\n", HIWORD(info->dwFileVersionMS), LOWORD(info->dwFileVersionMS), HIWORD(info->dwFileVersionLS), LOWORD(info->dwFileVersionLS)); if (info->dwFileVersionMS < sig->MinVersionMS || (info->dwFileVersionMS == sig->MinVersionMS && info->dwFileVersionLS < sig->MinVersionLS)) { TRACE("less than minimum version %d.%d.%d.%d\n", HIWORD(sig->MinVersionMS), LOWORD(sig->MinVersionMS), HIWORD(sig->MinVersionLS), LOWORD(sig->MinVersionLS)); } else if ((sig->MaxVersionMS || sig->MaxVersionLS) && (info->dwFileVersionMS > sig->MaxVersionMS || (info->dwFileVersionMS == sig->MaxVersionMS && info->dwFileVersionLS > sig->MaxVersionLS))) { TRACE("greater than maximum version %d.%d.%d.%d\n", HIWORD(sig->MaxVersionMS), LOWORD(sig->MaxVersionMS), HIWORD(sig->MaxVersionLS), LOWORD(sig->MaxVersionLS)); } else if (!match_languages( version, sig->Languages )) { TRACE("languages %s not supported\n", debugstr_w( sig->Languages )); } else *matches = TRUE; } msi_free( version ); return ERROR_SUCCESS; }
/* Sets *matches to whether the file (whose path is filePath) matches the * versions set in sig. * Return ERROR_SUCCESS in case of success (whether or not the file matches), * something else if an install-halting error occurs. */ static UINT ACTION_FileVersionMatches(const MSISIGNATURE *sig, LPCWSTR filePath, BOOL *matches) { UINT len; void *version; VS_FIXEDFILEINFO *info = NULL; DWORD zero, size = GetFileVersionInfoSizeW( filePath, &zero ); *matches = FALSE; if (!size) return ERROR_SUCCESS; if (!(version = msi_alloc( size ))) return ERROR_OUTOFMEMORY; if (GetFileVersionInfoW( filePath, 0, size, version )) VerQueryValueW( version, szBackSlash, (void **)&info, &len ); if (info) { TRACE("comparing file version %d.%d.%d.%d:\n", HIWORD(info->dwFileVersionMS), LOWORD(info->dwFileVersionMS), HIWORD(info->dwFileVersionLS), LOWORD(info->dwFileVersionLS)); if (info->dwFileVersionMS < sig->MinVersionMS || (info->dwFileVersionMS == sig->MinVersionMS && info->dwFileVersionLS < sig->MinVersionLS)) { TRACE("less than minimum version %d.%d.%d.%d\n", HIWORD(sig->MinVersionMS), LOWORD(sig->MinVersionMS), HIWORD(sig->MinVersionLS), LOWORD(sig->MinVersionLS)); } else if ((sig->MaxVersionMS || sig->MaxVersionLS) && (info->dwFileVersionMS > sig->MaxVersionMS || (info->dwFileVersionMS == sig->MaxVersionMS && info->dwFileVersionLS > sig->MaxVersionLS))) { TRACE("greater than maximum version %d.%d.%d.%d\n", HIWORD(sig->MaxVersionMS), LOWORD(sig->MaxVersionMS), HIWORD(sig->MaxVersionLS), LOWORD(sig->MaxVersionLS)); } else if (!match_languages( version, sig->Languages )) { TRACE("languages %s not supported\n", debugstr_w( sig->Languages )); } else *matches = TRUE; } msi_free( version ); return ERROR_SUCCESS; }