ReactOS 0.4.16-dev-319-g6cf4263
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%x%08x with 0x%x (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%x%08x with 0x%x (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%x (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%x%08x with 0x%x\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",
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[7*8];
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_ANY,
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 {
240 TAG_TYPE_BYTE, 0x1000, __LINE__, WINVER_ANY, WINVER_ANY,
241 {
242 "InvalidTag", NULL
243 }
244 },
245
246 {
247 TAG_TYPE_WORD, 0x800, __LINE__, WINVER_ANY, WINVER_WIN7,
248 {
249 "InvalidTag", "MATCH_MODE", NULL
250 }
251 },
252 {
253 TAG_TYPE_WORD, 0x800, __LINE__, WINVER_WIN8, WINVER_ANY,
254 {
255 "InvalidTag", "MATCH_MODE", "QUIRK_COMPONENT_CODE_ID", "QUIRK_CODE_ID", NULL
256 }
257 },
258 {
259 TAG_TYPE_WORD | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY,
260 {
261 "InvalidTag", "TAG", "INDEX_TAG", "INDEX_KEY", NULL
262 }
263 },
264
265 {
266 TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_ANY, WINVER_WINXP,
267 {
268 "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERFILEDATEHI",
269 "VERFILEDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVERSION", "PREVOSMINORVERSION", "PREVOSPLATFORMID", "PREVOSBUILDNO",
270 "PROBLEM_SEVERITY", "APPHELP_LANGID", "VER_LANGUAGE", "InvalidTag", "ENGINE", "HTMLHELPID", "INDEXFLAGS", "FLAGS",
271 "VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "OS_SERVICE_PACK",
272 "FLAG_TAGID", "RUNTIME_PLATFORM", "OS_SKU", NULL
273 }
274 },
275 {
276 TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_2003, WINVER_2003,
277 {
278 "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERFILEDATEHI",
279 "VERFILEDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVERSION", "PREVOSMINORVERSION", "PREVOSPLATFORMID", "PREVOSBUILDNO",
280 "PROBLEM_SEVERITY", "APPHELP_LANGID", "VER_LANGUAGE", "InvalidTag", "ENGINE", "HTMLHELPID", "INDEXFLAGS", "FLAGS",
281 "VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "OS_SERVICE_PACK",
282 "FLAG_TAGID", "RUNTIME_PLATFORM", "OS_SKU", "OS_PLATFORM", NULL
283 }
284 },
285 {
286 TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_VISTA, WINVER_VISTA,
287 {
288 "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERDATEHI",
289 "VERDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVER", "PREVOSMINORVER", "PREVOSPLATFORMID", "PREVOSBUILDNO",
290 "PROBLEMSEVERITY", "LANGID", "VER_LANGUAGE", "InvalidTag", "ENGINE", "HTMLHELPID", "INDEX_FLAGS", "FLAGS",
291 "DATA_VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "OS_SERVICE_PACK",
292 "FLAG_TAGID", "RUNTIME_PLATFORM", "OS_SKU", "OS_PLATFORM", "APP_NAME_RC_ID", "VENDOR_NAME_RC_ID", "SUMMARY_MSG_RC_ID", "VISTA_SKU",
293 NULL
294 }
295 },
296 {
297 TAG_TYPE_DWORD, 0x800, __LINE__, WINVER_WIN7, WINVER_ANY,
298 {
299 "InvalidTag", "SIZE", "OFFSET", "CHECKSUM", "SHIM_TAGID", "PATCH_TAGID", "MODULE_TYPE", "VERDATEHI",
300 "VERDATELO", "VERFILEOS", "VERFILETYPE", "PE_CHECKSUM", "PREVOSMAJORVER", "PREVOSMINORVER", "PREVOSPLATFORMID", "PREVOSBUILDNO",
301 "PROBLEMSEVERITY", "LANGID", "VER_LANGUAGE", "InvalidTag", "ENGINE", "HTMLHELPID", "INDEX_FLAGS", "FLAGS",
302 "DATA_VALUETYPE", "DATA_DWORD", "LAYER_TAGID", "MSI_TRANSFORM_TAGID", "LINKER_VERSION", "LINK_DATE", "UPTO_LINK_DATE", "OS_SERVICE_PACK",
303 "FLAG_TAGID", "RUNTIME_PLATFORM", "OS_SKU", "OS_PLATFORM", "APP_NAME_RC_ID", "VENDOR_NAME_RC_ID", "SUMMARY_MSG_RC_ID", "VISTA_SKU",
304 "DESCRIPTION_RC_ID", "PARAMETER1_RC_ID", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
305 "CONTEXT_TAGID", "EXE_WRAPPER", "URL_ID", NULL
306 }
307 },
308 {
309 TAG_TYPE_DWORD | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY,
310 {
311 "InvalidTag", "TAGID", NULL
312 }
313 },
314
315 {
316 TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_ANY, WINVER_WINXP,
317 {
318 "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD",
319 "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", NULL
320 }
321 },
322 {
323 TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_2003, WINVER_2003,
324 {
325 "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD",
326 "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", "FLAG_MASK_FUSION", "FLAGS_PROCESSPARAM",
327 NULL
328 }
329 },
330 {
331 TAG_TYPE_QWORD, 0x1000, __LINE__, WINVER_VISTA, WINVER_ANY,
332 {
333 "InvalidTag", "TIME", "BIN_FILE_VERSION", "BIN_PRODUCT_VERSION", "MODTIME", "FLAG_MASK_KERNEL", "UPTO_BIN_PRODUCT_VERSION", "DATA_QWORD",
334 "FLAG_MASK_USER", "FLAGS_NTVDM1", "FLAGS_NTVDM2", "FLAGS_NTVDM3", "FLAG_MASK_SHELL", "UPTO_BIN_FILE_VERSION", "FLAG_MASK_FUSION", "FLAG_PROCESSPARAM",
335 "FLAG_LUA", "FLAG_INSTALL", NULL
336 }
337 },
338
339 {
340 TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_ANY, WINVER_2003,
341 {
342 "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag",
343 "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
344 "PRODUCT_NAME", "PRODUCT_VERSION", "FILE_DESCRIPTION", "FILE_VERSION", "ORIGINAL_FILENAME", "INTERNAL_NAME", "LEGAL_COPYRIGHT", "S16BIT_DESCRIPTION",
345 "PROBLEM_DETAILS", "LINK_URL", "LINK_TEXT", "APPHELP_TITLE", "APPHELP_CONTACT", "SXS_MANIFEST", "DATA_STRING", "MSI_TRANSFORM_FILE",
346 "S16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", NULL
347 }
348 },
349 {
350 TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_VISTA, WINVER_VISTA,
351 {
352 "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag",
353 "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
354 "PRODUCT_NAME", "PRODUCT_VERSION", "FILE_DESCRIPTION", "FILE_VERSION", "ORIGINAL_FILENAME", "INTERNAL_NAME", "LEGAL_COPYRIGHT", "16BIT_DESCRIPTION",
355 "APPHELP_DETAILS", "LINK_URL", "LINK_TEXT", "APPHELP_TITLE", "APPHELP_CONTACT", "SXS_MANIFEST", "DATA_STRING", "MSI_TRANSFORM_FILE",
356 "16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", "EXPORT_NAME", NULL
357 }
358 },
359 {
360 TAG_TYPE_STRINGREF, 0x1000, __LINE__, WINVER_WIN7, WINVER_ANY,
361 {
362 "InvalidTag", "NAME", "DESCRIPTION", "MODULE", "API", "VENDOR", "APP_NAME", "InvalidTag",
363 "COMMAND_LINE", "COMPANY_NAME", "DLLFILE", "WILDCARD_NAME", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
364 "PRODUCT_NAME", "PRODUCT_VERSION", "FILE_DESCRIPTION", "FILE_VERSION", "ORIGINAL_FILENAME", "INTERNAL_NAME", "LEGAL_COPYRIGHT", "16BIT_DESCRIPTION",
365 "APPHELP_DETAILS", "LINK_URL", "LINK_TEXT", "APPHELP_TITLE", "APPHELP_CONTACT", "SXS_MANIFEST", "DATA_STRING", "MSI_TRANSFORM_FILE",
366 "16BIT_MODULE_NAME", "LAYER_DISPLAYNAME", "COMPILER_VERSION", "ACTION_TYPE", "EXPORT_NAME", "URL", NULL
367 }
368 },
369
370 {
371 TAG_TYPE_LIST, 0x800, __LINE__, WINVER_ANY, WINVER_2003,
372 {
373 "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE",
374 "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA",
375 "MSI TRANSFORM", "MSI TRANSFORM REF", "MSI PACKAGE", "FLAG", "MSI CUSTOM ACTION", "FLAG_REF", "ACTION", NULL
376 }
377 },
378 {
379 TAG_TYPE_LIST, 0x800, __LINE__, WINVER_VISTA, WINVER_VISTA,
380 {
381 "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE",
382 "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA",
383 "MSI_TRANSFORM", "MSI_TRANSFORM_REF", "MSI_PACKAGE", "FLAG", "MSI_CUSTOM_ACTION", "FLAG_REF", "ACTION", "LOOKUP",
384 NULL
385 }
386 },
387 {
388 TAG_TYPE_LIST, 0x800, __LINE__, WINVER_WIN7, WINVER_ANY,
389 {
390 "InvalidTag", "DATABASE", "LIBRARY", "INEXCLUDE", "SHIM", "PATCH", "APP", "EXE",
391 "MATCHING_FILE", "SHIM_REF", "PATCH_REF", "LAYER", "FILE", "APPHELP", "LINK", "DATA",
392 "MSI_TRANSFORM", "MSI_TRANSFORM_REF", "MSI_PACKAGE", "FLAG", "MSI_CUSTOM_ACTION", "FLAG_REF", "ACTION", "LOOKUP",
393 "CONTEXT", "CONTEXT_REF", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
394 "SPC", NULL
395 }
396 },
397 {
398 TAG_TYPE_LIST | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY,
399 {
400 "InvalidTag", "STRINGTABLE", "INDEXES", "INDEX", NULL
401 }
402 },
403
404 {
405 TAG_TYPE_STRING, 0x800, __LINE__, WINVER_ANY, WINVER_ANY,
406 {
407 "InvalidTag", NULL
408 }
409 },
410 {
411 TAG_TYPE_STRING | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_2003,
412 {
413 "InvalidTag", "STRTAB_ITEM", NULL
414 }
415 },
416 {
417 TAG_TYPE_STRING | 0x800, 0x800, __LINE__, WINVER_VISTA, WINVER_ANY,
418 {
419 "InvalidTag", "STRINGTABLE_ITEM", NULL
420 }
421 },
422
423
424 {
425 TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_ANY, WINVER_2003,
426 {
427 "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID(GUID)", "DATA_BITS", "MSI_PACKAGE_ID(GUID)", "DATABASE_ID(GUID)",
428 NULL
429 }
430 },
431 {
432 TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_VISTA, WINVER_VISTA,
433 {
434 "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID", "DATA_BITS", "MSI_PACKAGE_ID", "DATABASE_ID",
435 NULL
436 }
437 },
438 {
439 TAG_TYPE_BINARY, 0x800, __LINE__, WINVER_WIN7, WINVER_ANY,
440 {
441 "InvalidTag", "InvalidTag", "PATCH_BITS", "FILE_BITS", "EXE_ID", "DATA_BITS", "MSI_PACKAGE_ID", "DATABASE_ID",
442 "CONTEXT_PLATFORM_ID", "CONTEXT_BRANCH_ID", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag", "InvalidTag",
443 "FIX_ID", "APP_ID", NULL
444 }
445 },
446 {
447 TAG_TYPE_BINARY | 0x800, 0x800, __LINE__, WINVER_ANY, WINVER_ANY,
448 {
449 "InvalidTag", "INDEX_BITS", NULL
450 }
451 },
452
453 { 0, 0, 0, 0, 0, { NULL } }
455
456
458{
459 int n;
460 for (n = 0; data[n].base; ++n)
461 {
462 if ((data[n].min_ver == WINVER_ANY || g_WinVersion >= data[n].min_ver) &&
464 {
466 }
467 }
468}
469
470static void test_GuidFunctions(void)
471{
472 GUID guid;
473 ok(pSdbIsNullGUID(&GUID_NULL), "expected GUID_NULL to be recognized as NULL GUID\n");
474 ok(pSdbIsNullGUID(NULL), "expected NULL to be recognized as NULL GUID\n");
475 ok(pSdbIsNullGUID(&test_UserAssist) == 0, "expected a set GUID not to be recognized as NULL GUID\n");
476
477 memset(&guid, 0, sizeof(guid));
478 ok(pSdbGetStandardDatabaseGUID(0, &guid) == 0,"Expected SdbGetStandardDatabaseGUID to fail\n");
479 ok(IsEqualGUID(&GUID_NULL, &guid), "Expected guid not to be changed\n");
480
481 ok(pSdbGetStandardDatabaseGUID(0x80020000, NULL),"Expected SdbGetStandardDatabaseGUID to succeed\n");
482
483 memset(&guid, 0, sizeof(guid));
484 ok(pSdbGetStandardDatabaseGUID(0x80020000, &guid),"Expected SdbGetStandardDatabaseGUID to succeed\n");
485 ok(IsEqualGUID(&GUID_DATABASE_MSI, &guid), "Expected guid to equal GUID_DATABASE_MSI, was: %s\n", wine_dbgstr_guid(&guid));
486
487 memset(&guid, 0, sizeof(guid));
488 ok(pSdbGetStandardDatabaseGUID(0x80030000, &guid),"Expected SdbGetStandardDatabaseGUID to succeed\n");
489 ok(IsEqualGUID(&GUID_DATABASE_SHIM, &guid), "Expected guid to equal GUID_DATABASE_SHIM, was: %s\n", wine_dbgstr_guid(&guid));
490
491 memset(&guid, 0, sizeof(guid));
492 ok(pSdbGetStandardDatabaseGUID(0x80040000, &guid),"Expected SdbGetStandardDatabaseGUID to succeed\n");
493 ok(IsEqualGUID(&GUID_DATABASE_DRIVERS, &guid), "Expected guid to equal GUID_DATABASE_DRIVERS, was: %s\n", wine_dbgstr_guid(&guid));
494}
495
496static TAG g_Tags_26[] = {
497 TAG_SIZE,
509 TAG_VERDATEHI, /* TAG_VERFILEDATEHI */
510 TAG_VERDATELO, /* TAG_VERFILEDATELO */
516 TAG_16BIT_DESCRIPTION, /* CHECKME! */
517 TAG_16BIT_MODULE_NAME, /* CHECKME! */
523 0
524};
525
526static TAG g_Tags_28[] = {
527 TAG_SIZE,
555 0
556};
557
559{
560 DWORD n;
561 TAG* allTags;
562 switch (g_AttrInfoSize)
563 {
564 case 26:
565 allTags = g_Tags_26;
566 break;
567 case 28:
568 allTags = g_Tags_28;
569 break;
570 default:
571 return ~0;
572 }
573
574 for (n = 0; n < allTags[n]; ++n)
575 {
576 if (allTags[n] == tag)
577 return n;
578 }
579 return ~0;
580}
581
583{
585 PATTRINFO p;
586
587 if (num == ~0)
588 return;
589
590 p = &pattr[num];
591 winetest_ok(p->type == TAG_NULL, "expected entry #%d to be TAG_NULL, was %x\n", num, p->type);
592 winetest_ok(p->flags == ATTRIBUTE_FAILED, "expected entry #%d to be failed, was %d\n", num, p->flags);
593 winetest_ok(p->qwattr == 0, "expected entry #%d to be 0, was 0x%I64x\n", num, p->qwattr);
594}
596{
598 PATTRINFO p;
599
600 if (num == ~0)
601 return;
602
603 p = &pattr[num];
604 winetest_ok(p->type == TAG_NULL, "expected entry #%d to be TAG_NULL, was %x\n", num, p->type);
605 winetest_ok(p->flags == 0, "expected entry #%d to be 0, was %d\n", num, p->flags);
606 winetest_ok(p->qwattr == 0, "expected entry #%d to be 0, was 0x%I64x\n", num, p->qwattr);
607}
608
610{
612 PATTRINFO p;
613
614 if (num == ~0)
615 return;
616
617 p = &pattr[num];
618 winetest_ok(p->type == tag, "expected entry #%d to be %x, was %x\n", num, tag, p->type);
619 winetest_ok(p->flags == ATTRIBUTE_AVAILABLE, "expected entry #%d to be available, was %d\n", num, p->flags);
620 winetest_ok(p->dwattr == value, "expected entry #%d to be 0x%x, was 0x%x\n", num, value, p->dwattr);
621}
622
624{
626 PATTRINFO p;
627
628 if (num == ~0)
629 return;
630
631 p = &pattr[num];
632 winetest_ok(p->type == tag, "expected entry #%d to be %x, was %x\n", num, tag, p->type);
633 winetest_ok(p->flags == ATTRIBUTE_AVAILABLE, "expected entry #%d to be available, was %d\n", num, p->flags);
634 winetest_ok(p->qwattr == value, "expected entry #%d to be 0x%I64x, was 0x%I64x\n", num, value, p->qwattr);
635}
636
637static void expect_tag_str_imp(PATTRINFO pattr, TAG tag, const WCHAR* value)
638{
640 PATTRINFO p;
641
642 if (num == ~0)
643 return;
644
645 p = &pattr[num];
646 winetest_ok(p->type == tag, "expected entry #%d to be %x, was %x\n", num, tag, p->type);
647 winetest_ok(p->flags == ATTRIBUTE_AVAILABLE, "expected entry #%d to be available, was %d\n", num, p->flags);
648 winetest_ok(p->lpattr && wcscmp(p->lpattr, value) == 0, "expected entry #%d to be %s, was %s\n", num, wine_dbgstr_w(value), wine_dbgstr_w(p->lpattr));
649}
650
651#define expect_tag_skip (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_tag_skip_imp
652#define expect_tag_empty (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_tag_empty_imp
653#define expect_tag_dword (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_tag_dword_imp
654#define expect_tag_qword (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_tag_qword_imp
655#define expect_tag_str (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_tag_str_imp
656#define expect_tag_skip_range(ptr, from, to) \
657 do { \
658 int n = (from), n_end = (to); \
659 winetest_set_location(__FILE__, __LINE__); \
660 for ( ; n < n_end; ++n) \
661 expect_tag_skip_imp((ptr), n); \
662 } while (0)
663#define test_crc (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : test_crc_imp
664#define test_crc2 (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : test_crc2_imp
665
667{
668 PATTRINFO pattrinfo;
669 DWORD num;
670
671 if (!pSdbFreeFileAttributes)
672 {
673 hdll = LoadLibraryA("apphelp.dll");
674 pSdbTagToString = (void *)GetProcAddress(hdll, "SdbTagToString");
675 pSdbGetFileAttributes = (void *)GetProcAddress(hdll, "SdbGetFileAttributes");
676 pSdbFreeFileAttributes = (void *)GetProcAddress(hdll, "SdbFreeFileAttributes");
677 }
678
679 if (pSdbGetFileAttributes(filename, &pattrinfo, &num))
680 {
681 if (pattrinfo[16].flags == ATTRIBUTE_AVAILABLE)
682 {
683 if (pattrinfo[16].type != TAG_MODULE_TYPE)//SdbpSetAttrFail(&attr_info[16]); /* TAG_MODULE_TYPE (1: WIN16?) (3: WIN32?) (WIN64?), Win32VersionValue? */)
684 printf("FAIL TAG_MODULE_TYPE (%S)\n", filename);
685 if (pattrinfo[16].dwattr != 3 && pattrinfo[16].dwattr != 2)
686 printf("TAG_MODULE_TYPE(%S): %d\n", filename, pattrinfo[16].dwattr); // C:\Program Files (x86)\Windows Kits\8.1\Lib\win7\stub512.com
687 if (pattrinfo[16].dwattr == 2)
688 {
689 printf("TAG_MODULE_TYPE(%S): %d, %d\n", filename, pattrinfo[16].dwattr, pattrinfo[0].dwattr);
690 }
691 }
692
693 if (pattrinfo[27].flags == ATTRIBUTE_AVAILABLE)
694 {
695 if (pattrinfo[27].type != TAG_EXE_WRAPPER)
696 printf("FAIL TAG_EXE_WRAPPER (%S)\n", filename);
697 if (pattrinfo[27].dwattr != 0)
698 printf("TAG_EXE_WRAPPER(%S): %d\n", filename, pattrinfo[27].dwattr);
699 }
700
701 pSdbFreeFileAttributes(pattrinfo);
702 }
703}
704
705static void test_crc_imp(size_t len, DWORD expected)
706{
707 static const WCHAR path[] = {'t','e','s','t','x','x','.','e','x','e',0};
708 static char crc_test[] = {4, 4, 4, 4, 1, 1, 1, 1, 4, 4, 4, 4, 2, 2, 2, 2};
709
710 PATTRINFO pattrinfo = (PATTRINFO)0xdead;
711 DWORD num = 333;
712 BOOL ret;
713
714 test_create_file_imp(L"testxx.exe", crc_test, len);
715 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
716 winetest_ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
717 winetest_ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
718 winetest_ok(num == g_AttrInfoSize, "expected %u items, got %d.\n", g_AttrInfoSize, num);
719
720 if (num == g_AttrInfoSize && ret)
721 {
723 }
724 if (ret)
725 pSdbFreeFileAttributes(pattrinfo);
726}
727
729{
730 static const WCHAR path[] = {'t','e','s','t','x','x','.','e','x','e',0};
731
732 PATTRINFO pattrinfo = (PATTRINFO)0xdead;
733 DWORD num = 333;
734 BOOL ret;
735 size_t n;
736 char* crc_test = malloc(len);
737 for (n = 0; n < len; ++n)
738 crc_test[n] = (char)(fill ? fill : n);
739
740 test_create_file_imp(L"testxx.exe", crc_test, len);
741 free(crc_test);
742 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
743 winetest_ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
744 winetest_ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
745 winetest_ok(num == g_AttrInfoSize, "expected %u items, got %d.\n", g_AttrInfoSize, num);
746
747 if (num == g_AttrInfoSize && ret)
748 {
749 expect_tag_dword_imp(pattrinfo, TAG_SIZE, len);
751 }
752 if (ret)
753 pSdbFreeFileAttributes(pattrinfo);
754}
755
756
757
759{
760 static const WCHAR path[] = {'t','e','s','t','x','x','.','e','x','e',0};
761 static const WCHAR PRODUCT_VERSION[] = {'1','.','0','.','0','.','1',0};
762 static const WCHAR FILE_DESCRIPTION[] = {'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n',0};
763 static const WCHAR COMPANY_NAME[] = {'C','o','m','p','a','n','y','N','a','m','e',0};
764 static const WCHAR PRODUCT_NAME[] = {'P','r','o','d','u','c','t','N','a','m','e',0};
765 static const WCHAR FILE_VERSION[] = {'1','.','0','.','0','.','0',0};
766 static const WCHAR ORIGINAL_FILENAME[] = {'O','r','i','g','i','n','a','l','F','i','l','e','n','a','m','e',0};
767 static const WCHAR INTERNAL_NAME[] = {'I','n','t','e','r','n','a','l','N','a','m','e',0};
768 static const WCHAR LEGAL_COPYRIGHT[] = {'L','e','g','a','l','C','o','p','y','r','i','g','h','t',0};
769 static const WCHAR EXPORT_NAME[] = {'T','e','S','t','2','.','e','x','e',0};
770 static const WCHAR OS2_DESCRIPTION[] = {'M','O','D',' ','D','E','S','C','R','I','P','T','I','O','N',' ','H','E','R','E',0};
771 static const WCHAR OS2_EXPORT_NAME[] = {'T','E','S','T','M','O','D','.','h','X','x',0};
772 static const WCHAR OS2_DESCRIPTION_broken[] = {'Z',0};
773 static const WCHAR OS2_EXPORT_NAME_broken[] = {'E',0};
774
775 PATTRINFO pattrinfo = (PATTRINFO)0xdead;
776 DWORD num = 333;
777 BOOL ret;
778
779 /* ensure the file is not there. */
780 DeleteFileA("testxx.exe");
781 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
782 ok(ret == FALSE, "expected SdbGetFileAttributes to fail.\n");
783 ok(pattrinfo == (PATTRINFO)0xdead, "expected the pointer not to change.\n");
784 ok(num == 333, "expected the number of items not to change.\n");
785 if (ret)
786 pSdbFreeFileAttributes(pattrinfo);
787
788 /* Test a file with as much features as possible */
789 test_create_exe(L"testxx.exe", 0);
790
791 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
792 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
793 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
794
795 //for (UINT n = 0; n < num; ++n)
796 //{
797 // trace("%S\n", pSdbTagToString(pattrinfo[n].type));
798 //}
799
800 switch (num)
801 {
802 case 26:
803 // 2k3
804 g_AttrInfoSize = 26;
805 break;
806 case 28:
807 // Win7+ (and maybe vista, but who cares about that?)
808 g_AttrInfoSize = 28;
809 break;
810 default:
811 ok(0, "Unknown attrinfo size: %u\n", num);
812 break;
813 }
814
815 ok(num == g_AttrInfoSize, "expected %u items, got %d.\n", g_AttrInfoSize, num);
816
817 if (num == g_AttrInfoSize && ret)
818 {
819 expect_tag_dword(pattrinfo, TAG_SIZE, 0x800);
820 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0x178bd629);
821 expect_tag_qword(pattrinfo, TAG_BIN_FILE_VERSION, 0x1000000000000ull);
822 expect_tag_qword(pattrinfo, TAG_BIN_PRODUCT_VERSION, 0x1000000000001ull);
823 expect_tag_str(pattrinfo, TAG_PRODUCT_VERSION, PRODUCT_VERSION);
824 expect_tag_str(pattrinfo, TAG_FILE_DESCRIPTION, FILE_DESCRIPTION);
825 expect_tag_str(pattrinfo, TAG_COMPANY_NAME, COMPANY_NAME);
827 expect_tag_str(pattrinfo, TAG_FILE_VERSION, FILE_VERSION);
828 expect_tag_str(pattrinfo, TAG_ORIGINAL_FILENAME, ORIGINAL_FILENAME);
829 expect_tag_str(pattrinfo, TAG_INTERNAL_NAME, INTERNAL_NAME);
830 expect_tag_str(pattrinfo, TAG_LEGAL_COPYRIGHT, LEGAL_COPYRIGHT);
831 expect_tag_dword(pattrinfo, TAG_VERDATEHI, 0x1d1a019);
832 expect_tag_dword(pattrinfo, TAG_VERDATELO, 0xac754c50);
835 expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x3); /* Win32 */
836 expect_tag_dword(pattrinfo, TAG_PE_CHECKSUM, 0xBAAD);
837 expect_tag_dword(pattrinfo, TAG_LINKER_VERSION, 0x40002);
840 expect_tag_qword(pattrinfo, TAG_UPTO_BIN_FILE_VERSION, 0x1000000000000ull);
841 expect_tag_qword(pattrinfo, TAG_UPTO_BIN_PRODUCT_VERSION, 0x1000000000001ull);
842 expect_tag_dword(pattrinfo, TAG_LINK_DATE, 0x12345);
843 expect_tag_dword(pattrinfo, TAG_UPTO_LINK_DATE, 0x12345);
844 expect_tag_str(pattrinfo, TAG_EXPORT_NAME, EXPORT_NAME);
845 expect_tag_dword(pattrinfo, TAG_VER_LANGUAGE, 0xffff);
846 expect_tag_dword(pattrinfo, TAG_EXE_WRAPPER, 0x0);
847 }
848 if (ret)
849 pSdbFreeFileAttributes(pattrinfo);
850
851
852 /* Disable resource and exports */
853 test_create_exe(L"testxx.exe", 1);
854
855 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
856 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
857 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
858 ok(num == g_AttrInfoSize, "expected %u items, got %d.\n", g_AttrInfoSize, num);
859
860 if (num == g_AttrInfoSize && ret)
861 {
862 expect_tag_dword(pattrinfo, TAG_SIZE, 0x800);
863 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xea7caffd);
864 //expect_tag_skip_range(pattrinfo, 2, 16);
865 expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x3); /* Win32 */
866 expect_tag_dword(pattrinfo, TAG_PE_CHECKSUM, 0xBAAD);
867 expect_tag_dword(pattrinfo, TAG_LINKER_VERSION, 0x40002);
868 //expect_tag_skip_range(pattrinfo, 19, 23);
869 expect_tag_dword(pattrinfo, TAG_LINK_DATE, 0x12345);
870 expect_tag_dword(pattrinfo, TAG_UPTO_LINK_DATE, 0x12345);
873 expect_tag_dword(pattrinfo, TAG_EXE_WRAPPER, 0x0);
874 }
875 if (ret)
876 pSdbFreeFileAttributes(pattrinfo);
877
878 /* A file with just 'MZ' */
879 test_create_file(L"testxx.exe", "MZ", 2);
880
881 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
882 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
883 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
884 ok(num == g_AttrInfoSize, "expected %u items, got %d.\n", g_AttrInfoSize, num);
885
886 if (num == g_AttrInfoSize && ret)
887 {
888 expect_tag_dword(pattrinfo, TAG_SIZE, 0x2);
889 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0);
890 //expect_tag_skip_range(pattrinfo, 2, 16);
891 expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x1);
892 //expect_tag_skip_range(pattrinfo, 17, 26);
895 }
896 if (ret)
897 pSdbFreeFileAttributes(pattrinfo);
898
899 /* Empty file */
900 test_create_file(L"testxx.exe", NULL, 0);
901
902 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
903 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
904 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
905 ok(num == g_AttrInfoSize, "expected %u items, got %d.\n", g_AttrInfoSize, num);
906
907 if (num == g_AttrInfoSize && ret)
908 {
909 expect_tag_dword(pattrinfo, TAG_SIZE, 0);
910 //expect_tag_skip_range(pattrinfo, 1, 26);
913 }
914 if (ret)
915 pSdbFreeFileAttributes(pattrinfo);
916
917 /* minimal NE executable */
918 test_create_ne(L"testxx.exe", 0);
919
920 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
921 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
922 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
923 ok(num == g_AttrInfoSize, "expected %u items, got %d.\n", g_AttrInfoSize, num);
924
925 if (num == g_AttrInfoSize && ret)
926 {
927 expect_tag_dword(pattrinfo, TAG_SIZE, 0xa8);
928 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xf2abe4e9);
929 //expect_tag_skip_range(pattrinfo, 2, 16);
930 expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x2);
933 expect_tag_str(pattrinfo, TAG_16BIT_DESCRIPTION, OS2_DESCRIPTION);
934 expect_tag_str(pattrinfo, TAG_16BIT_MODULE_NAME, OS2_EXPORT_NAME);
935 //expect_tag_skip_range(pattrinfo, 21, 26);
938 }
939 if (ret)
940 pSdbFreeFileAttributes(pattrinfo);
941
942 /* NE executable with description / module name pointers zero, to show they are always used */
943 test_create_ne(L"testxx.exe", 1);
944
945 ret = pSdbGetFileAttributes(path, &pattrinfo, &num);
946 ok(ret != FALSE, "expected SdbGetFileAttributes to succeed.\n");
947 ok(pattrinfo != (PATTRINFO)0xdead, "expected a valid pointer.\n");
948 ok(num == g_AttrInfoSize, "expected %u items, got %d.\n", g_AttrInfoSize, num);
949
950 if (num == g_AttrInfoSize && ret)
951 {
952 expect_tag_dword(pattrinfo, TAG_SIZE, 0xa8);
953 expect_tag_dword(pattrinfo, TAG_CHECKSUM, 0xddcbe4c9);
954 //expect_tag_skip_range(pattrinfo, 2, 16);
955 expect_tag_dword(pattrinfo, TAG_MODULE_TYPE, 0x2);
958 expect_tag_str(pattrinfo, TAG_16BIT_DESCRIPTION, OS2_DESCRIPTION_broken); /* the 'Z' from 'MZ' */
959 expect_tag_str(pattrinfo, TAG_16BIT_MODULE_NAME, OS2_EXPORT_NAME_broken); /* the 'E' from 'NE' */
960 //expect_tag_skip_range(pattrinfo, 21, 26);
963 }
964 if (ret)
965 pSdbFreeFileAttributes(pattrinfo);
966
967 test_crc(1, 0);
968 test_crc(2, 0);
969 test_crc(3, 0);
970 test_crc(4, 0x2020202);
971 test_crc(5, 0x2020202);
972 test_crc(6, 0x2020202);
973 test_crc(7, 0x2020202);
974 test_crc(8, 0x81818181);
975 test_crc(9, 0x81818181);
976 test_crc(10, 0x81818181);
977 test_crc(11, 0x81818181);
978 test_crc(12, 0xc2c2c2c2);
979 test_crc(16, 0x62626262);
980
981 /* This seems to be the cutoff point */
982 test_crc2(0xffc, 4, 0xfbfbfcfc);
983 test_crc2(0xffc, 8, 0x7070717);
984 test_crc2(0xffc, 0xcc, 0xc8eba002);
985 test_crc2(0xffc, 0, 0x4622028d);
986
987 test_crc2(0x1000, 4, 0x80);
988 test_crc2(0x1000, 8, 0x8787878f);
989 test_crc2(0x1000, 0xcc, 0x4adc3667);
990 test_crc2(0x1000, 0, 0xa3108044);
991
992 /* Here is another cutoff point */
993 test_crc2(0x11fc, 4, 0x80);
994 test_crc2(0x11fc, 8, 0x8787878f);
995 test_crc2(0x11fc, 0xcc, 0x4adc3667);
996 test_crc2(0x11fc, 0, 0xf03e0800);
997
998 test_crc2(0x1200, 4, 0x80);
999 test_crc2(0x1200, 8, 0x8787878f);
1000 test_crc2(0x1200, 0xcc, 0x4adc3667);
1001 test_crc2(0x1200, 0, 0xa3108044);
1002
1003 /* After that, it stays the same for all sizes */
1004 test_crc2(0xf000, 4, 0x80);
1005 test_crc2(0xf000, 8, 0x8787878f);
1006 test_crc2(0xf000, 0xcc, 0x4adc3667);
1007 test_crc2(0xf000, 0, 0xa3108044);
1008
1009
1010 DeleteFileA("testxx.exe");
1011}
1012
1013/* Showing that SdbGetAppPatchDir returns HRESULT */
1014static void test_SdbGetAppPatchDir(void)
1015{
1018 int n;
1019
1020
1021 _SEH2_TRY
1022 {
1023 hr = pSdbGetAppPatchDir(NULL, NULL, 0);
1024 ok_hex(hr, S_FALSE);
1025 }
1027 {
1028 /* Some versions accept it, some don't */
1029 trace("SdbGetAppPatchDir did not handle a NULL pointer very gracefully.\n");
1030 }
1031 _SEH2_END;
1032
1033
1034
1035 memset(Buffer, 0xbb, sizeof(Buffer));
1036 hr = pSdbGetAppPatchDir(NULL, Buffer, 0);
1039 else if (g_WinVersion < WINVER_WIN10)
1040 expect_hr = S_OK;
1041 else
1044
1047 else if (g_WinVersion < WINVER_WIN10)
1048 expect_hr = S_OK;
1049 else
1050 expect_hr = TRUE;
1051
1052 memset(Buffer, 0xbb, sizeof(Buffer));
1053 hr = pSdbGetAppPatchDir(NULL, Buffer, 1);
1055
1056
1057 for (n = 2; n < _countof(Buffer) - 1; ++n)
1058 {
1059 memset(Buffer, 0xbb, sizeof(Buffer));
1060 hr = pSdbGetAppPatchDir(NULL, Buffer, n);
1061 ok(Buffer[n] == 0xbbbb, "Expected SdbGetAppPatchDir to leave WCHAR at %d untouched, was: %d\n",
1062 n, Buffer[n]);
1063 ok(hr == S_OK || hr == expect_hr, "Expected S_OK or 0x%x, was: 0x%x (at %d)\n", expect_hr, hr, n);
1064 }
1065}
1067{
1068 //SetEnvironmentVariable("SHIM_DEBUG_LEVEL", "4");
1069 //SetEnvironmentVariable("DEBUGCHANNEL", "+apphelp");
1071
1072 hdll = LoadLibraryA("apphelp.dll");
1074 trace("Detected apphelp.dll version: 0x%x\n", g_WinVersion);
1075
1076#define RESOLVE(fnc) do { p##fnc = (void *) GetProcAddress(hdll, #fnc); ok(!!p##fnc, #fnc " not found.\n"); } while (0)
1085#undef RESOLVE
1086
1092 if (pSdbGetAppPatchDir)
1094}
#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:752
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:579
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_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 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
#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 ERROR_INVALID_PARAMETER
Definition: compat.h:101
#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:4243
int WINAPI lstrcmpA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4195
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
#define printf
Definition: freeldr.h:97
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
const GUID * guid
#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:664
static void expect_tag_str_imp(PATTRINFO pattr, TAG tag, const WCHAR *value)
Definition: apphelp.c:637
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:623
#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:496
#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
static PWSTR SIZE_T Length
Definition: apphelp.c:93
#define expect_tag_dword
Definition: apphelp.c:653
static PATTRINFO LPDWORD pdwAttrCount
Definition: apphelp.c:96
static GUID * Guid
Definition: apphelp.c:95
static TAG g_Tags_28[]
Definition: apphelp.c:526
static void test_crc2_imp(DWORD len, int fill, DWORD expected)
Definition: apphelp.c:728
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:651
#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:595
#define TAG_EXPORT_NAME
Definition: apphelp.c:74
#define TAG_CHECKSUM
Definition: apphelp.c:47
void test_onefile(WCHAR *filename)
Definition: apphelp.c:666
#define TAG_PE_CHECKSUM
Definition: apphelp.c:53
#define test_crc
Definition: apphelp.c:663
static void test_SdbGetAppPatchDir(void)
Definition: apphelp.c:1014
static void expect_tag_dword_imp(PATTRINFO pattr, TAG tag, DWORD value)
Definition: apphelp.c:609
#define TAG_VERDATELO
Definition: apphelp.c:50
TAG base
Definition: apphelp.c:211
#define expect_tag_empty
Definition: apphelp.c:652
#define TAG_TYPE_NULL
Definition: apphelp.c:36
static void test_GuidFunctions(void)
Definition: apphelp.c:470
static void test_SdbTagToStringAllTags(void)
Definition: apphelp.c:457
#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:654
#define TAG_NULL
Definition: apphelp.c:45
static DWORD find_tag(TAG tag)
Definition: apphelp.c:558
static void test_crc_imp(size_t len, DWORD expected)
Definition: apphelp.c:705
#define TAG_16BIT_MODULE_NAME
Definition: apphelp.c:73
#define RESOLVE(fnc)
static void test_ApplicationAttributes(void)
Definition: apphelp.c:758
#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:582
#define TAG_TYPE_STRING
Definition: apphelp.c:43
const char * tags[7 *8]
Definition: apphelp.c:216
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:655
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:2063
static const char * strw(LPCWSTR x)
Definition: actctx.c:49
#define expect_hr(expected, got)
Definition: assoc.c:27
static const WCHAR invalid[]
Definition: assoc.c:39
#define L(x)
Definition: ntvdm.h:50
#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:66
#define _SEH2_END
Definition: pseh2_64.h:155
#define _SEH2_TRY
Definition: pseh2_64.h:55
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
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
#define win_skip
Definition: test.h:163
void __winetest_cdecl winetest_ok(int condition, const char *msg,...)
#define memset(x, y, z)
Definition: compat.h:39
UINT64 QWORD
Definition: shimdbg.c:104
HRESULT hr
Definition: shlfolder.c:183
#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
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t * LPDWORD
Definition: typedefs.h:59
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
Definition: pdh_main.c:94
#define VOS__WINDOWS32
Definition: verrsrc.h:64
#define VFT_APP
Definition: verrsrc.h:75
int ret
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:2357
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
char CHAR
Definition: xmlstorage.h:175