ReactOS 0.4.17-dev-573-g8315b8c
apphelp.c
Go to the documentation of this file.
1/*
2 * PROJECT: apphelp_apitest
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Misc apphelp tests
5 * COPYRIGHT: Copyright 2012 Detlef Riekenberg
6 * Copyright 2013 Mislav Blažević
7 * Copyright 2015-2019 Mark Jansen (mark.jansen@reactos.org)
8 */
9
10#include <ntstatus.h>
11#define WIN32_NO_STATUS
12#include <windows.h>
13#include <shlwapi.h>
14#include <winnt.h>
15#ifdef __REACTOS__
16#include <ntndk.h>
17#else
18#include <winternl.h>
19#endif
20
21#include <winerror.h>
22#include <stdio.h>
23#include <initguid.h>
24#include <shlguid.h>
25#include <shobjidl.h>
26
27#include <pseh/pseh2.h>
28
29#include "wine/test.h"
30
31#include "apphelp_apitest.h"
32
33
34#define TAG_TYPE_MASK 0xF000
35
36#define TAG_TYPE_NULL 0x1000
37#define TAG_TYPE_BYTE 0x2000
38#define TAG_TYPE_WORD 0x3000
39#define TAG_TYPE_DWORD 0x4000
40#define TAG_TYPE_QWORD 0x5000
41#define TAG_TYPE_STRINGREF 0x6000
42#define TAG_TYPE_LIST 0x7000
43#define TAG_TYPE_STRING 0x8000
44#define TAG_TYPE_BINARY 0x9000
45#define TAG_NULL 0x0
46#define TAG_SIZE (0x1 | TAG_TYPE_DWORD)
47#define TAG_CHECKSUM (0x3 | TAG_TYPE_DWORD)
48#define TAG_MODULE_TYPE (0x6 | TAG_TYPE_DWORD)
49#define TAG_VERDATEHI (0x7 | TAG_TYPE_DWORD)
50#define TAG_VERDATELO (0x8 | TAG_TYPE_DWORD)
51#define TAG_VERFILEOS (0x9 | TAG_TYPE_DWORD)
52#define TAG_VERFILETYPE (0xA | TAG_TYPE_DWORD)
53#define TAG_PE_CHECKSUM (0xB | TAG_TYPE_DWORD)
54#define TAG_VER_LANGUAGE (0x12 | TAG_TYPE_DWORD)
55#define TAG_LINKER_VERSION (0x1C | TAG_TYPE_DWORD)
56#define TAG_LINK_DATE (0x1D | TAG_TYPE_DWORD)
57#define TAG_UPTO_LINK_DATE (0x1E | TAG_TYPE_DWORD)
58#define TAG_EXE_WRAPPER (0x31 | TAG_TYPE_DWORD)
59#define TAG_BIN_FILE_VERSION (0x2 | TAG_TYPE_QWORD)
60#define TAG_BIN_PRODUCT_VERSION (0x3 | TAG_TYPE_QWORD)
61#define TAG_UPTO_BIN_PRODUCT_VERSION (0x6 | TAG_TYPE_QWORD)
62#define TAG_UPTO_BIN_FILE_VERSION (0xD | TAG_TYPE_QWORD)
63#define TAG_NAME (0x1 | TAG_TYPE_STRINGREF)
64#define TAG_COMPANY_NAME (0x9 | TAG_TYPE_STRINGREF)
65#define TAG_PRODUCT_NAME (0x10 | TAG_TYPE_STRINGREF)
66#define TAG_PRODUCT_VERSION (0x11 | TAG_TYPE_STRINGREF)
67#define TAG_FILE_DESCRIPTION (0x12 | TAG_TYPE_STRINGREF)
68#define TAG_FILE_VERSION (0x13 | TAG_TYPE_STRINGREF)
69#define TAG_ORIGINAL_FILENAME (0x14 | TAG_TYPE_STRINGREF)
70#define TAG_INTERNAL_NAME (0x15 | TAG_TYPE_STRINGREF)
71#define TAG_LEGAL_COPYRIGHT (0x16 | TAG_TYPE_STRINGREF)
72#define TAG_16BIT_DESCRIPTION (0x17 | TAG_TYPE_STRINGREF)
73#define TAG_16BIT_MODULE_NAME (0x20 | TAG_TYPE_STRINGREF)
74#define TAG_EXPORT_NAME (0x24 | TAG_TYPE_STRINGREF)
75
76
77#define ATTRIBUTE_AVAILABLE 0x1
78#define ATTRIBUTE_FAILED 0x2
79
80typedef struct tagATTRINFO {
81 TAG type;
82 DWORD flags; /* ATTRIBUTE_AVAILABLE, ATTRIBUTE_FAILED */
83 union {
87 };
89
91static BOOL (WINAPI *pApphelpCheckShellObject)(REFCLSID, BOOL, ULONGLONG *);
92static LPCWSTR (WINAPI *pSdbTagToString)(TAG tag);
93static BOOL (WINAPI *pSdbGUIDToString)(REFGUID Guid, PWSTR GuidString, SIZE_T Length);
94static BOOL (WINAPI *pSdbIsNullGUID)(REFGUID Guid);
95static BOOL (WINAPI *pSdbGetStandardDatabaseGUID)(DWORD Flags, GUID* Guid);
96static BOOL (WINAPI *pSdbGetFileAttributes)(LPCWSTR wszPath, PATTRINFO *ppAttrInfo, LPDWORD pdwAttrCount);
97static BOOL (WINAPI *pSdbFreeFileAttributes)(PATTRINFO AttrInfo);
98static HRESULT (WINAPI* pSdbGetAppPatchDir)(PVOID hsdb, LPWSTR path, DWORD size);
100
101/* 'Known' database guids */
102DEFINE_GUID(GUID_DATABASE_MSI,0xd8ff6d16,0x6a3a,0x468a,0x8b,0x44,0x01,0x71,0x4d,0xdc,0x49,0xea);
103DEFINE_GUID(GUID_DATABASE_SHIM,0x11111111,0x1111,0x1111,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11);
104DEFINE_GUID(GUID_DATABASE_DRIVERS,0xf9ab2228,0x3312,0x4a73,0xb6,0xf9,0x93,0x6d,0x70,0xe1,0x12,0xef);
105
106DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
107
108DEFINE_GUID(test_Microsoft_Browser_Architecture, 0xa5e46e3a, 0x8849, 0x11d1, 0x9d, 0x8c, 0x00, 0xc0, 0x4f, 0xc9, 0x9d, 0x61);
109DEFINE_GUID(test_UserAssist, 0xdd313e04, 0xfeff, 0x11d1, 0x8e, 0xcd, 0x00, 0x00, 0xf8, 0x7a, 0x47, 0x0c);
110DEFINE_GUID(CLSID_InternetSecurityManager, 0x7b8a2d94, 0x0ac9, 0x11d1, 0x89, 0x6c, 0x00, 0xc0, 0x4f, 0xB6, 0xbf, 0xc4);
111
112static const CLSID * objects[] = {
113 &GUID_NULL,
114 /* used by IE */
115 &test_Microsoft_Browser_Architecture,
116 &CLSID_MenuBand,
117 &CLSID_ShellLink,
118 &CLSID_ShellWindows,
119 &CLSID_InternetSecurityManager,
120 &test_UserAssist,
121 (const CLSID *)NULL
122};
123
125{
127 BOOL res;
128 int i;
129
130 if (!pApphelpCheckShellObject)
131 {
132 win_skip("ApphelpCheckShellObject not available\n");
133 return;
134 }
135
136 for (i = 0; objects[i]; i++)
137 {
138 flags = 0xdeadbeef;
139 SetLastError(0xdeadbeef);
140 res = pApphelpCheckShellObject(objects[i], FALSE, &flags);
141 ok(res && (flags == 0), "%s 0: got %d and 0x%lx%08lx with 0x%lx (expected TRUE and 0)\n",
143
144 flags = 0xdeadbeef;
145 SetLastError(0xdeadbeef);
146 res = pApphelpCheckShellObject(objects[i], TRUE, &flags);
147 ok(res && (flags == 0), "%s 1: got %d and 0x%lx%08lx with 0x%lx (expected TRUE and 0)\n",
149
150 }
151
152 /* NULL as pointer to flags is checked */
153 SetLastError(0xdeadbeef);
154 res = pApphelpCheckShellObject(&GUID_NULL, FALSE, NULL);
155 ok(res, "%s 0: got %d with 0x%lx (expected != FALSE)\n", wine_dbgstr_guid(&GUID_NULL), res, GetLastError());
156
157 /* NULL as CLSID* crash on Windows */
158 if (0)
159 {
160 flags = 0xdeadbeef;
161 SetLastError(0xdeadbeef);
162 res = pApphelpCheckShellObject(NULL, FALSE, &flags);
163 trace("NULL as CLSID*: got %d and 0x%lx%08lx with 0x%lx\n", res, (ULONG)(flags >> 32), (ULONG)flags, GetLastError());
164 }
165}
166
167static void test_SdbTagToString(void)
168{
169 static const TAG invalid_values[] = {
171 TAG_TYPE_DWORD | 0xFF,
172 TAG_TYPE_DWORD | (0x800 + 0xEE),
173 0x900, 0xFFFF, 0xDEAD, 0xBEEF
174 };
175 static const WCHAR invalid[] = {'I','n','v','a','l','i','d','T','a','g',0};
176 LPCWSTR ret;
177 WORD i;
178
179 for (i = 0; i < 9; ++i)
180 {
181 ret = pSdbTagToString(invalid_values[i]);
182 ok(lstrcmpW(ret, invalid) == 0, "unexpected string %s, should be %s\n",
183 wine_dbgstr_w(ret), wine_dbgstr_w(invalid));
184 }
185}
186
187static int strcmp_wa(LPCWSTR strw, const char *stra)
188{
189 CHAR buf[512];
190 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
191 return lstrcmpA(buf, stra);
192}
193
194void test_tag(TAG base, const char* names[], size_t upperlimit, int line)
195{
196 TAG n;
197 for (n = 0; names[n]; ++n)
198 {
199 LPCWSTR tagstr = pSdbTagToString(base | n);
200 ok_(__FILE__, line + 2)(!strcmp_wa(tagstr, names[n]), "Got %s instead of '%s' for %x\n", wine_dbgstr_w(tagstr), names[n], base | n);
201 }
202 for (; n < upperlimit; ++n)
203 {
204 LPCWSTR tagstr = pSdbTagToString(base | n);
205 ok_(__FILE__, line + 2)(!strcmp_wa(tagstr, "InvalidTag"), "Got %s instead of 'InvalidTag' for %x\n", wine_dbgstr_w(tagstr), base | n);
206 }
207}
208
209static struct
210{
216 const char* tags[99];
217} data[] = {
218 {
219 TAG_TYPE_NULL, 0x1000, __LINE__, WINVER_ANY, WINVER_2003,
220 {
221 "InvalidTag", "INCLUDE", "GENERAL", "MATCH_LOGIC_NOT", "APPLY_ALL_SHIMS", "USE_SERVICE_PACK_FILES", NULL
222 }
223 },
224 {
225 TAG_TYPE_NULL, 0x1000, __LINE__, WINVER_VISTA, WINVER_VISTA,
226 {
227 "InvalidTag", "INCLUDE", "GENERAL", "MATCH_LOGIC_NOT", "APPLY_ALL_SHIMS", "USE_SERVICE_PACK_FILES", "MITIGATION_OS", "BLOCK_UPGRADE",
228 "INCLUDEEXCLUDEDLL", NULL
229 }
230 },
231 {
232 TAG_TYPE_NULL, 0x1000, __LINE__, WINVER_WIN7, WINVER_WIN7,
233 {
234 "InvalidTag", "INCLUDE", "GENERAL", "MATCH_LOGIC_NOT", "APPLY_ALL_SHIMS", "USE_SERVICE_PACK_FILES", "MITIGATION_OS", "BLOCK_UPGRADE",
235 "INCLUDEEXCLUDEDLL", "RAC_EVENT_OFF", "TELEMETRY_OFF", "SHIM_ENGINE_OFF", "LAYER_PROPAGATION_OFF", "REINSTALL_UPGRADE", NULL
236 }
237 },
238 {
239 TAG_TYPE_NULL, 0x1000, __LINE__, WINVER_WIN8, WINVER_WIN81,
240 {
241 "InvalidTag", "INCLUDE", "GENERAL", "MATCH_LOGIC_NOT", "APPLY_ALL_SHIMS", "USE_SERVICE_PACK_FILES", "MITIGATION_OS", "TRACE_PCA",
242 "INCLUDEEXCLUDEDLL", "RAC_EVENT_OFF", "TELEMETRY_OFF", "SHIM_ENGINE_OFF", "LAYER_PROPAGATION_OFF", "FORCE_CACHE", "MONITORING_OFF",
243 "QUIRK_OFF", "ELEVATED_PROP_OFF", "UPGRADE_ACTION_BLOCK_WEBSETUP", "UPGRADE_ACTION_PROCEED_TO_MEDIASETUP", NULL
244 }
245 },
246 {
247 TAG_TYPE_NULL, 0x1000, __LINE__, WINVER_WIN10, WINVER_ANY,
248 {
249 "InvalidTag", "INCLUDE", "GENERAL", "MATCH_LOGIC_NOT", "APPLY_ALL_SHIMS", "USE_SERVICE_PACK_FILES", "MITIGATION_OS", "TRACE_PCA",
250 "INCLUDEEXCLUDEDLL", "RAC_EVENT_OFF", "TELEMETRY_OFF", "SHIM_ENGINE_OFF", "LAYER_PROPAGATION_OFF", "FORCE_CACHE", "MONITORING_OFF",
251 "QUIRK_OFF", "ELEVATED_PROP_OFF", "UPGRADE_ACTION_BLOCK_WEBSETUP", "UPGRADE_ACTION_PROCEED_TO_MEDIASETUP", "HWCOMPAT_DEVICE",
252 "HWEXCLUDE_DEVICE", "WUCOMPAT_DEVICE", "APPEND_COMMANDLINE", "COMPARE_CASE", "InvalidTag", "InvalidTag", "MATCHED_OBJECT",
253 "USE_INVENTORY", NULL
254 }
255 },
256
257 {
258 TAG_TYPE_BYTE, 0x1000, __LINE__, WINVER_ANY, WINVER_ANY,
259 {
260 "InvalidTag", NULL
261 }
262 },
263
264 {
265 TAG_TYPE_WORD, 0x800, __LINE__, WINVER_ANY, WINVER_WIN7,
266 {
267 "InvalidTag", "MATCH_MODE", NULL
268 }
269 },
270 {
271 TAG_TYPE_WORD, 0x800, __LINE__, WINVER_WIN8, WINVER_ANY,
272 {
273 "InvalidTag", "MATCH_MODE", "QUIRK_COMPONENT_CODE_ID", "QUIRK_CODE_ID", NULL
274 }
275 },
276 {
277 TAG_TYPE_WORD | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY,
278 {
279 "InvalidTag", "TAG", "INDEX_TAG", "INDEX_KEY", NULL
280 }
281 },
282
283 {
284 TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_ANY, WINVER_WINXP,
285 {
286 "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERFILEDATEHI",
287 "VERFILEDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVERSION", "PREVOSMINORVERSION", "PREVOSPLATFORMID", "PREVOSBUILDNO",
288 "PROBLEM_SEVERITY", "APPHELP_LANGID", "VER_LANGUAGE", "InvalidTag", "ENGINE", "HTMLHELPID", "INDEXFLAGS", "FLAGS",
289 "VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "OS_SERVICE_PACK",
290 "FLAG_TAGID", "RUNTIME_PLATFORM", "OS_SKU", NULL
291 }
292 },
293 {
294 TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_2003, WINVER_2003,
295 {
296 "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERFILEDATEHI",
297 "VERFILEDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVERSION", "PREVOSMINORVERSION", "PREVOSPLATFORMID", "PREVOSBUILDNO",
298 "PROBLEM_SEVERITY", "APPHELP_LANGID", "VER_LANGUAGE", "InvalidTag", "ENGINE", "HTMLHELPID", "INDEXFLAGS", "FLAGS",
299 "VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "OS_SERVICE_PACK",
300 "FLAG_TAGID", "RUNTIME_PLATFORM", "OS_SKU", "OS_PLATFORM", NULL
301 }
302 },
303 {
304 TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_VISTA, WINVER_VISTA,
305 {
306 "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERDATEHI",
307 "VERDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVER", "PREVOSMINORVER", "PREVOSPLATFORMID", "PREVOSBUILDNO",
308 "PROBLEMSEVERITY", "LANGID", "VER_LANGUAGE", "InvalidTag", "ENGINE", "HTMLHELPID", "INDEX_FLAGS", "FLAGS",
309 "DATA_VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "OS_SERVICE_PACK",
310 "FLAG_TAGID", "RUNTIME_PLATFORM", "OS_SKU", "OS_PLATFORM", "APP_NAME_RC_ID", "VENDOR_NAME_RC_ID", "SUMMARY_MSG_RC_ID", "VISTA_SKU",
311 NULL
312 }
313 },
314 {
315 TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_WIN7, WINVER_WIN7,
316 {
317 "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERDATEHI",
318 "VERDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVER", "PREVOSMINORVER", "PREVOSPLATFORMID", "PREVOSBUILDNO",
319 "PROBLEMSEVERITY", "LANGID", "VER_LANGUAGE", "InvalidTag", "ENGINE", "HTMLHELPID", "INDEX_FLAGS", "FLAGS",
320 "DATA_VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "OS_SERVICE_PACK",
321 "FLAG_TAGID", "RUNTIME_PLATFORM", "OS_SKU", "OS_PLATFORM", "APP_NAME_RC_ID", "VENDOR_NAME_RC_ID", "SUMMARY_MSG_RC_ID", "VISTA_SKU",
322 "DESCRIPTION_RC_ID", "PARAMETER1_RC_ID", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
323 "CONTEXT_TAGID", "EXE_WRAPPER", "URL_ID", NULL
324 }
325 },
326 {
327 TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_WIN8, WINVER_WIN81,
328 {
329 "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERDATEHI",
330 "VERDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVER", "PREVOSMINORVER", "PREVOSPLATFORMID", "PREVOSBUILDNO",
331 "PROBLEMSEVERITY", "LANGID", "VER_LANGUAGE", "InvalidTag", "ENGINE", "HTMLHELPID", "INDEX_FLAGS", "FLAGS",
332 "DATA_VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "OS_SERVICE_PACK",
333 "FLAG_TAGID", "RUNTIME_PLATFORM", "OS_SKU", "OS_PLATFORM", "APP_NAME_RC_ID", "VENDOR_NAME_RC_ID", "SUMMARY_MSG_RC_ID", "InvalidTag",
334 "DESCRIPTION_RC_ID", "PARAMETER1_RC_ID", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
335 "CONTEXT_TAGID", "EXE_WRAPPER", "EXE_TYPE", "FROM_LINK_DATE", "REVISION_EQ", "REVISION_LE", "REVISION_GE", "DATE_EQ", "DATE_LE", "DATE_GE",
336 "CPU_MODEL_EQ", "CPU_MODEL_LE", "CPU_MODEL_GE", "CPU_FAMILY_EQ", "CPU_FAMILY_LE", "CPU_FAMILY_GE", "CREATOR_REVISION_EQ", "CREATOR_REVISION_LE",
337 "CREATOR_REVISION_GE", "SIZE_OF_IMAGE", "SHIM_CLASS", "PACKAGEID_ARCHITECTURE", "REINSTALL_UPGRADE_TYPE", "BLOCK_UPGRADE_TYPE", "ROUTING_MODE",
338 "OS_VERSION_VALUE", "CRC_CHECKSUM", "URL_ID", "QUIRK_TAGID", "InvalidTag", "MIGRATION_DATA_TYPE", "UPGRADE_DATA", "MIGRATION_DATA_TAGID", "REG_VALUE_TYPE",
339 "REG_VALUE_DATA_DWORD", "TEXT_ENCODING", NULL
340 }
341 },
342 {
343 TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_WIN10, WINVER_ANY,
344 {
345 "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERDATEHI",
346 "VERDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVER", "PREVOSMINORVER", "PREVOSPLATFORMID", "PREVOSBUILDNO",
347 "PROBLEMSEVERITY", "LANGID", "VER_LANGUAGE", "OS_KIND", "ENGINE", "HTMLHELPID", "INDEX_FLAGS", "FLAGS",
348 "DATA_VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "InvalidTag",
349 "FLAG_TAGID", "RUNTIME_PLATFORM", "InvalidTag", "GUEST_TARGET_PLATFORM", "APP_NAME_RC_ID", "VENDOR_NAME_RC_ID", "SUMMARY_MSG_RC_ID", "InvalidTag",
350 "DESCRIPTION_RC_ID", "PARAMETER1_RC_ID", "HWCOMPAT_HWID_COUNT", "TITLE_MSG_RC_ID_BACKUP", "SUMMARY_MSG_RC_ID_BACKUP", "InvalidTag", "InvalidTag", "InvalidTag",
351 "CONTEXT_TAGID", "EXE_WRAPPER", "EXE_TYPE", "FROM_LINK_DATE", "REVISION_EQ", "REVISION_LE", "REVISION_GE", "DATE_EQ", "DATE_LE", "DATE_GE",
352 "CPU_MODEL_EQ", "CPU_MODEL_LE", "CPU_MODEL_GE", "CPU_FAMILY_EQ", "CPU_FAMILY_LE", "CPU_FAMILY_GE", "CREATOR_REVISION_EQ", "CREATOR_REVISION_LE",
353 "CREATOR_REVISION_GE", "SIZE_OF_IMAGE", "SHIM_CLASS", "PACKAGEID_ARCHITECTURE", "REINSTALL_UPGRADE_TYPE", "BLOCK_UPGRADE_TYPE", "ROUTING_MODE",
354 "OS_VERSION_VALUE", "CRC_CHECKSUM", "URL_ID", "QUIRK_TAGID", "InvalidTag", "MIGRATION_DATA_TYPE", "UPGRADE_DATA", "MIGRATION_DATA_TAGID", "REG_VALUE_TYPE",
355 "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",
356 "LINK_TEXT_RC_ID_BACKUP", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "REQUESTED_ATTRIBUTES", "BACKUP_LABEL", NULL
357 }
358 },
359 {
360 TAG_TYPE_DWORD | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY,
361 {
362 "InvalidTag", "TAGID", NULL
363 }
364 },
365
366 {
367 TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_ANY, WINVER_WINXP,
368 {
369 "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD",
370 "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", NULL
371 }
372 },
373 {
374 TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_2003, WINVER_2003,
375 {
376 "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD",
377 "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", "FLAG_MASK_FUSION", "FLAGS_PROCESSPARAM",
378 NULL
379 }
380 },
381 {
382 TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_VISTA, WINVER_WIN7,
383 {
384 "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD",
385 "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", "FLAG_MASK_FUSION", "FLAG_PROCESSPARAM",
386 "FLAG_LUA", "FLAG_INSTALL", NULL
387 }
388 },
389 {
390 TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_WIN8, WINVER_WIN81,
391 {
392 "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD",
393 "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", "FLAG_MASK_FUSION", "FLAG_PROCESSPARAM",
394 "FLAG_LUA", "FLAG_INSTALL", "FROM_BIN_PRODUCT_VERSION", "FROM_BIN_FILE_VERSION", "PACKAGEID_VERSION", "FROM_PACKAGEID_VERSION", "UPTO_PACKAGEID_VERSION",
395 "OSMAXVERSIONTESTED", "FROM_OSMAXVERSIONTESTED", "UPTO_OSMAXVERSIONTESTED", "FLAG_MASK_WINRT", "REG_VALUE_DATA_QWORD", "QUIRK_ENABLED_UPTO_VERSION", NULL
396 }
397 },
398 {
399 TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_WIN10, WINVER_ANY,
400 {
401 "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD",
402 "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", "FLAG_MASK_FUSION", "FLAG_PROCESSPARAM",
403 "FLAG_LUA", "FLAG_INSTALL", "FROM_BIN_PRODUCT_VERSION", "FROM_BIN_FILE_VERSION", "PACKAGEID_VERSION", "FROM_PACKAGEID_VERSION", "UPTO_PACKAGEID_VERSION",
404 "OSMAXVERSIONTESTED", "FROM_OSMAXVERSIONTESTED", "UPTO_OSMAXVERSIONTESTED", "FLAG_MASK_WINRT", "REG_VALUE_DATA_QWORD", "QUIRK_ENABLED_VERSION_LT",
405 "SOURCE_OS", "SOURCE_OS_LTE", "SOURCE_OS_GTE", "FILESIZE", NULL
406 }
407 },
408
409 {
410 TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_ANY, WINVER_2003,
411 {
412 "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag",
413 "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
414 "PRODUCT_NAME", "PRODUCT_VERSION", "FILE_DESCRIPTION", "FILE_VERSION", "ORIGINAL_FILENAME", "INTERNAL_NAME", "LEGAL_COPYRIGHT", "S16BIT_DESCRIPTION",
415 "PROBLEM_DETAILS", "LINK_URL", "LINK_TEXT", "APPHELP_TITLE", "APPHELP_CONTACT", "SXS_MANIFEST", "DATA_STRING", "MSI_TRANSFORM_FILE",
416 "S16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", NULL
417 }
418 },
419 {
420 TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_VISTA, WINVER_VISTA,
421 {
422 "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag",
423 "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
424 "PRODUCT_NAME", "PRODUCT_VERSION", "FILE_DESCRIPTION", "FILE_VERSION", "ORIGINAL_FILENAME", "INTERNAL_NAME", "LEGAL_COPYRIGHT", "16BIT_DESCRIPTION",
425 "APPHELP_DETAILS", "LINK_URL", "LINK_TEXT", "APPHELP_TITLE", "APPHELP_CONTACT", "SXS_MANIFEST", "DATA_STRING", "MSI_TRANSFORM_FILE",
426 "16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", "EXPORT_NAME", NULL
427 }
428 },
429 {
430 TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_WIN7, WINVER_WIN7,
431 {
432 "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag",
433 "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
434 "PRODUCT_NAME", "PRODUCT_VERSION", "FILE_DESCRIPTION", "FILE_VERSION", "ORIGINAL_FILENAME", "INTERNAL_NAME", "LEGAL_COPYRIGHT", "16BIT_DESCRIPTION",
435 "APPHELP_DETAILS", "LINK_URL", "LINK_TEXT", "APPHELP_TITLE", "APPHELP_CONTACT", "SXS_MANIFEST", "DATA_STRING", "MSI_TRANSFORM_FILE",
436 "16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", "EXPORT_NAME", "URL", NULL
437 }
438 },
439 {
440 TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_WIN8, WINVER_WIN81,
441 {
442 "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag",
443 "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
444 "PRODUCT_NAME", "PRODUCT_VERSION", "FILE_DESCRIPTION", "FILE_VERSION", "ORIGINAL_FILENAME", "INTERNAL_NAME", "LEGAL_COPYRIGHT", "16BIT_DESCRIPTION",
445 "APPHELP_DETAILS", "LINK_URL", "LINK_TEXT", "APPHELP_TITLE", "APPHELP_CONTACT", "SXS_MANIFEST", "DATA_STRING", "MSI_TRANSFORM_FILE",
446 "16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", "EXPORT_NAME", "VENDOR_ID", "DEVICE_ID", "SUB_VENDOR_ID",
447 "SUB_SYSTEM_ID", "PACKAGEID_NAME", "PACKAGEID_PUBLISHER", "PACKAGEID_LANGUAGE", "URL", "MANUFACTURER", "MODEL", "DATE", "REG_VALUE_NAME",
448 "REG_VALUE_DATA_SZ", "MIGRATION_DATA_TEXT", NULL
449 }
450 },
451 {
452 TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_WIN10, WINVER_ANY,
453 {
454 "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag",
455 "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
456 "PRODUCT_NAME", "PRODUCT_VERSION", "FILE_DESCRIPTION", "FILE_VERSION", "ORIGINAL_FILENAME", "INTERNAL_NAME", "LEGAL_COPYRIGHT", "16BIT_DESCRIPTION",
457 "APPHELP_DETAILS", "LINK_URL", "LINK_TEXT", "APPHELP_TITLE", "APPHELP_CONTACT", "SXS_MANIFEST", "DATA_STRING", "MSI_TRANSFORM_FILE",
458 "16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", "EXPORT_NAME", "VENDOR_ID", "DEVICE_ID", "SUB_VENDOR_ID",
459 "SUB_SYSTEM_ID", "PACKAGEID_NAME", "PACKAGEID_PUBLISHER", "PACKAGEID_LANGUAGE", "URL", "MANUFACTURER", "MODEL", "DATE", "REG_VALUE_NAME",
460 "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",
461 "PACKAGE_STRONGNAME", "FALLBACK_XML", "LINK_TEXT_OVERRIDE", "MATCH_LOGIC_NOT_IF_SDB_CAPABILITY_EXISTS", "ESCAPE_CHARACTER", "InvalidTag",
462 "InvalidTag", "InvalidTag", "InvalidTag", "PUBLISHER", "MATCHING_LABEL", "UPTO_PRODUCT_VERSION", "UPTO_FILE_VERSION", "FROM_PRODUCT_VERSION",
463 "FROM_FILE_VERSION", "LANGUAGE", NULL
464 }
465 },
466
467 {
468 TAG_TYPE_LIST, 0x800, __LINE__, WINVER_ANY, WINVER_2003,
469 {
470 "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE",
471 "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA",
472 "MSI TRANSFORM", "MSI TRANSFORM REF", "MSI PACKAGE", "FLAG", "MSI CUSTOM ACTION", "FLAG_REF", "ACTION", NULL
473 }
474 },
475 {
476 TAG_TYPE_LIST, 0x800, __LINE__, WINVER_VISTA, WINVER_VISTA,
477 {
478 "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE",
479 "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA",
480 "MSI_TRANSFORM", "MSI_TRANSFORM_REF", "MSI_PACKAGE", "FLAG", "MSI_CUSTOM_ACTION", "FLAG_REF", "ACTION", "LOOKUP",
481 NULL
482 }
483 },
484 {
485 TAG_TYPE_LIST, 0x800, __LINE__, WINVER_WIN7, WINVER_WIN7,
486 {
487 "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE",
488 "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA",
489 "MSI_TRANSFORM", "MSI_TRANSFORM_REF", "MSI_PACKAGE", "FLAG", "MSI_CUSTOM_ACTION", "FLAG_REF", "ACTION", "LOOKUP",
490 "CONTEXT", "CONTEXT_REF", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
491 "SPC", NULL
492 }
493 },
494 {
495 TAG_TYPE_LIST, 0x800, __LINE__, WINVER_WIN8, WINVER_WIN81,
496 {
497 "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE",
498 "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA",
499 "MSI_TRANSFORM", "MSI_TRANSFORM_REF", "MSI_PACKAGE", "FLAG", "MSI_CUSTOM_ACTION", "FLAG_REF", "ACTION", "LOOKUP",
500 "CONTEXT", "CONTEXT_REF", "KDEVICE", "InvalidTag", "KDRIVER", "InvalidTag", "MATCHING_DEVICE", "ACPI",
501 "BIOS", "CPU", "OEM", "KFLAG", "KFLAG_REF", "KSHIM", "KSHIM_REF", "REINSTALL_UPGRADE", "KDATA", "BLOCK_UPGRADE",
502 "SPC", "QUIRK", "QUIRK_REF", "BIOS_BLOCK", "MATCHING_INFO_BLOCK", "DEVICE_BLOCK", "MIGRATION_DATA", "MIGRATION_DATA_REF",
503 "MATCHING_REG", "MATCHING_TEXT", "MACHINE_BLOCK", "OS_UPGRADE", "PACKAGE", NULL
504 }
505 },
506 {
507 TAG_TYPE_LIST, 0x800, __LINE__, WINVER_WIN10, WINVER_ANY,
508 {
509 "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE",
510 "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA",
511 "MSI_TRANSFORM", "MSI_TRANSFORM_REF", "MSI_PACKAGE", "FLAG", "MSI_CUSTOM_ACTION", "FLAG_REF", "ACTION", "LOOKUP",
512 "CONTEXT", "CONTEXT_REF", "KDEVICE", "InvalidTag", "KDRIVER", "InvalidTag", "MATCHING_DEVICE", "ACPI",
513 "BIOS", "CPU", "OEM", "KFLAG", "KFLAG_REF", "KSHIM", "KSHIM_REF", "REINSTALL_UPGRADE", "KDATA", "BLOCK_UPGRADE",
514 "InvalidTag", "QUIRK", "QUIRK_REF", "BIOS_BLOCK", "MATCHING_INFO_BLOCK", "DEVICE_BLOCK", "MIGRATION_DATA", "MIGRATION_DATA_REF",
515 "MATCHING_REG", "MATCHING_TEXT", "MACHINE_BLOCK", "OS_UPGRADE", "PACKAGE", "PICK_ONE", "MATCH_PLUGIN", "MIGRATION_SHIM",
516 "UPGRADE_DRIVER_BLOCK", "InvalidTag", "MIGRATION_SHIM_REF", "CONTAINS_FILE", "CONTAINS_HWID", "DRIVER_PACKAGE_BLOCK",
517 "DEST_OS_VALUES", "XAP", "HWCOMPAT_SOURCES", "HWCOMPAT_SOURCE_INFO", "C_STRUCT", "PROCESS_MODULE", "C_STRUCT_REF",
518 "MATCHING_WILDCARD_FILE", "MATCHING_WILDCARD_REG", "MATCHING_DIR", "MATCHING_SDB_CAPABILITY", "MATCHING_COMMAND_LINE",
519 "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
520 "BACKUP_FILE", "BACKUP_APPLICATION", "BACKUP_PACKAGE", "RESTORE_FILE", "RESTORE_APPLICATION", "RESTORE_PACKAGE",
521 "BACKUP_INCLUDE_FILE", "MATCHING_BACKUP_FILE", "MATCHING_WILDCARD_BACKUP_FILE", "RESTORE_ACTION", "MATCHING_BACKUP_LABEL",
522 "MATCHING_RESTORE_ACTION", "MATCHING_APPLICATION_ATTRIBUTES", NULL
523 }
524 },
525 {
526 TAG_TYPE_LIST | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY,
527 {
528 "InvalidTag", "STRINGTABLE", "INDEXES", "INDEX", NULL
529 }
530 },
531
532 {
533 TAG_TYPE_STRING, 0x800, __LINE__, WINVER_ANY, WINVER_ANY,
534 {
535 "InvalidTag", NULL
536 }
537 },
538 {
539 TAG_TYPE_STRING | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_2003,
540 {
541 "InvalidTag", "STRTAB_ITEM", NULL
542 }
543 },
544 {
545 TAG_TYPE_STRING | 0x800, 0x800, __LINE__, WINVER_VISTA, WINVER_ANY,
546 {
547 "InvalidTag", "STRINGTABLE_ITEM", NULL
548 }
549 },
550
551
552 {
553 TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_ANY, WINVER_2003,
554 {
555 "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID(GUID)", "DATA_BITS", "MSI_PACKAGE_ID(GUID)", "DATABASE_ID(GUID)",
556 NULL
557 }
558 },
559 {
560 TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_VISTA, WINVER_VISTA,
561 {
562 "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID", "DATA_BITS", "MSI_PACKAGE_ID", "DATABASE_ID",
563 NULL
564 }
565 },
566 {
567 TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_WIN7, WINVER_WIN7,
568 {
569 "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID", "DATA_BITS", "MSI_PACKAGE_ID", "DATABASE_ID",
570 "CONTEXT_PLATFORM_ID", "CONTEXT_BRANCH_ID", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
571 "FIX_ID", "APP_ID", NULL
572 }
573 },
574 {
575 TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_WIN8, WINVER_WIN81,
576 {
577 "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID", "DATA_BITS", "MSI_PACKAGE_ID", "DATABASE_ID",
578 "CONTEXT_PLATFORM_ID", "CONTEXT_BRANCH_ID", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
579 "FIX_ID", "APP_ID", "REG_VALUE_DATA_BINARY", "TEXT", NULL
580 }
581 },
582 {
583 TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_WIN10, WINVER_ANY,
584 {
585 "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID", "DATA_BITS", "MSI_PACKAGE_ID", "DATABASE_ID",
586 "CONTEXT_PLATFORM_ID", "CONTEXT_BRANCH_ID", "XAP_ID", "C_STRUCT_BIN_DATA", "C_STRUCT_VERSION", "InvalidTag",
587 "InvalidTag", "InvalidTag", "FIX_ID", "APP_ID", "REG_VALUE_DATA_BINARY", "TEXT", "BACKUP_ID", NULL
588 }
589 },
590 {
591 TAG_TYPE_BINARY | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY,
592 {
593 "InvalidTag", "INDEX_BITS", NULL
594 }
595 },
596
597 { 0, 0, 0, 0, 0, { NULL } }
599
600
602{
603 int n;
604 for (n = 0; data[n].base; ++n)
605 {
606 if ((data[n].min_ver == WINVER_ANY || g_WinVersion >= data[n].min_ver) &&
608 {
610 }
611 }
612}
613
614static void test_GuidFunctions(void)
615{
616 GUID guid;
617 ok(pSdbIsNullGUID(&GUID_NULL), "expected GUID_NULL to be recognized as NULL GUID\n");
618 ok(pSdbIsNullGUID(NULL), "expected NULL to be recognized as NULL GUID\n");
619 ok(pSdbIsNullGUID(&test_UserAssist) == 0, "expected a set GUID not to be recognized as NULL GUID\n");
620
621 memset(&guid, 0, sizeof(guid));
622 ok(pSdbGetStandardDatabaseGUID(0, &guid) == 0,"Expected SdbGetStandardDatabaseGUID to fail\n");
623 ok(IsEqualGUID(&GUID_NULL, &guid), "Expected guid not to be changed\n");
624
625 ok(pSdbGetStandardDatabaseGUID(0x80020000, NULL),"Expected SdbGetStandardDatabaseGUID to succeed\n");
626
627 memset(&guid, 0, sizeof(guid));
628 ok(pSdbGetStandardDatabaseGUID(0x80020000, &guid),"Expected SdbGetStandardDatabaseGUID to succeed\n");
629 ok(IsEqualGUID(&GUID_DATABASE_MSI, &guid), "Expected guid to equal GUID_DATABASE_MSI, was: %s\n", wine_dbgstr_guid(&guid));
630
631 memset(&guid, 0, sizeof(guid));
632 ok(pSdbGetStandardDatabaseGUID(0x80030000, &guid),"Expected SdbGetStandardDatabaseGUID to succeed\n");
633 ok(IsEqualGUID(&GUID_DATABASE_SHIM, &guid), "Expected guid to equal GUID_DATABASE_SHIM, was: %s\n", wine_dbgstr_guid(&guid));
634
635 memset(&guid, 0, sizeof(guid));
636 ok(pSdbGetStandardDatabaseGUID(0x80040000, &guid),"Expected SdbGetStandardDatabaseGUID to succeed\n");
637 ok(IsEqualGUID(&GUID_DATABASE_DRIVERS, &guid), "Expected guid to equal GUID_DATABASE_DRIVERS, was: %s\n", wine_dbgstr_guid(&guid));
638}
639
640static TAG g_Tags_26[] = {
641 TAG_SIZE,
653 TAG_VERDATEHI, /* TAG_VERFILEDATEHI */
654 TAG_VERDATELO, /* TAG_VERFILEDATELO */
660 TAG_16BIT_DESCRIPTION, /* CHECKME! */
661 TAG_16BIT_MODULE_NAME, /* CHECKME! */
667 0
668};
669
670static TAG g_Tags_28[] = {
671 TAG_SIZE,
699 0
700};
701
703{
704 DWORD n;
705 TAG* allTags;
706 switch (g_AttrInfoSize)
707 {
708 case 26:
709 allTags = g_Tags_26;
710 break;
711 case 28:
712 allTags = g_Tags_28;
713 break;
714 default:
715 return ~0;
716 }
717
718 for (n = 0; n < allTags[n]; ++n)
719 {
720 if (allTags[n] == tag)
721 return n;
722 }
723 return ~0;
724}
725
727{
729 PATTRINFO p;
730
731 if (num == ~0)
732 return;
733
734 p = &pattr[num];
735 winetest_ok(p->type == TAG_NULL, "expected entry #%ld to be TAG_NULL, was %x\n", num, p->type);
736 winetest_ok(p->flags == ATTRIBUTE_FAILED, "expected entry #%ld to be failed, was %ld\n", num, p->flags);
737 winetest_ok(p->qwattr == 0, "expected entry #%ld to be 0, was 0x%I64x\n", num, p->qwattr);
738}
740{
742 PATTRINFO p;
743
744 if (num == ~0)
745 return;
746
747 p = &pattr[num];
748 winetest_ok(p->type == TAG_NULL, "expected entry #%ld to be TAG_NULL, was %x\n", num, p->type);
749 winetest_ok(p->flags == 0, "expected entry #%ld to be 0, was %ld\n", num, p->flags);
750 winetest_ok(p->qwattr == 0, "expected entry #%ld to be 0, was 0x%I64x\n", num, p->qwattr);
751}
752
754{
756 PATTRINFO p;
757
758 if (num == ~0)
759 return;
760
761 p = &pattr[num];
762 winetest_ok(p->type == tag, "expected entry #%ld to be %x, was %x\n", num, tag, p->type);
763 winetest_ok(p->flags == ATTRIBUTE_AVAILABLE, "expected entry #%ld to be available, was %lx\n", num, p->flags);
764 winetest_ok(p->dwattr == value, "expected entry #%ld to be 0x%lx, was 0x%lx\n", num, value, p->dwattr);
765}
766
768{
770 PATTRINFO p;
771
772 if (num == ~0)
773 return;
774
775 p = &pattr[num];
776 winetest_ok(p->type == tag, "expected entry #%ld to be %x, was %x\n", num, tag, p->type);
777 winetest_ok(p->flags == ATTRIBUTE_AVAILABLE, "expected entry #%ld to be available, was %lx\n", num, p->flags);
778 winetest_ok(p->qwattr == value, "expected entry #%ld to be 0x%I64x, was 0x%I64x\n", num, value, p->qwattr);
779}
780
781static void expect_tag_str_imp(PATTRINFO pattr, TAG tag, const WCHAR* value)
782{
784 PATTRINFO p;
785
786 if (num == ~0)
787 return;
788
789 p = &pattr[num];
790 winetest_ok(p->type == tag, "expected entry #%ld to be %x, was %x\n", num, tag, p->type);
791 winetest_ok(p->flags == ATTRIBUTE_AVAILABLE, "expected entry #%ld to be available, was %lx\n", num, p->flags);
792 winetest_ok(p->lpattr && wcscmp(p->lpattr, value) == 0, "expected entry #%ld to be %s, was %s\n", num, wine_dbgstr_w(value), wine_dbgstr_w(p->lpattr));
793}
794
795#define expect_tag_skip (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_tag_skip_imp
796#define expect_tag_empty (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_tag_empty_imp
797#define expect_tag_dword (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_tag_dword_imp
798#define expect_tag_qword (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_tag_qword_imp
799#define expect_tag_str (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_tag_str_imp
800#define expect_tag_skip_range(ptr, from, to) \
801 do { \
802 int n = (from), n_end = (to); \
803 winetest_set_location(__FILE__, __LINE__); \
804 for ( ; n < n_end; ++n) \
805 expect_tag_skip_imp((ptr), n); \
806 } while (0)
807#define test_crc (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : test_crc_imp
808#define test_crc2 (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : test_crc2_imp
809
811{
812 PATTRINFO pattrinfo;
813 DWORD num;
814
815 if (!pSdbFreeFileAttributes)
816 {
817 hdll = LoadLibraryA("apphelp.dll");
818 pSdbTagToString = (void *)GetProcAddress(hdll, "SdbTagToString");
819 pSdbGetFileAttributes = (void *)GetProcAddress(hdll, "SdbGetFileAttributes");
820 pSdbFreeFileAttributes = (void *)GetProcAddress(hdll, "SdbFreeFileAttributes");
821 }
822
823 if (pSdbGetFileAttributes(filename, &pattrinfo, &num))
824 {
825 if (pattrinfo[16].flags == ATTRIBUTE_AVAILABLE)
826 {
827 if (pattrinfo[16].type != TAG_MODULE_TYPE)//SdbpSetAttrFail(&attr_info[16]); /* TAG_MODULE_TYPE (1: WIN16?) (3: WIN32?) (WIN64?), Win32VersionValue? */)
828 printf("FAIL TAG_MODULE_TYPE (%S)\n", filename);
829 if (pattrinfo[16].dwattr != 3 && pattrinfo[16].dwattr != 2)
830 printf("TAG_MODULE_TYPE(%S): %ld\n", filename, pattrinfo[16].dwattr); // C:\Program Files (x86)\Windows Kits\8.1\Lib\win7\stub512.com
831 if (pattrinfo[16].dwattr == 2)
832 {
833 printf("TAG_MODULE_TYPE(%S): %ld, %ld\n", filename, pattrinfo[16].dwattr, pattrinfo[0].dwattr);
834 }
835 }
836
837 if (pattrinfo[27].flags == ATTRIBUTE_AVAILABLE)
838 {
839 if (pattrinfo[27].type != TAG_EXE_WRAPPER)
840 printf("FAIL TAG_EXE_WRAPPER (%S)\n", filename);
841 if (pattrinfo[27].dwattr != 0)
842 printf("TAG_EXE_WRAPPER(%S): %ld\n", filename, pattrinfo[27].dwattr);
843 }
844
845 pSdbFreeFileAttributes(pattrinfo);
846 }
847}
848
849static void test_crc_imp(size_t len, DWORD expected)
850{
851 static const WCHAR path[] = {'t','e','s','t','x','x','.','e','x','e',0};
852 static char crc_test[] = {4, 4, 4, 4, 1, 1, 1, 1, 4, 4, 4, 4, 2, 2, 2, 2};
853
854 PATTRINFO pattrinfo = (PATTRINFO)0xdead;
855 DWORD num = 333;
856 BOOL ret;
857
858 test_create_file_imp(L"testxx.exe", crc_test, len);
859 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
860 winetest_ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
861 winetest_ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
862 winetest_ok(num == g_AttrInfoSize, "expected %lu items, got %ld.\n", g_AttrInfoSize, num);
863
864 if (num == g_AttrInfoSize && ret)
865 {
867 }
868 if (ret)
869 pSdbFreeFileAttributes(pattrinfo);
870
871 /* Test with a fake NT path */
872 WCHAR prefixed_path[MAX_PATH];
873 wcscpy(prefixed_path, L"\\??\\");
874 wcscat(prefixed_path, path);
875 ret = pSdbGetFileAttributes(prefixed_path, &pattrinfo, &num);
876 winetest_ok(ret == FALSE, "expected SdbGetFileAttributes to fail.\n");
877 if (ret)
878 pSdbFreeFileAttributes(pattrinfo);
879
880 /* Test with a full NT path */
881 GetCurrentDirectoryW(ARRAYSIZE(prefixed_path) - 4, prefixed_path + 4);
882 wcscat(prefixed_path, L"\\");
883 wcscat(prefixed_path, path);
884 ret = pSdbGetFileAttributes(prefixed_path, &pattrinfo, &num);
885 winetest_ok(ret != FALSE || broken(ret == FALSE) /* 2k3/Vista */, "expected SdbGetFileAttributes to succeed.\n");
886 if (ret)
887 pSdbFreeFileAttributes(pattrinfo);
888}
889
891{
892 static const WCHAR path[] = {'t','e','s','t','x','x','.','e','x','e',0};
893
894 PATTRINFO pattrinfo = (PATTRINFO)0xdead;
895 DWORD num = 333;
896 BOOL ret;
897 size_t n;
898 char* crc_test = malloc(len);
899 for (n = 0; n < len; ++n)
900 crc_test[n] = (char)(fill ? fill : n);
901
902 test_create_file_imp(L"testxx.exe", crc_test, len);
903 free(crc_test);
904 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
905 winetest_ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
906 winetest_ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
907 winetest_ok(num == g_AttrInfoSize, "expected %lu items, got %ld.\n", g_AttrInfoSize, num);
908
909 if (num == g_AttrInfoSize && ret)
910 {
911 expect_tag_dword_imp(pattrinfo, TAG_SIZE, len);
913 }
914 if (ret)
915 pSdbFreeFileAttributes(pattrinfo);
916}
917
919{
920 static const WCHAR path[] = {'t','e','s','t','x','x','.','e','x','e',0};
921 static const WCHAR PRODUCT_VERSION[] = {'1','.','0','.','0','.','1',0};
922 static const WCHAR FILE_DESCRIPTION[] = {'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n',0};
923 static const WCHAR COMPANY_NAME[] = {'C','o','m','p','a','n','y','N','a','m','e',0};
924 static const WCHAR PRODUCT_NAME[] = {'P','r','o','d','u','c','t','N','a','m','e',0};
925 static const WCHAR FILE_VERSION[] = {'1','.','0','.','0','.','0',0};
926 static const WCHAR ORIGINAL_FILENAME[] = {'O','r','i','g','i','n','a','l','F','i','l','e','n','a','m','e',0};
927 static const WCHAR INTERNAL_NAME[] = {'I','n','t','e','r','n','a','l','N','a','m','e',0};
928 static const WCHAR LEGAL_COPYRIGHT[] = {'L','e','g','a','l','C','o','p','y','r','i','g','h','t',0};
929 static const WCHAR EXPORT_NAME[] = {'T','e','S','t','2','.','e','x','e',0};
930 static const WCHAR OS2_DESCRIPTION[] = {'M','O','D',' ','D','E','S','C','R','I','P','T','I','O','N',' ','H','E','R','E',0};
931 static const WCHAR OS2_EXPORT_NAME[] = {'T','E','S','T','M','O','D','.','h','X','x',0};
932 static const WCHAR OS2_DESCRIPTION_broken[] = {'Z',0};
933 static const WCHAR OS2_EXPORT_NAME_broken[] = {'E',0};
934
935 PATTRINFO pattrinfo = (PATTRINFO)0xdead;
936 DWORD num = 333;
937 BOOL ret;
938
939 /* ensure the file is not there. */
940 DeleteFileA("testxx.exe");
941 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
942 ok(ret == FALSE, "expected SdbGetFileAttributes to fail.\n");
943 ok(pattrinfo == (PATTRINFO)0xdead || pattrinfo == NULL, "expected the pointer not to change or to be NULL.\n");
944 ok(num == 333 || num == 0, "expected the number of items not to change or to be 0.\n");
945 if (ret)
946 pSdbFreeFileAttributes(pattrinfo);
947
948 /* Test a file with as much features as possible */
949 test_create_exe(L"testxx.exe", 0);
950
951 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
952 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
953 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
954
955 //for (UINT n = 0; n < num; ++n)
956 //{
957 // trace("%S\n", pSdbTagToString(pattrinfo[n].type));
958 //}
959
960 switch(g_WinVersion)
961 {
962 case WINVER_2003:
963 g_AttrInfoSize = 26;
964 break;
965 case WINVER_VISTA:
966 g_AttrInfoSize = 27;
967 break;
968 case WINVER_WIN7:
969 g_AttrInfoSize = 28;
970 break;
971 case WINVER_WIN8:
972 case WINVER_WIN81:
973 g_AttrInfoSize = 43;
974 break;
975 case WINVER_WIN10:
976 g_AttrInfoSize = 38;
977 break;
978 default:
979 ok(0, "Unknown attrinfo size: %lu\n", num);
980 break;
981 }
982
983 ok(num == g_AttrInfoSize, "expected %lu items, got %ld.\n", g_AttrInfoSize, num);
984
985#ifndef _M_IX86
987#else
988 if (num == g_AttrInfoSize && ret)
989#endif
990 {
991 expect_tag_dword(pattrinfo, TAG_SIZE, 0x800);
992 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0x178bd629);
993 expect_tag_qword(pattrinfo, TAG_BIN_FILE_VERSION, 0x1000000000000ull);
994 expect_tag_qword(pattrinfo, TAG_BIN_PRODUCT_VERSION, 0x1000000000001ull);
995 expect_tag_str(pattrinfo, TAG_PRODUCT_VERSION, PRODUCT_VERSION);
996 expect_tag_str(pattrinfo, TAG_FILE_DESCRIPTION, FILE_DESCRIPTION);
997 expect_tag_str(pattrinfo, TAG_COMPANY_NAME, COMPANY_NAME);
999 expect_tag_str(pattrinfo, TAG_FILE_VERSION, FILE_VERSION);
1000 expect_tag_str(pattrinfo, TAG_ORIGINAL_FILENAME, ORIGINAL_FILENAME);
1001 expect_tag_str(pattrinfo, TAG_INTERNAL_NAME, INTERNAL_NAME);
1002 expect_tag_str(pattrinfo, TAG_LEGAL_COPYRIGHT, LEGAL_COPYRIGHT);
1003 expect_tag_dword(pattrinfo, TAG_VERDATEHI, 0x1d1a019);
1004 expect_tag_dword(pattrinfo, TAG_VERDATELO, 0xac754c50);
1007 expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x3); /* Win32 */
1008 expect_tag_dword(pattrinfo, TAG_PE_CHECKSUM, 0xBAAD);
1009 expect_tag_dword(pattrinfo, TAG_LINKER_VERSION, 0x40002);
1012 expect_tag_qword(pattrinfo, TAG_UPTO_BIN_FILE_VERSION, 0x1000000000000ull);
1013 expect_tag_qword(pattrinfo, TAG_UPTO_BIN_PRODUCT_VERSION, 0x1000000000001ull);
1014 expect_tag_dword(pattrinfo, TAG_LINK_DATE, 0x12345);
1015 expect_tag_dword(pattrinfo, TAG_UPTO_LINK_DATE, 0x12345);
1016 expect_tag_str(pattrinfo, TAG_EXPORT_NAME, EXPORT_NAME);
1017 expect_tag_dword(pattrinfo, TAG_VER_LANGUAGE, 0xffff);
1018 expect_tag_dword(pattrinfo, TAG_EXE_WRAPPER, 0x0);
1019 }
1020 if (ret)
1021 pSdbFreeFileAttributes(pattrinfo);
1022
1023
1024 /* Disable resource and exports */
1025 test_create_exe(L"testxx.exe", 1);
1026
1027 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
1028 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
1029 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
1030 ok(num == g_AttrInfoSize, "expected %lu items, got %ld.\n", g_AttrInfoSize, num);
1031
1032 if (num == g_AttrInfoSize && ret)
1033 {
1034 expect_tag_dword(pattrinfo, TAG_SIZE, 0x800);
1035#ifndef _M_IX86
1037 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xea7caffd);
1038 else
1039 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xea7cf1fd);
1040#else
1041 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xea7caffd);
1042#endif
1043 //expect_tag_skip_range(pattrinfo, 2, 16);
1044 expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x3); /* Win32 */
1045 expect_tag_dword(pattrinfo, TAG_PE_CHECKSUM, 0xBAAD);
1046 expect_tag_dword(pattrinfo, TAG_LINKER_VERSION, 0x40002);
1047 //expect_tag_skip_range(pattrinfo, 19, 23);
1048 expect_tag_dword(pattrinfo, TAG_LINK_DATE, 0x12345);
1049 expect_tag_dword(pattrinfo, TAG_UPTO_LINK_DATE, 0x12345);
1050 expect_tag_skip(pattrinfo, TAG_EXPORT_NAME);
1052 expect_tag_dword(pattrinfo, TAG_EXE_WRAPPER, 0x0);
1053 }
1054 if (ret)
1055 pSdbFreeFileAttributes(pattrinfo);
1056
1057 /* A file with just 'MZ' */
1058 test_create_file(L"testxx.exe", "MZ", 2);
1059
1060 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
1061 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
1062 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
1063 ok(num == g_AttrInfoSize, "expected %lu items, got %ld.\n", g_AttrInfoSize, num);
1064
1065 if (num == g_AttrInfoSize && ret)
1066 {
1067 expect_tag_dword(pattrinfo, TAG_SIZE, 0x2);
1068 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0);
1069 //expect_tag_skip_range(pattrinfo, 2, 16);
1070 expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x1);
1071 //expect_tag_skip_range(pattrinfo, 17, 26);
1073 expect_tag_skip(pattrinfo, TAG_EXE_WRAPPER);
1074 }
1075 if (ret)
1076 pSdbFreeFileAttributes(pattrinfo);
1077
1078 /* Empty file */
1079 test_create_file(L"testxx.exe", NULL, 0);
1080
1081 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
1082 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
1083 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
1084 ok(num == g_AttrInfoSize, "expected %lu items, got %ld.\n", g_AttrInfoSize, num);
1085
1086 if (num == g_AttrInfoSize && ret)
1087 {
1088 expect_tag_dword(pattrinfo, TAG_SIZE, 0);
1089 //expect_tag_skip_range(pattrinfo, 1, 26);
1091 expect_tag_skip(pattrinfo, TAG_EXE_WRAPPER);
1092 }
1093 if (ret)
1094 pSdbFreeFileAttributes(pattrinfo);
1095
1096 /* minimal NE executable */
1097 test_create_ne(L"testxx.exe", 0);
1098
1099 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
1100 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
1101 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
1102 ok(num == g_AttrInfoSize, "expected %lu items, got %ld.\n", g_AttrInfoSize, num);
1103
1104 if (num == g_AttrInfoSize && ret)
1105 {
1106 expect_tag_dword(pattrinfo, TAG_SIZE, 0xa8);
1107 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xf2abe4e9);
1108 //expect_tag_skip_range(pattrinfo, 2, 16);
1109 expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x2);
1110 expect_tag_skip(pattrinfo, TAG_PE_CHECKSUM);
1112 expect_tag_str(pattrinfo, TAG_16BIT_DESCRIPTION, OS2_DESCRIPTION);
1113 expect_tag_str(pattrinfo, TAG_16BIT_MODULE_NAME, OS2_EXPORT_NAME);
1114 //expect_tag_skip_range(pattrinfo, 21, 26);
1116 expect_tag_skip(pattrinfo, TAG_EXE_WRAPPER);
1117 }
1118 if (ret)
1119 pSdbFreeFileAttributes(pattrinfo);
1120
1121 /* NE executable with description / module name pointers zero, to show they are always used */
1122 test_create_ne(L"testxx.exe", 1);
1123
1124 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
1125 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
1126 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
1127 ok(num == g_AttrInfoSize, "expected %lu items, got %ld.\n", g_AttrInfoSize, num);
1128
1129 if (num == g_AttrInfoSize && ret)
1130 {
1131 expect_tag_dword(pattrinfo, TAG_SIZE, 0xa8);
1132 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xddcbe4c9);
1133 //expect_tag_skip_range(pattrinfo, 2, 16);
1134 expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x2);
1135 expect_tag_skip(pattrinfo, TAG_PE_CHECKSUM);
1137 expect_tag_str(pattrinfo, TAG_16BIT_DESCRIPTION, OS2_DESCRIPTION_broken); /* the 'Z' from 'MZ' */
1138 expect_tag_str(pattrinfo, TAG_16BIT_MODULE_NAME, OS2_EXPORT_NAME_broken); /* the 'E' from 'NE' */
1139 //expect_tag_skip_range(pattrinfo, 21, 26);
1141 expect_tag_skip(pattrinfo, TAG_EXE_WRAPPER);
1142 }
1143 if (ret)
1144 pSdbFreeFileAttributes(pattrinfo);
1145
1146 test_crc(1, 0);
1147 test_crc(2, 0);
1148 test_crc(3, 0);
1149 test_crc(4, 0x2020202);
1150 test_crc(5, 0x2020202);
1151 test_crc(6, 0x2020202);
1152 test_crc(7, 0x2020202);
1153 test_crc(8, 0x81818181);
1154 test_crc(9, 0x81818181);
1155 test_crc(10, 0x81818181);
1156 test_crc(11, 0x81818181);
1157 test_crc(12, 0xc2c2c2c2);
1158 test_crc(16, 0x62626262);
1159
1160 /* This seems to be the cutoff point */
1161 test_crc2(0xffc, 4, 0xfbfbfcfc);
1162 test_crc2(0xffc, 8, 0x7070717);
1163 test_crc2(0xffc, 0xcc, 0xc8eba002);
1164 test_crc2(0xffc, 0, 0x4622028d);
1165
1166 test_crc2(0x1000, 4, 0x80);
1167 test_crc2(0x1000, 8, 0x8787878f);
1168 test_crc2(0x1000, 0xcc, 0x4adc3667);
1169 test_crc2(0x1000, 0, 0xa3108044);
1170
1171 /* Here is another cutoff point */
1172 test_crc2(0x11fc, 4, 0x80);
1173 test_crc2(0x11fc, 8, 0x8787878f);
1174 test_crc2(0x11fc, 0xcc, 0x4adc3667);
1175 test_crc2(0x11fc, 0, 0xf03e0800);
1176
1177 test_crc2(0x1200, 4, 0x80);
1178 test_crc2(0x1200, 8, 0x8787878f);
1179 test_crc2(0x1200, 0xcc, 0x4adc3667);
1180 test_crc2(0x1200, 0, 0xa3108044);
1181
1182 /* After that, it stays the same for all sizes */
1183 test_crc2(0xf000, 4, 0x80);
1184 test_crc2(0xf000, 8, 0x8787878f);
1185 test_crc2(0xf000, 0xcc, 0x4adc3667);
1186 test_crc2(0xf000, 0, 0xa3108044);
1187
1188
1189 DeleteFileA("testxx.exe");
1190}
1191
1192/* Showing that SdbGetAppPatchDir returns HRESULT */
1193static void test_SdbGetAppPatchDir(void)
1194{
1197 int n;
1198
1199
1200 _SEH2_TRY
1201 {
1202 hr = pSdbGetAppPatchDir(NULL, NULL, 0);
1204 ok_hex(hr, S_FALSE);
1205 else
1206 ok_hex(hr, S_OK);
1207 }
1209 {
1210 /* Some versions accept it, some don't */
1211 trace("SdbGetAppPatchDir did not handle a NULL pointer very gracefully.\n");
1212 }
1213 _SEH2_END;
1214
1215
1216
1217 memset(Buffer, 0xbb, sizeof(Buffer));
1218 hr = pSdbGetAppPatchDir(NULL, Buffer, 0);
1221 else if (g_WinVersion < WINVER_WIN10)
1222 expect_hr = S_OK;
1223 else
1226
1229 else if (g_WinVersion <= WINVER_WIN10)
1230 expect_hr = S_OK;
1231 else
1232 expect_hr = TRUE;
1233
1234 memset(Buffer, 0xbb, sizeof(Buffer));
1235 hr = pSdbGetAppPatchDir(NULL, Buffer, 1);
1237
1238
1239 for (n = 2; n < _countof(Buffer) - 1; ++n)
1240 {
1241 memset(Buffer, 0xbb, sizeof(Buffer));
1242 hr = pSdbGetAppPatchDir(NULL, Buffer, n);
1243 ok(Buffer[n] == 0xbbbb, "Expected SdbGetAppPatchDir to leave WCHAR at %d untouched, was: %d\n",
1244 n, Buffer[n]);
1245 ok(hr == S_OK || hr == expect_hr, "Expected S_OK or 0x%lx, was: 0x%lx (at %d)\n", expect_hr, hr, n);
1246 }
1247}
1249{
1250 //SetEnvironmentVariable("SHIM_DEBUG_LEVEL", "4");
1251 //SetEnvironmentVariable("DEBUGCHANNEL", "+apphelp");
1253
1254 hdll = LoadLibraryA("apphelp.dll");
1256 trace("Detected apphelp.dll version: 0x%lx\n", g_WinVersion);
1257
1258#define RESOLVE(fnc) do { p##fnc = (void *) GetProcAddress(hdll, #fnc); ok(!!p##fnc, #fnc " not found.\n"); } while (0)
1267#undef RESOLVE
1268
1274#ifndef _M_IX86
1275 skip("FIXME: Need new SdbGetAppPatchDir() for non-x86!\n");
1276#else
1277 if (pSdbGetAppPatchDir)
1279#endif
1280}
#define PRODUCT_NAME
_STLP_MOVE_TO_STD_NAMESPACE void fill(_ForwardIter __first, _ForwardIter __last, const _Tp &__val)
Definition: _algobase.h:449
BOOL WINAPI SdbFreeFileAttributes(PATTRINFO attr_info)
Definition: sdbfileattr.c:214
LPCWSTR WINAPI SdbTagToString(TAG tag)
Definition: sdbapi.c:771
BOOL WINAPI SdbGUIDToString(CONST GUID *Guid, PWSTR GuidString, SIZE_T Length)
Definition: sdbapi.c:412
HRESULT WINAPI SdbGetAppPatchDir(HSDB db, LPWSTR path, DWORD size)
Definition: hsdb.c:592
BOOL WINAPI SdbIsNullGUID(CONST GUID *Guid)
Definition: sdbapi.c:431
BOOL WINAPI SdbGetFileAttributes(LPCWSTR path, PATTRINFO *attr_info_ret, LPDWORD attr_count)
Definition: sdbfileattr.c:239
#define test_create_ne
#define WINVER_WIN10
#define WINVER_2003
DWORD get_module_version(HMODULE mod)
Definition: data.c:811
void silence_debug_output(void)
Definition: data.c:841
#define WINVER_WINXP
#define test_create_exe
#define test_create_file
DWORD g_WinVersion
Definition: data.c:795
#define WINVER_WIN81
#define WINVER_WIN7
#define WINVER_WIN8
#define WINVER_VISTA
void test_create_file_imp(const WCHAR *name, const char *contents, size_t len)
Definition: data.c:555
#define WINVER_ANY
#define ok_hex(expression, result)
Definition: atltest.h:94
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
Definition: bufpool.h:45
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOL WINAPI ApphelpCheckShellObject(REFCLSID ObjectCLSID, BOOL bShimIfNecessary, ULONGLONG *pullFlags)
Definition: apphelp.c:83
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define GetCurrentDirectoryW(x, y)
Definition: compat.h:756
#define CP_ACP
Definition: compat.h:109
#define SetLastError(x)
Definition: compat.h:752
#define GetProcAddress(x, y)
Definition: compat.h:753
#define MAX_PATH
Definition: compat.h:34
#define WideCharToMultiByte
Definition: compat.h:111
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
int WINAPI lstrcmpA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4104
GUID guid
Definition: version.c:147
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define printf
Definition: freeldr.h:103
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble n
Definition: glext.h:7729
GLuint res
Definition: glext.h:9613
GLuint GLuint * names
Definition: glext.h:11545
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLuint GLuint num
Definition: glext.h:9618
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define S_OK
Definition: intsafe.h:52
const char * filename
Definition: ioapi.h:137
#define wine_dbgstr_w
Definition: kernel32.h:34
#define GUID_NULL
Definition: ks.h:106
void __cdecl winetest_ok(int condition, const char *msg,...) __WINE_PRINTF_ATTR(2
#define win_skip
Definition: minitest.h:67
#define TAG_UPTO_BIN_FILE_VERSION
Definition: apphelp.c:62
static const CLSID * objects[]
Definition: apphelp.c:112
#define TAG_TYPE_DWORD
Definition: apphelp.c:39
#define test_crc2
Definition: apphelp.c:808
static void expect_tag_str_imp(PATTRINFO pattr, TAG tag, const WCHAR *value)
Definition: apphelp.c:781
static DWORD g_AttrInfoSize
Definition: apphelp.c:99
#define TAG_TYPE_QWORD
Definition: apphelp.c:40
#define TAG_TYPE_WORD
Definition: apphelp.c:38
DWORD line
Definition: apphelp.c:213
#define TAG_ORIGINAL_FILENAME
Definition: apphelp.c:69
#define TAG_LINKER_VERSION
Definition: apphelp.c:55
#define TAG_16BIT_DESCRIPTION
Definition: apphelp.c:72
#define TAG_UPTO_LINK_DATE
Definition: apphelp.c:57
static void expect_tag_qword_imp(PATTRINFO pattr, TAG tag, QWORD value)
Definition: apphelp.c:767
#define TAG_SIZE
Definition: apphelp.c:46
static LPWSTR DWORD size
Definition: apphelp.c:98
#define TAG_TYPE_STRINGREF
Definition: apphelp.c:41
static TAG g_Tags_26[]
Definition: apphelp.c:640
#define TAG_FILE_DESCRIPTION
Definition: apphelp.c:67
#define TAG_VERFILETYPE
Definition: apphelp.c:52
#define TAG_BIN_FILE_VERSION
Definition: apphelp.c:59
static PATTRINFO * ppAttrInfo
Definition: apphelp.c:96
const char * tags[99]
Definition: apphelp.c:216
static PWSTR SIZE_T Length
Definition: apphelp.c:93
#define expect_tag_dword
Definition: apphelp.c:797
static PATTRINFO LPDWORD pdwAttrCount
Definition: apphelp.c:96
static GUID * Guid
Definition: apphelp.c:95
static TAG g_Tags_28[]
Definition: apphelp.c:670
static void test_crc2_imp(DWORD len, int fill, DWORD expected)
Definition: apphelp.c:890
static BOOL
Definition: apphelp.c:91
static HMODULE hdll
Definition: apphelp.c:90
struct tagATTRINFO ATTRINFO
#define TAG_VERFILEOS
Definition: apphelp.c:51
struct tagATTRINFO * PATTRINFO
#define TAG_VERDATEHI
Definition: apphelp.c:49
#define TAG_EXE_WRAPPER
Definition: apphelp.c:58
static PWSTR GuidString
Definition: apphelp.c:93
#define TAG_VER_LANGUAGE
Definition: apphelp.c:54
#define expect_tag_skip
Definition: apphelp.c:795
#define TAG_UPTO_BIN_PRODUCT_VERSION
Definition: apphelp.c:61
#define TAG_FILE_VERSION
Definition: apphelp.c:68
#define ATTRIBUTE_FAILED
Definition: apphelp.c:78
#define ATTRIBUTE_AVAILABLE
Definition: apphelp.c:77
void test_tag(TAG base, const char *names[], size_t upperlimit, int line)
Definition: apphelp.c:194
#define TAG_LEGAL_COPYRIGHT
Definition: apphelp.c:71
#define TAG_PRODUCT_NAME
Definition: apphelp.c:65
static int strcmp_wa(LPCWSTR strw, const char *stra)
Definition: apphelp.c:187
#define TAG_TYPE_BINARY
Definition: apphelp.c:44
static void expect_tag_empty_imp(PATTRINFO pattr, TAG tag)
Definition: apphelp.c:739
#define TAG_EXPORT_NAME
Definition: apphelp.c:74
#define TAG_CHECKSUM
Definition: apphelp.c:47
void test_onefile(WCHAR *filename)
Definition: apphelp.c:810
#define TAG_PE_CHECKSUM
Definition: apphelp.c:53
#define test_crc
Definition: apphelp.c:807
static void test_SdbGetAppPatchDir(void)
Definition: apphelp.c:1193
static void expect_tag_dword_imp(PATTRINFO pattr, TAG tag, DWORD value)
Definition: apphelp.c:753
#define TAG_VERDATELO
Definition: apphelp.c:50
TAG base
Definition: apphelp.c:211
#define expect_tag_empty
Definition: apphelp.c:796
#define TAG_TYPE_NULL
Definition: apphelp.c:36
static void test_GuidFunctions(void)
Definition: apphelp.c:614
static void test_SdbTagToStringAllTags(void)
Definition: apphelp.c:601
#define TAG_COMPANY_NAME
Definition: apphelp.c:64
#define TAG_LINK_DATE
Definition: apphelp.c:56
DWORD min_ver
Definition: apphelp.c:214
#define expect_tag_qword
Definition: apphelp.c:798
#define TAG_NULL
Definition: apphelp.c:45
static DWORD find_tag(TAG tag)
Definition: apphelp.c:702
static void test_crc_imp(size_t len, DWORD expected)
Definition: apphelp.c:849
#define TAG_16BIT_MODULE_NAME
Definition: apphelp.c:73
#define RESOLVE(fnc)
static void test_ApplicationAttributes(void)
Definition: apphelp.c:918
#define TAG_TYPE_BYTE
Definition: apphelp.c:37
#define TAG_TYPE_LIST
Definition: apphelp.c:42
#define TAG_BIN_PRODUCT_VERSION
Definition: apphelp.c:60
static void expect_tag_skip_imp(PATTRINFO pattr, TAG tag)
Definition: apphelp.c:726
#define TAG_TYPE_STRING
Definition: apphelp.c:43
DWORD upper_limit
Definition: apphelp.c:212
DWORD max_ver
Definition: apphelp.c:215
#define TAG_INTERNAL_NAME
Definition: apphelp.c:70
#define expect_tag_str
Definition: apphelp.c:799
static void test_ApphelpCheckShellObject(void)
Definition: apphelp.c:124
#define TAG_MODULE_TYPE
Definition: apphelp.c:48
#define TAG_PRODUCT_VERSION
Definition: apphelp.c:66
static LPWSTR path
Definition: apphelp.c:98
#define TAG_TYPE_MASK
Definition: apphelp.c:34
static void test_SdbTagToString(void)
Definition: apphelp.c:167
BOOL expected
Definition: store.c:2000
#define expect_hr(expected, got)
Definition: assoc.c:27
short WCHAR
Definition: pedump.c:58
char CHAR
Definition: pedump.c:57
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFCLSID
Definition: guiddef.h:117
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
BOOL WINAPI SdbGetStandardDatabaseGUID(DWORD Flags, GUID *Guid)
Definition: sdbapi.c:445
static const GUID GUID_DATABASE_DRIVERS
Definition: sdbapi.c:18
static const GUID GUID_DATABASE_MSI
Definition: sdbapi.c:16
static const GUID GUID_DATABASE_SHIM
Definition: sdbapi.c:17
wcscat
wcscpy
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:171
#define memset(x, y, z)
Definition: compat.h:39
UINT64 QWORD
Definition: shimdbg.c:104
#define _countof(array)
Definition: sndvol32.h:70
Definition: scsiwmi.h:51
Definition: fs_rec.h:143
Definition: parser.c:49
QWORD qwattr
Definition: apphelp.h:39
WCHAR * lpattr
Definition: apphelp.h:41
DWORD dwattr
Definition: apphelp.h:40
DWORD flags
Definition: apphelp.h:37
TAG type
Definition: apphelp.h:36
Definition: ecma_167.h:138
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t * LPDWORD
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
uint32_t ULONG
Definition: typedefs.h:59
Definition: pdh_main.c:96
#define VOS__WINDOWS32
Definition: verrsrc.h:64
#define VFT_APP
Definition: verrsrc.h:75
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170