[MSI_WINETEST]
[reactos.git] / rostests / winetests / msi / action.c
1 /*
2 * Copyright (C) 2006 James Hawkins
3 * Copyright 2010 Hans Leidekker for CodeWeavers
4 *
5 * Tests concentrating on standard actions
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22 #define _WIN32_MSI 300
23 #include <stdio.h>
24
25 #include <windows.h>
26 #include <msiquery.h>
27 #include <msidefs.h>
28 #include <msi.h>
29 #include <fci.h>
30 #include <srrestoreptapi.h>
31
32 #include "wine/test.h"
33
34 static UINT (WINAPI *pMsiQueryComponentStateA)
35 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPCSTR, INSTALLSTATE *);
36 static UINT (WINAPI *pMsiSourceListEnumSourcesA)
37 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD);
38 static UINT (WINAPI *pMsiSourceListGetInfoA)
39 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD);
40 static INSTALLSTATE (WINAPI *pMsiGetComponentPathExA)
41 (LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPSTR, LPDWORD);
42
43 static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR *);
44 static BOOL (WINAPI *pGetTokenInformation)(HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD);
45 static BOOL (WINAPI *pOpenProcessToken)(HANDLE, DWORD, PHANDLE);
46 static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD);
47 static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
48
49 static HMODULE hsrclient;
50 static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD);
51 static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA *, STATEMGRSTATUS *);
52
53 static BOOL is_wow64;
54 static const BOOL is_64bit = sizeof(void *) > sizeof(int);
55
56 static const char *msifile = "msitest.msi";
57 static CHAR CURR_DIR[MAX_PATH];
58 static CHAR PROG_FILES_DIR[MAX_PATH];
59 static CHAR COMMON_FILES_DIR[MAX_PATH];
60 static CHAR APP_DATA_DIR[MAX_PATH];
61 static CHAR WINDOWS_DIR[MAX_PATH];
62
63 /* msi database data */
64
65 static const char component_dat[] =
66 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
67 "s72\tS38\ts72\ti2\tS255\tS72\n"
68 "Component\tComponent\n"
69 "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n"
70 "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n"
71 "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\tNOT REINSTALL\tone.txt\n"
72 "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n"
73 "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n"
74 "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n"
75 "component\t\tMSITESTDIR\t0\t1\tfile\n"
76 "service_comp\t{935A0A91-22A3-4F87-BCA8-928FFDFE2353}\tMSITESTDIR\t0\t\tservice_file\n"
77 "service_comp2\t{3F7B04A4-9521-4649-BDC9-0C8722740A49}\tMSITESTDIR\t0\t\tservice_file2";
78
79 static const char directory_dat[] =
80 "Directory\tDirectory_Parent\tDefaultDir\n"
81 "s72\tS72\tl255\n"
82 "Directory\tDirectory\n"
83 "CABOUTDIR\tMSITESTDIR\tcabout\n"
84 "CHANGEDDIR\tMSITESTDIR\tchanged:second\n"
85 "FIRSTDIR\tMSITESTDIR\tfirst\n"
86 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
87 "NEWDIR\tCABOUTDIR\tnew\n"
88 "ProgramFilesFolder\tTARGETDIR\t.\n"
89 "TARGETDIR\t\tSourceDir";
90
91 static const char feature_dat[] =
92 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
93 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
94 "Feature\tFeature\n"
95 "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n"
96 "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n"
97 "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n"
98 "Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n"
99 "Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n"
100 "feature\t\t\t\t2\t1\tTARGETDIR\t0\n"
101 "service_feature\t\t\t\t2\t1\tTARGETDIR\t0";
102
103 static const char feature_comp_dat[] =
104 "Feature_\tComponent_\n"
105 "s38\ts72\n"
106 "FeatureComponents\tFeature_\tComponent_\n"
107 "Five\tFive\n"
108 "Four\tFour\n"
109 "One\tOne\n"
110 "Three\tThree\n"
111 "Two\tTwo\n"
112 "feature\tcomponent\n"
113 "service_feature\tservice_comp\n"
114 "service_feature\tservice_comp2";
115
116 static const char file_dat[] =
117 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
118 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
119 "File\tFile\n"
120 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
121 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
122 "one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n"
123 "three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n"
124 "two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n"
125 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
126 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t6\n"
127 "service_file2\tservice_comp2\tservice2.exe\t100\t\t\t8192\t7";
128
129 static const char install_exec_seq_dat[] =
130 "Action\tCondition\tSequence\n"
131 "s72\tS255\tI2\n"
132 "InstallExecuteSequence\tAction\n"
133 "AllocateRegistrySpace\tNOT Installed\t1550\n"
134 "CostFinalize\t\t1000\n"
135 "CostInitialize\t\t800\n"
136 "FileCost\t\t900\n"
137 "ResolveSource\t\t950\n"
138 "MoveFiles\t\t1700\n"
139 "InstallFiles\t\t4000\n"
140 "DuplicateFiles\t\t4500\n"
141 "WriteEnvironmentStrings\t\t4550\n"
142 "CreateShortcuts\t\t4600\n"
143 "InstallServices\t\t5000\n"
144 "InstallFinalize\t\t6600\n"
145 "InstallInitialize\t\t1500\n"
146 "InstallValidate\t\t1400\n"
147 "LaunchConditions\t\t100\n"
148 "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000";
149
150 static const char media_dat[] =
151 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
152 "i2\ti4\tL64\tS255\tS32\tS72\n"
153 "Media\tDiskId\n"
154 "1\t3\t\t\tDISK1\t\n"
155 "2\t7\t\tmsitest.cab\tDISK2\t\n";
156
157 static const char property_dat[] =
158 "Property\tValue\n"
159 "s72\tl0\n"
160 "Property\tProperty\n"
161 "DefaultUIFont\tDlgFont8\n"
162 "HASUIRUN\t0\n"
163 "INSTALLLEVEL\t3\n"
164 "InstallMode\tTypical\n"
165 "Manufacturer\tWine\n"
166 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
167 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
168 "ProductID\tnone\n"
169 "ProductLanguage\t1033\n"
170 "ProductName\tMSITEST\n"
171 "ProductVersion\t1.1.1\n"
172 "PROMPTROLLBACKCOST\tP\n"
173 "Setup\tSetup\n"
174 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
175 "AdminProperties\tPOSTADMIN\n"
176 "ROOTDRIVE\tC:\\\n"
177 "SERVNAME\tTestService\n"
178 "SERVNAME2\tTestService2\n"
179 "SERVDISP\tTestServiceDisp\n"
180 "SERVDISP2\tTestServiceDisp2\n"
181 "MSIFASTINSTALL\t1\n";
182
183 static const char environment_dat[] =
184 "Environment\tName\tValue\tComponent_\n"
185 "s72\tl255\tL255\ts72\n"
186 "Environment\tEnvironment\n"
187 "Var1\t=-MSITESTVAR1\t1\tOne\n"
188 "Var2\tMSITESTVAR2\t1\tOne\n"
189 "Var3\t=-MSITESTVAR3\t1\tOne\n"
190 "Var4\tMSITESTVAR4\t1\tOne\n"
191 "Var5\t-MSITESTVAR5\t\tOne\n"
192 "Var6\tMSITESTVAR6\t\tOne\n"
193 "Var7\t!-MSITESTVAR7\t\tOne\n"
194 "Var8\t!-*MSITESTVAR8\t\tOne\n"
195 "Var9\t=-MSITESTVAR9\t\tOne\n"
196 "Var10\t=MSITESTVAR10\t\tOne\n"
197 "Var11\t+-MSITESTVAR11\t[~];1\tOne\n"
198 "Var12\t+-MSITESTVAR11\t[~];2\tOne\n"
199 "Var13\t+-MSITESTVAR12\t[~];1\tOne\n"
200 "Var14\t=MSITESTVAR13\t[~];1\tOne\n"
201 "Var15\t=MSITESTVAR13\t[~];2\tOne\n"
202 "Var16\t=MSITESTVAR14\t;1;\tOne\n"
203 "Var17\t=MSITESTVAR15\t;;1;;\tOne\n"
204 "Var18\t=MSITESTVAR16\t 1 \tOne\n"
205 "Var19\t+-MSITESTVAR17\t1\tOne\n"
206 "Var20\t+-MSITESTVAR17\t;;2;;[~]\tOne\n"
207 "Var21\t+-MSITESTVAR18\t1\tOne\n"
208 "Var22\t+-MSITESTVAR18\t[~];;2;;\tOne\n"
209 "Var23\t+-MSITESTVAR19\t1\tOne\n"
210 "Var24\t+-MSITESTVAR19\t[~]2\tOne\n"
211 "Var25\t+-MSITESTVAR20\t1\tOne\n"
212 "Var26\t+-MSITESTVAR20\t2[~]\tOne\n";
213
214 static const char service_install_dat[] =
215 "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
216 "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n"
217 "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n"
218 "ServiceInstall\tServiceInstall\n"
219 "TestService\t[SERVNAME]\t[SERVDISP]\t2\t3\t0\t\tservice1[~]+group1[~]service2[~]+group2[~][~]\tTestService\t\t-a arg\tservice_comp\tdescription\n"
220 "TestService2\tSERVNAME2]\t[SERVDISP2]\t2\t3\t0\t\tservice1[~]+group1[~]service2[~]+group2[~][~]\tTestService2\t\t-a arg\tservice_comp2\tdescription";
221
222 static const char service_control_dat[] =
223 "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
224 "s72\tl255\ti2\tL255\tI2\ts72\n"
225 "ServiceControl\tServiceControl\n"
226 "ServiceControl\tTestService3\t8\t\t0\tservice_comp\n"
227 "ServiceControl2\tTestService3\t128\t\t0\tservice_comp2";
228
229 static const char sss_service_control_dat[] =
230 "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
231 "s72\tl255\ti2\tL255\tI2\ts72\n"
232 "ServiceControl\tServiceControl\n"
233 "ServiceControl\tSpooler\t1\t\t0\tservice_comp";
234
235 static const char sss_install_exec_seq_dat[] =
236 "Action\tCondition\tSequence\n"
237 "s72\tS255\tI2\n"
238 "InstallExecuteSequence\tAction\n"
239 "LaunchConditions\t\t100\n"
240 "CostInitialize\t\t800\n"
241 "FileCost\t\t900\n"
242 "ResolveSource\t\t950\n"
243 "CostFinalize\t\t1000\n"
244 "InstallValidate\t\t1400\n"
245 "InstallInitialize\t\t1500\n"
246 "DeleteServices\t\t5000\n"
247 "MoveFiles\t\t5100\n"
248 "InstallFiles\t\t5200\n"
249 "DuplicateFiles\t\t5300\n"
250 "StartServices\t\t5400\n"
251 "InstallFinalize\t\t6000\n";
252
253 static const char sds_install_exec_seq_dat[] =
254 "Action\tCondition\tSequence\n"
255 "s72\tS255\tI2\n"
256 "InstallExecuteSequence\tAction\n"
257 "LaunchConditions\t\t100\n"
258 "CostInitialize\t\t800\n"
259 "FileCost\t\t900\n"
260 "ResolveSource\t\t950\n"
261 "CostFinalize\t\t1000\n"
262 "InstallValidate\t\t1400\n"
263 "InstallInitialize\t\t1500\n"
264 "StopServices\t\t5000\n"
265 "DeleteServices\t\t5050\n"
266 "MoveFiles\t\t5100\n"
267 "InstallFiles\t\t5200\n"
268 "DuplicateFiles\t\t5300\n"
269 "InstallServices\t\t5400\n"
270 "StartServices\t\t5450\n"
271 "RegisterProduct\t\t5500\n"
272 "PublishFeatures\t\t5600\n"
273 "PublishProduct\t\t5700\n"
274 "InstallFinalize\t\t6000\n";
275
276 static const char rof_component_dat[] =
277 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
278 "s72\tS38\ts72\ti2\tS255\tS72\n"
279 "Component\tComponent\n"
280 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n";
281
282 static const char rof_feature_dat[] =
283 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
284 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
285 "Feature\tFeature\n"
286 "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n"
287 "montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0";
288
289 static const char rof_feature_comp_dat[] =
290 "Feature_\tComponent_\n"
291 "s38\ts72\n"
292 "FeatureComponents\tFeature_\tComponent_\n"
293 "feature\tmaximus\n"
294 "montecristo\tmaximus";
295
296 static const char rof_file_dat[] =
297 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
298 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
299 "File\tFile\n"
300 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1";
301
302 static const char rof_media_dat[] =
303 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
304 "i2\ti4\tL64\tS255\tS32\tS72\n"
305 "Media\tDiskId\n"
306 "1\t1\t\t\tDISK1\t\n";
307
308 static const char ci2_feature_comp_dat[] =
309 "Feature_\tComponent_\n"
310 "s38\ts72\n"
311 "FeatureComponents\tFeature_\tComponent_\n"
312 "feature\taugustus";
313
314 static const char ci2_file_dat[] =
315 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
316 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
317 "File\tFile\n"
318 "augustus\taugustus\taugustus\t500\t\t\t8192\t1";
319
320 static const char pp_install_exec_seq_dat[] =
321 "Action\tCondition\tSequence\n"
322 "s72\tS255\tI2\n"
323 "InstallExecuteSequence\tAction\n"
324 "ValidateProductID\t\t700\n"
325 "CostInitialize\t\t800\n"
326 "FileCost\t\t900\n"
327 "CostFinalize\t\t1000\n"
328 "InstallValidate\t\t1400\n"
329 "InstallInitialize\t\t1500\n"
330 "ProcessComponents\tPROCESS_COMPONENTS=1 Or FULL=1\t1600\n"
331 "UnpublishFeatures\tUNPUBLISH_FEATURES=1 Or FULL=1\t1800\n"
332 "RemoveFiles\t\t3500\n"
333 "InstallFiles\t\t4000\n"
334 "RegisterUser\tREGISTER_USER=1 Or FULL=1\t6000\n"
335 "RegisterProduct\tREGISTER_PRODUCT=1 Or FULL=1\t6100\n"
336 "PublishFeatures\tPUBLISH_FEATURES=1 Or FULL=1\t6300\n"
337 "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n"
338 "InstallFinalize\t\t6600";
339
340 static const char pp_component_dat[] =
341 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
342 "s72\tS38\ts72\ti2\tS255\tS72\n"
343 "Component\tComponent\n"
344 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\t\tmaximus\n";
345
346 static const char ppc_component_dat[] =
347 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
348 "s72\tS38\ts72\ti2\tS255\tS72\n"
349 "Component\tComponent\n"
350 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\t\tmaximus\n"
351 "augustus\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\taugustus\n";
352
353 static const char ppc_file_dat[] =
354 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
355 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
356 "File\tFile\n"
357 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1\n"
358 "augustus\taugustus\taugustus\t500\t\t\t8192\t2";
359
360 static const char ppc_media_dat[] =
361 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
362 "i2\ti4\tL64\tS255\tS32\tS72\n"
363 "Media\tDiskId\n"
364 "1\t2\t\t\tDISK1\t\n";
365
366 static const char ppc_feature_comp_dat[] =
367 "Feature_\tComponent_\n"
368 "s38\ts72\n"
369 "FeatureComponents\tFeature_\tComponent_\n"
370 "feature\tmaximus\n"
371 "feature\taugustus\n"
372 "montecristo\tmaximus";
373
374 static const char cwd_component_dat[] =
375 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
376 "s72\tS38\ts72\ti2\tS255\tS72\n"
377 "Component\tComponent\n"
378 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
379
380 static const char rem_component_dat[] =
381 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
382 "s72\tS38\ts72\ti2\tS255\tS72\n"
383 "Component\tComponent\n"
384 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t0\t\thydrogen\n"
385 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\thelium\n"
386 "lithium\t\tMSITESTDIR\t2\t\tlithium\n";
387
388 static const char rem_feature_comp_dat[] =
389 "Feature_\tComponent_\n"
390 "s38\ts72\n"
391 "FeatureComponents\tFeature_\tComponent_\n"
392 "feature\thydrogen\n"
393 "feature\thelium\n"
394 "feature\tlithium";
395
396 static const char rem_file_dat[] =
397 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
398 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
399 "File\tFile\n"
400 "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n"
401 "helium\thelium\thelium\t0\t\t\t8192\t1\n"
402 "lithium\tlithium\tlithium\t0\t\t\t8192\t1";
403
404 static const char rem_install_exec_seq_dat[] =
405 "Action\tCondition\tSequence\n"
406 "s72\tS255\tI2\n"
407 "InstallExecuteSequence\tAction\n"
408 "ValidateProductID\t\t700\n"
409 "CostInitialize\t\t800\n"
410 "FileCost\t\t900\n"
411 "CostFinalize\t\t1000\n"
412 "InstallValidate\t\t1400\n"
413 "InstallInitialize\t\t1500\n"
414 "ProcessComponents\t\t1600\n"
415 "UnpublishFeatures\t\t1800\n"
416 "RemoveFiles\t\t3500\n"
417 "InstallFiles\t\t4000\n"
418 "RegisterProduct\t\t6100\n"
419 "PublishFeatures\t\t6300\n"
420 "PublishProduct\t\t6400\n"
421 "InstallFinalize\t\t6600";
422
423 static const char rem_remove_files_dat[] =
424 "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n"
425 "s72\ts72\tS255\ts72\tI2\n"
426 "RemoveFile\tFileKey\n"
427 "furlong\thydrogen\tfurlong\tMSITESTDIR\t1\n"
428 "firkin\thelium\tfirkin\tMSITESTDIR\t1\n"
429 "fortnight\tlithium\tfortnight\tMSITESTDIR\t1\n"
430 "becquerel\thydrogen\tbecquerel\tMSITESTDIR\t2\n"
431 "dioptre\thelium\tdioptre\tMSITESTDIR\t2\n"
432 "attoparsec\tlithium\tattoparsec\tMSITESTDIR\t2\n"
433 "storeys\thydrogen\tstoreys\tMSITESTDIR\t3\n"
434 "block\thelium\tblock\tMSITESTDIR\t3\n"
435 "siriometer\tlithium\tsiriometer\tMSITESTDIR\t3\n"
436 "nanoacre\thydrogen\t\tCABOUTDIR\t3\n";
437
438 static const char mov_move_file_dat[] =
439 "FileKey\tComponent_\tSourceName\tDestName\tSourceFolder\tDestFolder\tOptions\n"
440 "s72\ts72\tS255\tS255\tS72\ts72\ti2\n"
441 "MoveFile\tFileKey\n"
442 "abkhazia\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t0\n"
443 "bahamas\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t1\n"
444 "cambodia\taugustus\tcameroon\tcanada\tSourceDir\tMSITESTDIR\t0\n"
445 "denmark\taugustus\tdjibouti\tdominica\tSourceDir\tMSITESTDIR\t1\n"
446 "ecuador\taugustus\tegypt\telsalvador\tNotAProp\tMSITESTDIR\t1\n"
447 "fiji\taugustus\tfinland\tfrance\tSourceDir\tNotAProp\t1\n"
448 "gabon\taugustus\tgambia\tgeorgia\tSOURCEFULL\tMSITESTDIR\t1\n"
449 "haiti\taugustus\thonduras\thungary\tSourceDir\tDESTFULL\t1\n"
450 "iceland\taugustus\tindia\tindonesia\tMSITESTDIR\tMSITESTDIR\t1\n"
451 "jamaica\taugustus\tjapan\tjordan\tFILEPATHBAD\tMSITESTDIR\t1\n"
452 "kazakhstan\taugustus\t\tkiribati\tFILEPATHGOOD\tMSITESTDIR\t1\n"
453 "laos\taugustus\tlatvia\tlebanon\tSourceDir\tMSITESTDIR\t1\n"
454 "namibia\taugustus\tnauru\tkiribati\tSourceDir\tMSITESTDIR\t1\n"
455 "pakistan\taugustus\tperu\tsfn|poland\tSourceDir\tMSITESTDIR\t1\n"
456 "wildcard\taugustus\tapp*\twildcard\tSourceDir\tMSITESTDIR\t1\n"
457 "single\taugustus\tf?o\tsingle\tSourceDir\tMSITESTDIR\t1\n"
458 "wildcardnodest\taugustus\tbudd*\t\tSourceDir\tMSITESTDIR\t1\n"
459 "singlenodest\taugustus\tb?r\t\tSourceDir\tMSITESTDIR\t1\n";
460
461 static const char df_directory_dat[] =
462 "Directory\tDirectory_Parent\tDefaultDir\n"
463 "s72\tS72\tl255\n"
464 "Directory\tDirectory\n"
465 "THIS\tMSITESTDIR\tthis\n"
466 "DOESNOT\tTHIS\tdoesnot\n"
467 "NONEXISTENT\tDOESNOT\texist\n"
468 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
469 "ProgramFilesFolder\tTARGETDIR\t.\n"
470 "TARGETDIR\t\tSourceDir";
471
472 static const char df_duplicate_file_dat[] =
473 "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n"
474 "s72\ts72\ts72\tS255\tS72\n"
475 "DuplicateFile\tFileKey\n"
476 "maximus\tmaximus\tmaximus\taugustus\t\n"
477 "caesar\tmaximus\tmaximus\t\tNONEXISTENT\n"
478 "augustus\tnosuchcomponent\tmaximus\t\tMSITESTDIR\n";
479
480 static const char wrv_component_dat[] =
481 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
482 "s72\tS38\ts72\ti2\tS255\tS72\n"
483 "Component\tComponent\n"
484 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
485
486 static const char wrv_registry_dat[] =
487 "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
488 "s72\ti2\tl255\tL255\tL0\ts72\n"
489 "Registry\tRegistry\n"
490 "regdata\t2\tSOFTWARE\\Wine\\msitest\tValue\t[~]one[~]two[~]three\taugustus";
491
492 static const char cf_directory_dat[] =
493 "Directory\tDirectory_Parent\tDefaultDir\n"
494 "s72\tS72\tl255\n"
495 "Directory\tDirectory\n"
496 "FIRSTDIR\tMSITESTDIR\tfirst\n"
497 "SECONDDIR\tMSITESTDIR\tsecond\n"
498 "THIRDDIR\tMSITESTDIR\tthird\n"
499 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
500 "ProgramFilesFolder\tTARGETDIR\t.\n"
501 "TARGETDIR\t\tSourceDir";
502
503 static const char cf_component_dat[] =
504 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
505 "s72\tS38\ts72\ti2\tS255\tS72\n"
506 "Component\tComponent\n"
507 "One\t{F8CD42AC-9C38-48FE-8664-B35FD121012A}\tFIRSTDIR\t0\t\tone.txt\n"
508 "Two\t{DE2DB02E-2DDF-4E34-8CF6-DCA13E29DF52}\tSECONDDIR\t0\t\ttwo.txt\n";
509
510 static const char cf_feature_dat[] =
511 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
512 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
513 "Feature\tFeature\n"
514 "One\t\tOne\tThe One Feature\t1\t3\tFIRSTDIR\t0\n"
515 "Two\t\tTwo\tThe Two Feature\t1\t3\tSECONDDIR\t0\n";
516
517 static const char cf_feature_comp_dat[] =
518 "Feature_\tComponent_\n"
519 "s38\ts72\n"
520 "FeatureComponents\tFeature_\tComponent_\n"
521 "One\tOne\n"
522 "Two\tTwo\n";
523
524 static const char cf_file_dat[] =
525 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
526 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
527 "File\tFile\n"
528 "one.txt\tOne\tone.txt\t0\t\t\t0\t1\n"
529 "two.txt\tTwo\ttwo.txt\t0\t\t\t0\t2\n";
530
531 static const char cf_create_folders_dat[] =
532 "Directory_\tComponent_\n"
533 "s72\ts72\n"
534 "CreateFolder\tDirectory_\tComponent_\n"
535 "FIRSTDIR\tOne\n"
536 "SECONDDIR\tTwo\n"
537 "THIRDDIR\tTwo\n";
538
539 static const char cf_install_exec_seq_dat[] =
540 "Action\tCondition\tSequence\n"
541 "s72\tS255\tI2\n"
542 "InstallExecuteSequence\tAction\n"
543 "CostFinalize\t\t1000\n"
544 "ValidateProductID\t\t700\n"
545 "CostInitialize\t\t800\n"
546 "FileCost\t\t900\n"
547 "RemoveFiles\t\t3500\n"
548 "CreateFolders\t\t3700\n"
549 "RemoveFolders\t\t3800\n"
550 "InstallFiles\t\t4000\n"
551 "RegisterUser\t\t6000\n"
552 "RegisterProduct\t\t6100\n"
553 "PublishFeatures\t\t6300\n"
554 "PublishProduct\t\t6400\n"
555 "InstallFinalize\t\t6600\n"
556 "InstallInitialize\t\t1500\n"
557 "ProcessComponents\t\t1600\n"
558 "UnpublishFeatures\t\t1800\n"
559 "InstallValidate\t\t1400\n"
560 "LaunchConditions\t\t100\n";
561
562 static const char sr_selfreg_dat[] =
563 "File_\tCost\n"
564 "s72\tI2\n"
565 "SelfReg\tFile_\n"
566 "one.txt\t1\n";
567
568 static const char sr_install_exec_seq_dat[] =
569 "Action\tCondition\tSequence\n"
570 "s72\tS255\tI2\n"
571 "InstallExecuteSequence\tAction\n"
572 "CostFinalize\t\t1000\n"
573 "CostInitialize\t\t800\n"
574 "FileCost\t\t900\n"
575 "ResolveSource\t\t950\n"
576 "MoveFiles\t\t1700\n"
577 "SelfUnregModules\t\t3900\n"
578 "InstallFiles\t\t4000\n"
579 "DuplicateFiles\t\t4500\n"
580 "WriteEnvironmentStrings\t\t4550\n"
581 "CreateShortcuts\t\t4600\n"
582 "InstallFinalize\t\t6600\n"
583 "InstallInitialize\t\t1500\n"
584 "InstallValidate\t\t1400\n"
585 "LaunchConditions\t\t100\n";
586
587 static const char font_media_dat[] =
588 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
589 "i2\ti4\tL64\tS255\tS32\tS72\n"
590 "Media\tDiskId\n"
591 "1\t3\t\t\tDISK1\t\n";
592
593 static const char font_file_dat[] =
594 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
595 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
596 "File\tFile\n"
597 "font.ttf\tfonts\tfont.ttf\t1000\t\t\t8192\t1\n";
598
599 static const char font_feature_dat[] =
600 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
601 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
602 "Feature\tFeature\n"
603 "fonts\t\t\tfont feature\t1\t2\tMSITESTDIR\t0\n";
604
605 static const char font_component_dat[] =
606 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
607 "s72\tS38\ts72\ti2\tS255\tS72\n"
608 "Component\tComponent\n"
609 "fonts\t{F5920ED0-1183-4B8F-9330-86CE56557C05}\tMSITESTDIR\t0\t\tfont.ttf\n";
610
611 static const char font_feature_comp_dat[] =
612 "Feature_\tComponent_\n"
613 "s38\ts72\n"
614 "FeatureComponents\tFeature_\tComponent_\n"
615 "fonts\tfonts\n";
616
617 static const char font_dat[] =
618 "File_\tFontTitle\n"
619 "s72\tS128\n"
620 "Font\tFile_\n"
621 "font.ttf\tmsi test font\n";
622
623 static const char font_install_exec_seq_dat[] =
624 "Action\tCondition\tSequence\n"
625 "s72\tS255\tI2\n"
626 "InstallExecuteSequence\tAction\n"
627 "ValidateProductID\t\t700\n"
628 "CostInitialize\t\t800\n"
629 "FileCost\t\t900\n"
630 "CostFinalize\t\t1000\n"
631 "InstallValidate\t\t1400\n"
632 "InstallInitialize\t\t1500\n"
633 "ProcessComponents\t\t1600\n"
634 "UnpublishFeatures\t\t1800\n"
635 "RemoveFiles\t\t3500\n"
636 "InstallFiles\t\t4000\n"
637 "RegisterFonts\t\t4100\n"
638 "UnregisterFonts\t\t4200\n"
639 "RegisterUser\t\t6000\n"
640 "RegisterProduct\t\t6100\n"
641 "PublishFeatures\t\t6300\n"
642 "PublishProduct\t\t6400\n"
643 "InstallFinalize\t\t6600";
644
645 static const char vp_property_dat[] =
646 "Property\tValue\n"
647 "s72\tl0\n"
648 "Property\tProperty\n"
649 "HASUIRUN\t0\n"
650 "INSTALLLEVEL\t3\n"
651 "InstallMode\tTypical\n"
652 "Manufacturer\tWine\n"
653 "PIDTemplate\t###-#######\n"
654 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
655 "ProductLanguage\t1033\n"
656 "ProductName\tMSITEST\n"
657 "ProductVersion\t1.1.1\n"
658 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
659 "MSIFASTINSTALL\t1\n";
660
661 static const char vp_custom_action_dat[] =
662 "Action\tType\tSource\tTarget\tISComments\n"
663 "s72\ti2\tS64\tS0\tS255\n"
664 "CustomAction\tAction\n"
665 "SetProductID1\t51\tProductID\t1\t\n"
666 "SetProductID2\t51\tProductID\t2\t\n"
667 "TestProductID1\t19\t\t\tHalts installation\n"
668 "TestProductID2\t19\t\t\tHalts installation\n";
669
670 static const char vp_install_exec_seq_dat[] =
671 "Action\tCondition\tSequence\n"
672 "s72\tS255\tI2\n"
673 "InstallExecuteSequence\tAction\n"
674 "LaunchConditions\t\t100\n"
675 "CostInitialize\t\t800\n"
676 "FileCost\t\t900\n"
677 "CostFinalize\t\t1000\n"
678 "InstallValidate\t\t1400\n"
679 "InstallInitialize\t\t1500\n"
680 "SetProductID1\tSET_PRODUCT_ID=1\t3000\n"
681 "SetProductID2\tSET_PRODUCT_ID=2\t3100\n"
682 "ValidateProductID\t\t3200\n"
683 "InstallExecute\t\t3300\n"
684 "TestProductID1\tProductID=1\t3400\n"
685 "TestProductID2\tProductID=\"123-1234567\"\t3500\n"
686 "InstallFiles\t\t4000\n"
687 "InstallFinalize\t\t6000\n";
688
689 static const char odbc_file_dat[] =
690 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
691 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
692 "File\tFile\n"
693 "ODBCdriver.dll\todbc\tODBCdriver.dll\t1000\t\t\t8192\t1\n"
694 "ODBCdriver2.dll\todbc\tODBCdriver2.dll\t1000\t\t\t8192\t2\n"
695 "ODBCtranslator.dll\todbc\tODBCtranslator.dll\t1000\t\t\t8192\t3\n"
696 "ODBCtranslator2.dll\todbc\tODBCtranslator2.dll\t1000\t\t\t8192\t4\n"
697 "ODBCsetup.dll\todbc\tODBCsetup.dll\t1000\t\t\t8192\t5\n";
698
699 static const char odbc_feature_dat[] =
700 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
701 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
702 "Feature\tFeature\n"
703 "odbc\t\t\todbc feature\t1\t2\tMSITESTDIR\t0\n";
704
705 static const char odbc_feature_comp_dat[] =
706 "Feature_\tComponent_\n"
707 "s38\ts72\n"
708 "FeatureComponents\tFeature_\tComponent_\n"
709 "odbc\todbc\n";
710
711 static const char odbc_component_dat[] =
712 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
713 "s72\tS38\ts72\ti2\tS255\tS72\n"
714 "Component\tComponent\n"
715 "odbc\t{B6F3E4AE-35D1-4B72-9044-989F03E20A43}\tMSITESTDIR\t0\t\tODBCdriver.dll\n";
716
717 static const char odbc_driver_dat[] =
718 "Driver\tComponent_\tDescription\tFile_\tFile_Setup\n"
719 "s72\ts72\ts255\ts72\tS72\n"
720 "ODBCDriver\tDriver\n"
721 "ODBC test driver\todbc\tODBC test driver\tODBCdriver.dll\t\n"
722 "ODBC test driver2\todbc\tODBC test driver2\tODBCdriver2.dll\tODBCsetup.dll\n";
723
724 static const char odbc_translator_dat[] =
725 "Translator\tComponent_\tDescription\tFile_\tFile_Setup\n"
726 "s72\ts72\ts255\ts72\tS72\n"
727 "ODBCTranslator\tTranslator\n"
728 "ODBC test translator\todbc\tODBC test translator\tODBCtranslator.dll\t\n"
729 "ODBC test translator2\todbc\tODBC test translator2\tODBCtranslator2.dll\tODBCsetup.dll\n";
730
731 static const char odbc_datasource_dat[] =
732 "DataSource\tComponent_\tDescription\tDriverDescription\tRegistration\n"
733 "s72\ts72\ts255\ts255\ti2\n"
734 "ODBCDataSource\tDataSource\n"
735 "ODBC data source\todbc\tODBC data source\tODBC driver\t0\n";
736
737 static const char odbc_install_exec_seq_dat[] =
738 "Action\tCondition\tSequence\n"
739 "s72\tS255\tI2\n"
740 "InstallExecuteSequence\tAction\n"
741 "LaunchConditions\t\t100\n"
742 "CostInitialize\t\t800\n"
743 "FileCost\t\t900\n"
744 "CostFinalize\t\t1000\n"
745 "InstallValidate\t\t1400\n"
746 "InstallInitialize\t\t1500\n"
747 "ProcessComponents\t\t1600\n"
748 "InstallODBC\t\t3000\n"
749 "RemoveODBC\t\t3100\n"
750 "RemoveFiles\t\t3900\n"
751 "InstallFiles\t\t4000\n"
752 "RegisterProduct\t\t5000\n"
753 "PublishFeatures\t\t5100\n"
754 "PublishProduct\t\t5200\n"
755 "InstallFinalize\t\t6000\n";
756
757 static const char odbc_media_dat[] =
758 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
759 "i2\ti4\tL64\tS255\tS32\tS72\n"
760 "Media\tDiskId\n"
761 "1\t5\t\t\tDISK1\t\n";
762
763 static const char tl_file_dat[] =
764 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
765 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
766 "File\tFile\n"
767 "typelib.dll\ttypelib\ttypelib.dll\t1000\t\t\t8192\t1\n";
768
769 static const char tl_feature_dat[] =
770 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
771 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
772 "Feature\tFeature\n"
773 "typelib\t\t\ttypelib feature\t1\t2\tMSITESTDIR\t0\n";
774
775 static const char tl_feature_comp_dat[] =
776 "Feature_\tComponent_\n"
777 "s38\ts72\n"
778 "FeatureComponents\tFeature_\tComponent_\n"
779 "typelib\ttypelib\n";
780
781 static const char tl_component_dat[] =
782 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
783 "s72\tS38\ts72\ti2\tS255\tS72\n"
784 "Component\tComponent\n"
785 "typelib\t{BB4C26FD-89D8-4E49-AF1C-DB4DCB5BF1B0}\tMSITESTDIR\t0\t\ttypelib.dll\n";
786
787 static const char tl_typelib_dat[] =
788 "LibID\tLanguage\tComponent_\tVersion\tDescription\tDirectory_\tFeature_\tCost\n"
789 "s38\ti2\ts72\tI4\tL128\tS72\ts38\tI4\n"
790 "TypeLib\tLibID\tLanguage\tComponent_\n"
791 "{EAC5166A-9734-4D91-878F-1DD02304C66C}\t0\ttypelib\t1793\t\tMSITESTDIR\ttypelib\t\n";
792
793 static const char tl_install_exec_seq_dat[] =
794 "Action\tCondition\tSequence\n"
795 "s72\tS255\tI2\n"
796 "InstallExecuteSequence\tAction\n"
797 "LaunchConditions\t\t100\n"
798 "CostInitialize\t\t800\n"
799 "FileCost\t\t900\n"
800 "CostFinalize\t\t1000\n"
801 "InstallValidate\t\t1400\n"
802 "InstallInitialize\t\t1500\n"
803 "ProcessComponents\t\t1600\n"
804 "RemoveFiles\t\t1700\n"
805 "InstallFiles\t\t2000\n"
806 "RegisterTypeLibraries\tREGISTER_TYPELIB=1\t3000\n"
807 "UnregisterTypeLibraries\t\t3100\n"
808 "RegisterProduct\t\t5100\n"
809 "PublishFeatures\t\t5200\n"
810 "PublishProduct\t\t5300\n"
811 "InstallFinalize\t\t6000\n";
812
813 static const char crs_file_dat[] =
814 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
815 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
816 "File\tFile\n"
817 "target.txt\tshortcut\ttarget.txt\t1000\t\t\t8192\t1\n";
818
819 static const char crs_feature_dat[] =
820 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
821 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
822 "Feature\tFeature\n"
823 "shortcut\t\t\tshortcut feature\t1\t2\tMSITESTDIR\t0\n";
824
825 static const char crs_feature_comp_dat[] =
826 "Feature_\tComponent_\n"
827 "s38\ts72\n"
828 "FeatureComponents\tFeature_\tComponent_\n"
829 "shortcut\tshortcut\n";
830
831 static const char crs_component_dat[] =
832 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
833 "s72\tS38\ts72\ti2\tS255\tS72\n"
834 "Component\tComponent\n"
835 "shortcut\t{5D20E3C6-7206-498F-AC28-87AF2F9AD4CC}\tMSITESTDIR\t0\t\ttarget.txt\n";
836
837 static const char crs_shortcut_dat[] =
838 "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"
839 "s72\ts72\tl128\ts72\ts72\tL255\tL255\tI2\tS72\tI2\tI2\tS72\n"
840 "Shortcut\tShortcut\n"
841 "shortcut\tMSITESTDIR\tshortcut\tshortcut\t[MSITESTDIR]target.txt\t\t\t\t\t\t\t\n";
842
843 static const char crs_install_exec_seq_dat[] =
844 "Action\tCondition\tSequence\n"
845 "s72\tS255\tI2\n"
846 "InstallExecuteSequence\tAction\n"
847 "LaunchConditions\t\t100\n"
848 "CostInitialize\t\t800\n"
849 "FileCost\t\t900\n"
850 "CostFinalize\t\t1000\n"
851 "InstallValidate\t\t1400\n"
852 "InstallInitialize\t\t1500\n"
853 "ProcessComponents\t\t1600\n"
854 "RemoveFiles\t\t1700\n"
855 "InstallFiles\t\t2000\n"
856 "RemoveShortcuts\t\t3000\n"
857 "CreateShortcuts\t\t3100\n"
858 "RegisterProduct\t\t5000\n"
859 "PublishFeatures\t\t5100\n"
860 "PublishProduct\t\t5200\n"
861 "InstallFinalize\t\t6000\n";
862
863 static const char pub_file_dat[] =
864 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
865 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
866 "File\tFile\n"
867 "english.txt\tpublish\tenglish.txt\t1000\t\t\t8192\t1\n";
868
869 static const char pub_feature_dat[] =
870 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
871 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
872 "Feature\tFeature\n"
873 "publish\t\t\tpublish feature\t1\t2\tMSITESTDIR\t0\n";
874
875 static const char pub_feature_comp_dat[] =
876 "Feature_\tComponent_\n"
877 "s38\ts72\n"
878 "FeatureComponents\tFeature_\tComponent_\n"
879 "publish\tpublish\n";
880
881 static const char pub_component_dat[] =
882 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
883 "s72\tS38\ts72\ti2\tS255\tS72\n"
884 "Component\tComponent\n"
885 "publish\t{B4EA0ACF-6238-426E-9C6D-7869F0F9C768}\tMSITESTDIR\t0\t\tenglish.txt\n";
886
887 static const char pub_publish_component_dat[] =
888 "ComponentId\tQualifier\tComponent_\tAppData\tFeature_\n"
889 "s38\ts255\ts72\tL255\ts38\n"
890 "PublishComponent\tComponentId\tQualifier\tComponent_\n"
891 "{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}\tenglish.txt\tpublish\t\tpublish\n";
892
893 static const char pub_install_exec_seq_dat[] =
894 "Action\tCondition\tSequence\n"
895 "s72\tS255\tI2\n"
896 "InstallExecuteSequence\tAction\n"
897 "LaunchConditions\t\t100\n"
898 "CostInitialize\t\t800\n"
899 "FileCost\t\t900\n"
900 "CostFinalize\t\t1000\n"
901 "InstallValidate\t\t1400\n"
902 "InstallInitialize\t\t1500\n"
903 "ProcessComponents\t\t1600\n"
904 "RemoveFiles\t\t1700\n"
905 "InstallFiles\t\t2000\n"
906 "PublishComponents\t\t3000\n"
907 "UnpublishComponents\t\t3100\n"
908 "RegisterProduct\t\t5000\n"
909 "PublishFeatures\t\t5100\n"
910 "PublishProduct\t\t5200\n"
911 "InstallFinalize\t\t6000\n";
912
913 static const char rd_file_dat[] =
914 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
915 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
916 "File\tFile\n"
917 "original.txt\tduplicate\toriginal.txt\t1000\t\t\t8192\t1\n"
918 "original2.txt\tduplicate\toriginal2.txt\t1000\t\t\t8192\t2\n"
919 "original3.txt\tduplicate2\toriginal3.txt\t1000\t\t\t8192\t3\n";
920
921 static const char rd_feature_dat[] =
922 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
923 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
924 "Feature\tFeature\n"
925 "duplicate\t\t\tduplicate feature\t1\t2\tMSITESTDIR\t0\n";
926
927 static const char rd_feature_comp_dat[] =
928 "Feature_\tComponent_\n"
929 "s38\ts72\n"
930 "FeatureComponents\tFeature_\tComponent_\n"
931 "duplicate\tduplicate\n";
932
933 static const char rd_component_dat[] =
934 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
935 "s72\tS38\ts72\ti2\tS255\tS72\n"
936 "Component\tComponent\n"
937 "duplicate\t{EB45D06A-ADFE-44E3-8D41-B7DE150E41AD}\tMSITESTDIR\t0\t\toriginal.txt\n"
938 "duplicate2\t{B8BA60E0-B2E9-488E-9D0E-E60F25F04F97}\tMSITESTDIR\t0\tDUPLICATE2=1\toriginal3.txt\n";
939
940 static const char rd_duplicate_file_dat[] =
941 "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n"
942 "s72\ts72\ts72\tS255\tS72\n"
943 "DuplicateFile\tFileKey\n"
944 "duplicate\tduplicate\toriginal.txt\tduplicate.txt\t\n"
945 "duplicate2\tduplicate\toriginal2.txt\t\tMSITESTDIR\n"
946 "duplicate3\tduplicate2\toriginal3.txt\tduplicate2.txt\t\n";
947
948 static const char rd_install_exec_seq_dat[] =
949 "Action\tCondition\tSequence\n"
950 "s72\tS255\tI2\n"
951 "InstallExecuteSequence\tAction\n"
952 "LaunchConditions\t\t100\n"
953 "CostInitialize\t\t800\n"
954 "FileCost\t\t900\n"
955 "CostFinalize\t\t1000\n"
956 "InstallValidate\t\t1400\n"
957 "InstallInitialize\t\t1500\n"
958 "ProcessComponents\t\t1600\n"
959 "RemoveDuplicateFiles\t\t1900\n"
960 "InstallFiles\t\t2000\n"
961 "DuplicateFiles\t\t2100\n"
962 "RegisterProduct\t\t5000\n"
963 "PublishFeatures\t\t5100\n"
964 "PublishProduct\t\t5200\n"
965 "InstallFinalize\t\t6000\n";
966
967 static const char rrv_file_dat[] =
968 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
969 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
970 "File\tFile\n"
971 "registry.txt\tregistry\tregistry.txt\t1000\t\t\t8192\t1\n";
972
973 static const char rrv_feature_dat[] =
974 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
975 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
976 "Feature\tFeature\n"
977 "registry\t\t\tregistry feature\t1\t2\tMSITESTDIR\t0\n";
978
979 static const char rrv_feature_comp_dat[] =
980 "Feature_\tComponent_\n"
981 "s38\ts72\n"
982 "FeatureComponents\tFeature_\tComponent_\n"
983 "registry\tregistry\n";
984
985 static const char rrv_component_dat[] =
986 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
987 "s72\tS38\ts72\ti2\tS255\tS72\n"
988 "Component\tComponent\n"
989 "registry\t{DA97585B-962D-45EB-AD32-DA15E60CA9EE}\tMSITESTDIR\t0\t\tregistry.txt\n";
990
991 static const char rrv_registry_dat[] =
992 "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
993 "s72\ti2\tl255\tL255\tL0\ts72\n"
994 "Registry\tRegistry\n"
995 "reg1\t2\tSOFTWARE\\Wine\\keyA\t\tA\tregistry\n"
996 "reg2\t2\tSOFTWARE\\Wine\\keyA\tvalueA\tA\tregistry\n"
997 "reg3\t2\tSOFTWARE\\Wine\\key1\t-\t\tregistry\n";
998
999 static const char rrv_remove_registry_dat[] =
1000 "RemoveRegistry\tRoot\tKey\tName\tComponent_\n"
1001 "s72\ti2\tl255\tL255\ts72\n"
1002 "RemoveRegistry\tRemoveRegistry\n"
1003 "reg1\t2\tSOFTWARE\\Wine\\keyB\t\tregistry\n"
1004 "reg2\t2\tSOFTWARE\\Wine\\keyB\tValueB\tregistry\n"
1005 "reg3\t2\tSOFTWARE\\Wine\\key2\t-\tregistry\n";
1006
1007 static const char rrv_install_exec_seq_dat[] =
1008 "Action\tCondition\tSequence\n"
1009 "s72\tS255\tI2\n"
1010 "InstallExecuteSequence\tAction\n"
1011 "LaunchConditions\t\t100\n"
1012 "CostInitialize\t\t800\n"
1013 "FileCost\t\t900\n"
1014 "CostFinalize\t\t1000\n"
1015 "InstallValidate\t\t1400\n"
1016 "InstallInitialize\t\t1500\n"
1017 "ProcessComponents\t\t1600\n"
1018 "RemoveFiles\t\t1700\n"
1019 "InstallFiles\t\t2000\n"
1020 "RemoveRegistryValues\t\t3000\n"
1021 "RegisterProduct\t\t5000\n"
1022 "PublishFeatures\t\t5100\n"
1023 "PublishProduct\t\t5200\n"
1024 "InstallFinalize\t\t6000\n";
1025
1026 static const char frp_file_dat[] =
1027 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1028 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1029 "File\tFile\n"
1030 "product.txt\tproduct\tproduct.txt\t1000\t\t\t8192\t1\n";
1031
1032 static const char frp_feature_dat[] =
1033 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1034 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1035 "Feature\tFeature\n"
1036 "product\t\t\tproduct feature\t1\t2\tMSITESTDIR\t0\n";
1037
1038 static const char frp_feature_comp_dat[] =
1039 "Feature_\tComponent_\n"
1040 "s38\ts72\n"
1041 "FeatureComponents\tFeature_\tComponent_\n"
1042 "product\tproduct\n";
1043
1044 static const char frp_component_dat[] =
1045 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1046 "s72\tS38\ts72\ti2\tS255\tS72\n"
1047 "Component\tComponent\n"
1048 "product\t{44725EE0-EEA8-40BD-8162-A48224A2FEA1}\tMSITESTDIR\t0\t\tproduct.txt\n";
1049
1050 static const char frp_custom_action_dat[] =
1051 "Action\tType\tSource\tTarget\tISComments\n"
1052 "s72\ti2\tS64\tS0\tS255\n"
1053 "CustomAction\tAction\n"
1054 "TestProp\t19\t\t\tPROP set\n";
1055
1056 static const char frp_upgrade_dat[] =
1057 "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n"
1058 "s38\tS20\tS20\tS255\ti4\tS255\ts72\n"
1059 "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n"
1060 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}\t1.1.1\t2.2.2\t\t768\t\tPROP\n";
1061
1062 static const char frp_install_exec_seq_dat[] =
1063 "Action\tCondition\tSequence\n"
1064 "s72\tS255\tI2\n"
1065 "InstallExecuteSequence\tAction\n"
1066 "FindRelatedProducts\t\t50\n"
1067 "TestProp\tPROP AND NOT REMOVE\t51\n"
1068 "LaunchConditions\t\t100\n"
1069 "CostInitialize\t\t800\n"
1070 "FileCost\t\t900\n"
1071 "CostFinalize\t\t1000\n"
1072 "InstallValidate\t\t1400\n"
1073 "InstallInitialize\t\t1500\n"
1074 "ProcessComponents\t\t1600\n"
1075 "RemoveFiles\t\t1700\n"
1076 "InstallFiles\t\t2000\n"
1077 "RegisterProduct\t\t5000\n"
1078 "PublishFeatures\t\t5100\n"
1079 "PublishProduct\t\t5200\n"
1080 "InstallFinalize\t\t6000\n";
1081
1082 static const char riv_file_dat[] =
1083 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1084 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1085 "File\tFile\n"
1086 "inifile.txt\tinifile\tinifile.txt\t1000\t\t\t8192\t1\n";
1087
1088 static const char riv_feature_dat[] =
1089 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1090 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1091 "Feature\tFeature\n"
1092 "inifile\t\t\tinifile feature\t1\t2\tMSITESTDIR\t0\n";
1093
1094 static const char riv_feature_comp_dat[] =
1095 "Feature_\tComponent_\n"
1096 "s38\ts72\n"
1097 "FeatureComponents\tFeature_\tComponent_\n"
1098 "inifile\tinifile\n";
1099
1100 static const char riv_component_dat[] =
1101 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1102 "s72\tS38\ts72\ti2\tS255\tS72\n"
1103 "Component\tComponent\n"
1104 "inifile\t{A0F15705-4F57-4437-88C4-6C8B37ACC6DE}\tMSITESTDIR\t0\t\tinifile.txt\n";
1105
1106 static const char riv_ini_file_dat[] =
1107 "IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"
1108 "s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n"
1109 "IniFile\tIniFile\n"
1110 "inifile1\ttest.ini\tMSITESTDIR\tsection1\tkey1\tvalue1\t0\tinifile\n";
1111
1112 static const char riv_remove_ini_file_dat[] =
1113 "RemoveIniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"
1114 "s72\tl255\tS72\tl96\tl128\tL255\ti2\ts72\n"
1115 "RemoveIniFile\tRemoveIniFile\n"
1116 "inifile1\ttest.ini\tMSITESTDIR\tsectionA\tkeyA\tvalueA\t2\tinifile\n";
1117
1118 static const char riv_install_exec_seq_dat[] =
1119 "Action\tCondition\tSequence\n"
1120 "s72\tS255\tI2\n"
1121 "InstallExecuteSequence\tAction\n"
1122 "LaunchConditions\t\t100\n"
1123 "CostInitialize\t\t800\n"
1124 "FileCost\t\t900\n"
1125 "CostFinalize\t\t1000\n"
1126 "InstallValidate\t\t1400\n"
1127 "InstallInitialize\t\t1500\n"
1128 "ProcessComponents\t\t1600\n"
1129 "RemoveFiles\t\t1700\n"
1130 "InstallFiles\t\t2000\n"
1131 "RemoveIniValues\t\t3000\n"
1132 "RegisterProduct\t\t5000\n"
1133 "PublishFeatures\t\t5100\n"
1134 "PublishProduct\t\t5200\n"
1135 "InstallFinalize\t\t6000\n";
1136
1137 static const char res_file_dat[] =
1138 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1139 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1140 "File\tFile\n"
1141 "envvar.txt\tenvvar\tenvvar.txt\t1000\t\t\t8192\t1\n";
1142
1143 static const char res_feature_dat[] =
1144 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1145 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1146 "Feature\tFeature\n"
1147 "envvar\t\t\tenvvar feature\t1\t2\tMSITESTDIR\t0\n";
1148
1149 static const char res_feature_comp_dat[] =
1150 "Feature_\tComponent_\n"
1151 "s38\ts72\n"
1152 "FeatureComponents\tFeature_\tComponent_\n"
1153 "envvar\tenvvar\n";
1154
1155 static const char res_component_dat[] =
1156 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1157 "s72\tS38\ts72\ti2\tS255\tS72\n"
1158 "Component\tComponent\n"
1159 "envvar\t{45EE9AF4-E5D1-445F-8BB7-B22D4EEBD29E}\tMSITESTDIR\t0\t\tenvvar.txt\n";
1160
1161 static const char res_environment_dat[] =
1162 "Environment\tName\tValue\tComponent_\n"
1163 "s72\tl255\tL255\ts72\n"
1164 "Environment\tEnvironment\n"
1165 "var1\t=-MSITESTVAR1\t1\tenvvar\n"
1166 "var2\t=+-MSITESTVAR2\t1\tenvvar\n"
1167 "var3\t=MSITESTVAR3\t1\tenvvar\n"
1168 "var4\t=-MSITESTVAR4\t\tenvvar\n"
1169 "var5\t=MSITESTVAR5\t\tenvvar\n";
1170
1171 static const char res_install_exec_seq_dat[] =
1172 "Action\tCondition\tSequence\n"
1173 "s72\tS255\tI2\n"
1174 "InstallExecuteSequence\tAction\n"
1175 "LaunchConditions\t\t100\n"
1176 "CostInitialize\t\t800\n"
1177 "FileCost\t\t900\n"
1178 "CostFinalize\t\t1000\n"
1179 "InstallValidate\t\t1400\n"
1180 "InstallInitialize\t\t1500\n"
1181 "ProcessComponents\t\t1600\n"
1182 "RemoveFiles\t\t1700\n"
1183 "InstallFiles\t\t2000\n"
1184 "RemoveEnvironmentStrings\t\t3000\n"
1185 "RegisterProduct\t\t5000\n"
1186 "PublishFeatures\t\t5100\n"
1187 "PublishProduct\t\t5200\n"
1188 "InstallFinalize\t\t6000\n";
1189
1190 static const char rci_file_dat[] =
1191 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1192 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1193 "File\tFile\n"
1194 "class.txt\tclass\tclass.txt\t1000\t\t\t8192\t1\n";
1195
1196 static const char rci_feature_dat[] =
1197 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1198 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1199 "Feature\tFeature\n"
1200 "class\t\t\tclass feature\t1\t2\tMSITESTDIR\t0\n";
1201
1202 static const char rci_feature_comp_dat[] =
1203 "Feature_\tComponent_\n"
1204 "s38\ts72\n"
1205 "FeatureComponents\tFeature_\tComponent_\n"
1206 "class\tclass\n";
1207
1208 static const char rci_component_dat[] =
1209 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1210 "s72\tS38\ts72\ti2\tS255\tS72\n"
1211 "Component\tComponent\n"
1212 "class\t{89A98345-F8A1-422E-A48B-0250B5809F2D}\tMSITESTDIR\t0\t\tclass.txt\n";
1213
1214 static const char rci_appid_dat[] =
1215 "AppId\tRemoteServerName\tLocalService\tServiceParameters\tDllSurrogate\tActivateAtStorage\tRunAsInteractiveUser\n"
1216 "s38\tS255\tS255\tS255\tS255\tI2\tI2\n"
1217 "AppId\tAppId\n"
1218 "{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\t\t\t\t\t\t\n";
1219
1220 static const char rci_class_dat[] =
1221 "CLSID\tContext\tComponent_\tProgId_Default\tDescription\tAppId_\tFileTypeMask\tIcon_\tIconIndex\tDefInprocHandler\tArgument\tFeature_\tAttributes\n"
1222 "s38\ts32\ts72\tS255\tL255\tS38\tS255\tS72\tI2\tS32\tS255\ts38\tI2\n"
1223 "Class\tCLSID\tContext\tComponent_\n"
1224 "{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tLocalServer\tclass\t\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tclass\t\n";
1225
1226 static const char rci_install_exec_seq_dat[] =
1227 "Action\tCondition\tSequence\n"
1228 "s72\tS255\tI2\n"
1229 "InstallExecuteSequence\tAction\n"
1230 "LaunchConditions\t\t100\n"
1231 "CostInitialize\t\t800\n"
1232 "FileCost\t\t900\n"
1233 "CostFinalize\t\t1000\n"
1234 "InstallValidate\t\t1400\n"
1235 "InstallInitialize\t\t1500\n"
1236 "ProcessComponents\t\t1600\n"
1237 "RemoveFiles\t\t1700\n"
1238 "InstallFiles\t\t2000\n"
1239 "UnregisterClassInfo\t\t3000\n"
1240 "RegisterClassInfo\t\t4000\n"
1241 "RegisterProduct\t\t5000\n"
1242 "PublishFeatures\t\t5100\n"
1243 "PublishProduct\t\t5200\n"
1244 "InstallFinalize\t\t6000\n";
1245
1246 static const char rei_file_dat[] =
1247 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1248 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1249 "File\tFile\n"
1250 "extension.txt\textension\textension.txt\t1000\t\t\t8192\t1\n";
1251
1252 static const char rei_feature_dat[] =
1253 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1254 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1255 "Feature\tFeature\n"
1256 "extension\t\t\textension feature\t1\t2\tMSITESTDIR\t0\n";
1257
1258 static const char rei_feature_comp_dat[] =
1259 "Feature_\tComponent_\n"
1260 "s38\ts72\n"
1261 "FeatureComponents\tFeature_\tComponent_\n"
1262 "extension\textension\n";
1263
1264 static const char rei_component_dat[] =
1265 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1266 "s72\tS38\ts72\ti2\tS255\tS72\n"
1267 "Component\tComponent\n"
1268 "extension\t{9A3060D4-60BA-4A82-AB55-9FB148AD013C}\tMSITESTDIR\t0\t\textension.txt\n";
1269
1270 static const char rei_extension_dat[] =
1271 "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n"
1272 "s255\ts72\tS255\tS64\ts38\n"
1273 "Extension\tExtension\tComponent_\n"
1274 "extension\textension\tProg.Id.1\t\textension\n";
1275
1276 static const char rei_verb_dat[] =
1277 "Extension_\tVerb\tSequence\tCommand\tArgument\n"
1278 "s255\ts32\tI2\tL255\tL255\n"
1279 "Verb\tExtension_\tVerb\n"
1280 "extension\tOpen\t1\t&Open\t/argument\n";
1281
1282 static const char rei_progid_dat[] =
1283 "ProgId\tProgId_Parent\tClass_\tDescription\tIcon_\tIconIndex\n"
1284 "s255\tS255\tS38\tL255\tS72\tI2\n"
1285 "ProgId\tProgId\n"
1286 "Prog.Id.1\t\t\tdescription\t\t\n";
1287
1288 static const char rei_install_exec_seq_dat[] =
1289 "Action\tCondition\tSequence\n"
1290 "s72\tS255\tI2\n"
1291 "InstallExecuteSequence\tAction\n"
1292 "LaunchConditions\t\t100\n"
1293 "CostInitialize\t\t800\n"
1294 "FileCost\t\t900\n"
1295 "CostFinalize\t\t1000\n"
1296 "InstallValidate\t\t1400\n"
1297 "InstallInitialize\t\t1500\n"
1298 "ProcessComponents\t\t1600\n"
1299 "RemoveFiles\t\t1700\n"
1300 "InstallFiles\t\t2000\n"
1301 "UnregisterExtensionInfo\t\t3000\n"
1302 "RegisterExtensionInfo\t\t4000\n"
1303 "RegisterProduct\t\t5000\n"
1304 "PublishFeatures\t\t5100\n"
1305 "PublishProduct\t\t5200\n"
1306 "InstallFinalize\t\t6000\n";
1307
1308 static const char rmi_file_dat[] =
1309 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1310 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1311 "File\tFile\n"
1312 "mime.txt\tmime\tmime.txt\t1000\t\t\t8192\t1\n";
1313
1314 static const char rmi_feature_dat[] =
1315 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1316 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1317 "Feature\tFeature\n"
1318 "mime\t\t\tmime feature\t1\t2\tMSITESTDIR\t0\n";
1319
1320 static const char rmi_feature_comp_dat[] =
1321 "Feature_\tComponent_\n"
1322 "s38\ts72\n"
1323 "FeatureComponents\tFeature_\tComponent_\n"
1324 "mime\tmime\n";
1325
1326 static const char rmi_component_dat[] =
1327 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1328 "s72\tS38\ts72\ti2\tS255\tS72\n"
1329 "Component\tComponent\n"
1330 "mime\t{A1D630CE-13A7-4882-AFDD-148E2BBAFC6D}\tMSITESTDIR\t0\t\tmime.txt\n";
1331
1332 static const char rmi_extension_dat[] =
1333 "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n"
1334 "s255\ts72\tS255\tS64\ts38\n"
1335 "Extension\tExtension\tComponent_\n"
1336 "mime\tmime\t\tmime/type\tmime\n";
1337
1338 static const char rmi_verb_dat[] =
1339 "Extension_\tVerb\tSequence\tCommand\tArgument\n"
1340 "s255\ts32\tI2\tL255\tL255\n"
1341 "Verb\tExtension_\tVerb\n"
1342 "mime\tOpen\t1\t&Open\t/argument\n";
1343
1344 static const char rmi_mime_dat[] =
1345 "ContentType\tExtension_\tCLSID\n"
1346 "s64\ts255\tS38\n"
1347 "MIME\tContentType\n"
1348 "mime/type\tmime\t\n";
1349
1350 static const char rmi_install_exec_seq_dat[] =
1351 "Action\tCondition\tSequence\n"
1352 "s72\tS255\tI2\n"
1353 "InstallExecuteSequence\tAction\n"
1354 "LaunchConditions\t\t100\n"
1355 "CostInitialize\t\t800\n"
1356 "FileCost\t\t900\n"
1357 "CostFinalize\t\t1000\n"
1358 "InstallValidate\t\t1400\n"
1359 "InstallInitialize\t\t1500\n"
1360 "ProcessComponents\t\t1600\n"
1361 "RemoveFiles\t\t1700\n"
1362 "InstallFiles\t\t2000\n"
1363 "UnregisterExtensionInfo\t\t3000\n"
1364 "UnregisterMIMEInfo\t\t3500\n"
1365 "RegisterExtensionInfo\t\t4000\n"
1366 "RegisterMIMEInfo\t\t4500\n"
1367 "RegisterProduct\t\t5000\n"
1368 "PublishFeatures\t\t5100\n"
1369 "PublishProduct\t\t5200\n"
1370 "InstallFinalize\t\t6000\n";
1371
1372 static const char pa_file_dat[] =
1373 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1374 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1375 "File\tFile\n"
1376 "win32.txt\twin32\twin32.txt\t1000\t\t\t8192\t1\n"
1377 "manifest.txt\twin32\tmanifest.txt\t1000\t\t\t8192\t1\n"
1378 "win32_local.txt\twin32_local\twin32_local.txt\t1000\t\t\t8192\t1\n"
1379 "manifest_local.txt\twin32_local\tmanifest_local.txt\t1000\t\t\t8192\t1\n"
1380 "dotnet.txt\tdotnet\tdotnet.txt\t1000\t\t\t8192\t1\n"
1381 "dotnet_local.txt\tdotnet_local\tdotnet_local.txt\t1000\t\t\t8192\t1\n"
1382 "application_win32.txt\twin32_local\tapplication_win32.txt\t1000\t\t\t8192\t1\n"
1383 "application_dotnet.txt\tdotnet_local\tapplication_dotnet.txt\t1000\t\t\t8192\t1\n";
1384
1385 static const char pa_feature_dat[] =
1386 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1387 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1388 "Feature\tFeature\n"
1389 "assembly\t\t\tassembly feature\t1\t2\tMSITESTDIR\t0\n";
1390
1391 static const char pa_feature_comp_dat[] =
1392 "Feature_\tComponent_\n"
1393 "s38\ts72\n"
1394 "FeatureComponents\tFeature_\tComponent_\n"
1395 "assembly\twin32\n"
1396 "assembly\twin32_local\n"
1397 "assembly\tdotnet\n"
1398 "assembly\tdotnet_local\n";
1399
1400 static const char pa_component_dat[] =
1401 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1402 "s72\tS38\ts72\ti2\tS255\tS72\n"
1403 "Component\tComponent\n"
1404 "win32\t{F515549E-7E61-425D-AAC1-9BEF2E066D06}\tMSITESTDIR\t0\t\twin32.txt\n"
1405 "win32_local\t{D34D3FBA-6789-4E57-AD1A-1281297DC201}\tMSITESTDIR\t0\t\twin32_local.txt\n"
1406 "dotnet\t{8943164F-2B31-4C09-A894-493A8CBDE0A4}\tMSITESTDIR\t0\t\tdotnet.txt\n"
1407 "dotnet_local\t{4E8567E8-8EAE-4E36-90F1-B99D33C663F8}\tMSITESTDIR\t0\t\tdotnet_local.txt\n";
1408
1409 static const char pa_msi_assembly_dat[] =
1410 "Component_\tFeature_\tFile_Manifest\tFile_Application\tAttributes\n"
1411 "s72\ts38\tS72\tS72\tI2\n"
1412 "MsiAssembly\tComponent_\n"
1413 "win32\tassembly\tmanifest.txt\t\t1\n"
1414 "win32_local\tassembly\tmanifest_local.txt\tapplication_win32.txt\t1\n"
1415 "dotnet\tassembly\t\t\t0\n"
1416 "dotnet_local\tassembly\t\tapplication_dotnet.txt\t0\n";
1417
1418 static const char pa_msi_assembly_name_dat[] =
1419 "Component_\tName\tValue\n"
1420 "s72\ts255\ts255\n"
1421 "MsiAssemblyName\tComponent_\tName\n"
1422 "win32\tName\tWine.Win32.Assembly\n"
1423 "win32\tprocessorArchitecture\tx86\n"
1424 "win32\tpublicKeyToken\tabcdef0123456789\n"
1425 "win32\ttype\twin32\n"
1426 "win32\tversion\t1.0.0.0\n"
1427 "win32_local\tName\tWine.Win32.Local.Assembly\n"
1428 "win32_local\tprocessorArchitecture\tx86\n"
1429 "win32_local\tpublicKeyToken\tabcdef0123456789\n"
1430 "win32_local\ttype\twin32\n"
1431 "win32_local\tversion\t1.0.0.0\n"
1432 "dotnet\tName\tWine.Dotnet.Assembly\n"
1433 "dotnet\tprocessorArchitecture\tMSIL\n"
1434 "dotnet\tpublicKeyToken\tabcdef0123456789\n"
1435 "dotnet\tculture\tneutral\n"
1436 "dotnet\tversion\t1.0.0.0\n"
1437 "dotnet_local\tName\tWine.Dotnet.Local.Assembly\n"
1438 "dotnet_local\tprocessorArchitecture\tMSIL\n"
1439 "dotnet_local\tpublicKeyToken\tabcdef0123456789\n"
1440 "dotnet_local\tculture\tneutral\n"
1441 "dotnet_local\tversion\t1.0.0.0\n";
1442
1443 static const char pa_install_exec_seq_dat[] =
1444 "Action\tCondition\tSequence\n"
1445 "s72\tS255\tI2\n"
1446 "InstallExecuteSequence\tAction\n"
1447 "LaunchConditions\t\t100\n"
1448 "CostInitialize\t\t800\n"
1449 "FileCost\t\t900\n"
1450 "CostFinalize\t\t1000\n"
1451 "InstallValidate\t\t1400\n"
1452 "InstallInitialize\t\t1500\n"
1453 "ProcessComponents\t\t1600\n"
1454 "MsiPublishAssemblies\t\t3000\n"
1455 "MsiUnpublishAssemblies\t\t4000\n"
1456 "RegisterProduct\t\t5000\n"
1457 "PublishFeatures\t\t5100\n"
1458 "PublishProduct\t\t5200\n"
1459 "InstallFinalize\t\t6000\n";
1460
1461 typedef struct _msi_table
1462 {
1463 const char *filename;
1464 const char *data;
1465 unsigned int size;
1466 } msi_table;
1467
1468 #define ADD_TABLE(x) {#x".idt", x##_dat, sizeof(x##_dat)}
1469
1470 static const msi_table env_tables[] =
1471 {
1472 ADD_TABLE(component),
1473 ADD_TABLE(directory),
1474 ADD_TABLE(feature),
1475 ADD_TABLE(feature_comp),
1476 ADD_TABLE(file),
1477 ADD_TABLE(install_exec_seq),
1478 ADD_TABLE(media),
1479 ADD_TABLE(property),
1480 ADD_TABLE(environment)
1481 };
1482
1483 static const msi_table pp_tables[] =
1484 {
1485 ADD_TABLE(pp_component),
1486 ADD_TABLE(directory),
1487 ADD_TABLE(rof_feature),
1488 ADD_TABLE(rof_feature_comp),
1489 ADD_TABLE(rof_file),
1490 ADD_TABLE(pp_install_exec_seq),
1491 ADD_TABLE(rof_media),
1492 ADD_TABLE(property),
1493 };
1494
1495 static const msi_table ppc_tables[] =
1496 {
1497 ADD_TABLE(ppc_component),
1498 ADD_TABLE(directory),
1499 ADD_TABLE(rof_feature),
1500 ADD_TABLE(ppc_feature_comp),
1501 ADD_TABLE(ppc_file),
1502 ADD_TABLE(pp_install_exec_seq),
1503 ADD_TABLE(ppc_media),
1504 ADD_TABLE(property),
1505 };
1506
1507 static const msi_table rem_tables[] =
1508 {
1509 ADD_TABLE(rem_component),
1510 ADD_TABLE(directory),
1511 ADD_TABLE(rof_feature),
1512 ADD_TABLE(rem_feature_comp),
1513 ADD_TABLE(rem_file),
1514 ADD_TABLE(rem_install_exec_seq),
1515 ADD_TABLE(rof_media),
1516 ADD_TABLE(property),
1517 ADD_TABLE(rem_remove_files),
1518 };
1519
1520 static const msi_table mov_tables[] =
1521 {
1522 ADD_TABLE(cwd_component),
1523 ADD_TABLE(directory),
1524 ADD_TABLE(rof_feature),
1525 ADD_TABLE(ci2_feature_comp),
1526 ADD_TABLE(ci2_file),
1527 ADD_TABLE(install_exec_seq),
1528 ADD_TABLE(rof_media),
1529 ADD_TABLE(property),
1530 ADD_TABLE(mov_move_file),
1531 };
1532
1533 static const msi_table df_tables[] =
1534 {
1535 ADD_TABLE(rof_component),
1536 ADD_TABLE(df_directory),
1537 ADD_TABLE(rof_feature),
1538 ADD_TABLE(rof_feature_comp),
1539 ADD_TABLE(rof_file),
1540 ADD_TABLE(install_exec_seq),
1541 ADD_TABLE(rof_media),
1542 ADD_TABLE(property),
1543 ADD_TABLE(df_duplicate_file),
1544 };
1545
1546 static const msi_table wrv_tables[] =
1547 {
1548 ADD_TABLE(wrv_component),
1549 ADD_TABLE(directory),
1550 ADD_TABLE(rof_feature),
1551 ADD_TABLE(ci2_feature_comp),
1552 ADD_TABLE(ci2_file),
1553 ADD_TABLE(install_exec_seq),
1554 ADD_TABLE(rof_media),
1555 ADD_TABLE(property),
1556 ADD_TABLE(wrv_registry),
1557 };
1558
1559 static const msi_table cf_tables[] =
1560 {
1561 ADD_TABLE(cf_component),
1562 ADD_TABLE(cf_directory),
1563 ADD_TABLE(cf_feature),
1564 ADD_TABLE(cf_feature_comp),
1565 ADD_TABLE(cf_file),
1566 ADD_TABLE(cf_create_folders),
1567 ADD_TABLE(cf_install_exec_seq),
1568 ADD_TABLE(media),
1569 ADD_TABLE(property)
1570 };
1571
1572 static const msi_table sss_tables[] =
1573 {
1574 ADD_TABLE(component),
1575 ADD_TABLE(directory),
1576 ADD_TABLE(feature),
1577 ADD_TABLE(feature_comp),
1578 ADD_TABLE(file),
1579 ADD_TABLE(sss_install_exec_seq),
1580 ADD_TABLE(sss_service_control),
1581 ADD_TABLE(media),
1582 ADD_TABLE(property)
1583 };
1584
1585 static const msi_table sds_tables[] =
1586 {
1587 ADD_TABLE(component),
1588 ADD_TABLE(directory),
1589 ADD_TABLE(feature),
1590 ADD_TABLE(feature_comp),
1591 ADD_TABLE(file),
1592 ADD_TABLE(sds_install_exec_seq),
1593 ADD_TABLE(service_control),
1594 ADD_TABLE(service_install),
1595 ADD_TABLE(media),
1596 ADD_TABLE(property)
1597 };
1598
1599 static const msi_table sr_tables[] =
1600 {
1601 ADD_TABLE(component),
1602 ADD_TABLE(directory),
1603 ADD_TABLE(feature),
1604 ADD_TABLE(feature_comp),
1605 ADD_TABLE(file),
1606 ADD_TABLE(sr_selfreg),
1607 ADD_TABLE(sr_install_exec_seq),
1608 ADD_TABLE(media),
1609 ADD_TABLE(property)
1610 };
1611
1612 static const msi_table font_tables[] =
1613 {
1614 ADD_TABLE(font_component),
1615 ADD_TABLE(directory),
1616 ADD_TABLE(font_feature),
1617 ADD_TABLE(font_feature_comp),
1618 ADD_TABLE(font_file),
1619 ADD_TABLE(font),
1620 ADD_TABLE(font_install_exec_seq),
1621 ADD_TABLE(font_media),
1622 ADD_TABLE(property)
1623 };
1624
1625 static const msi_table vp_tables[] =
1626 {
1627 ADD_TABLE(component),
1628 ADD_TABLE(directory),
1629 ADD_TABLE(feature),
1630 ADD_TABLE(feature_comp),
1631 ADD_TABLE(file),
1632 ADD_TABLE(vp_custom_action),
1633 ADD_TABLE(vp_install_exec_seq),
1634 ADD_TABLE(media),
1635 ADD_TABLE(vp_property)
1636 };
1637
1638 static const msi_table odbc_tables[] =
1639 {
1640 ADD_TABLE(odbc_component),
1641 ADD_TABLE(directory),
1642 ADD_TABLE(odbc_feature),
1643 ADD_TABLE(odbc_feature_comp),
1644 ADD_TABLE(odbc_file),
1645 ADD_TABLE(odbc_driver),
1646 ADD_TABLE(odbc_translator),
1647 ADD_TABLE(odbc_datasource),
1648 ADD_TABLE(odbc_install_exec_seq),
1649 ADD_TABLE(odbc_media),
1650 ADD_TABLE(property)
1651 };
1652
1653 static const msi_table tl_tables[] =
1654 {
1655 ADD_TABLE(tl_component),
1656 ADD_TABLE(directory),
1657 ADD_TABLE(tl_feature),
1658 ADD_TABLE(tl_feature_comp),
1659 ADD_TABLE(tl_file),
1660 ADD_TABLE(tl_typelib),
1661 ADD_TABLE(tl_install_exec_seq),
1662 ADD_TABLE(media),
1663 ADD_TABLE(property)
1664 };
1665
1666 static const msi_table crs_tables[] =
1667 {
1668 ADD_TABLE(crs_component),
1669 ADD_TABLE(directory),
1670 ADD_TABLE(crs_feature),
1671 ADD_TABLE(crs_feature_comp),
1672 ADD_TABLE(crs_file),
1673 ADD_TABLE(crs_shortcut),
1674 ADD_TABLE(crs_install_exec_seq),
1675 ADD_TABLE(media),
1676 ADD_TABLE(property)
1677 };
1678
1679 static const msi_table pub_tables[] =
1680 {
1681 ADD_TABLE(directory),
1682 ADD_TABLE(pub_component),
1683 ADD_TABLE(pub_feature),
1684 ADD_TABLE(pub_feature_comp),
1685 ADD_TABLE(pub_file),
1686 ADD_TABLE(pub_publish_component),
1687 ADD_TABLE(pub_install_exec_seq),
1688 ADD_TABLE(media),
1689 ADD_TABLE(property)
1690 };
1691
1692 static const msi_table rd_tables[] =
1693 {
1694 ADD_TABLE(directory),
1695 ADD_TABLE(rd_component),
1696 ADD_TABLE(rd_feature),
1697 ADD_TABLE(rd_feature_comp),
1698 ADD_TABLE(rd_file),
1699 ADD_TABLE(rd_duplicate_file),
1700 ADD_TABLE(rd_install_exec_seq),
1701 ADD_TABLE(media),
1702 ADD_TABLE(property)
1703 };
1704
1705 static const msi_table rrv_tables[] =
1706 {
1707 ADD_TABLE(directory),
1708 ADD_TABLE(rrv_component),
1709 ADD_TABLE(rrv_feature),
1710 ADD_TABLE(rrv_feature_comp),
1711 ADD_TABLE(rrv_file),
1712 ADD_TABLE(rrv_registry),
1713 ADD_TABLE(rrv_remove_registry),
1714 ADD_TABLE(rrv_install_exec_seq),
1715 ADD_TABLE(media),
1716 ADD_TABLE(property)
1717 };
1718
1719 static const msi_table frp_tables[] =
1720 {
1721 ADD_TABLE(directory),
1722 ADD_TABLE(frp_component),
1723 ADD_TABLE(frp_feature),
1724 ADD_TABLE(frp_feature_comp),
1725 ADD_TABLE(frp_file),
1726 ADD_TABLE(frp_upgrade),
1727 ADD_TABLE(frp_custom_action),
1728 ADD_TABLE(frp_install_exec_seq),
1729 ADD_TABLE(media),
1730 ADD_TABLE(property)
1731 };
1732
1733 static const msi_table riv_tables[] =
1734 {
1735 ADD_TABLE(directory),
1736 ADD_TABLE(riv_component),
1737 ADD_TABLE(riv_feature),
1738 ADD_TABLE(riv_feature_comp),
1739 ADD_TABLE(riv_file),
1740 ADD_TABLE(riv_ini_file),
1741 ADD_TABLE(riv_remove_ini_file),
1742 ADD_TABLE(riv_install_exec_seq),
1743 ADD_TABLE(media),
1744 ADD_TABLE(property)
1745 };
1746
1747 static const msi_table res_tables[] =
1748 {
1749 ADD_TABLE(directory),
1750 ADD_TABLE(res_component),
1751 ADD_TABLE(res_feature),
1752 ADD_TABLE(res_feature_comp),
1753 ADD_TABLE(res_file),
1754 ADD_TABLE(res_environment),
1755 ADD_TABLE(res_install_exec_seq),
1756 ADD_TABLE(media),
1757 ADD_TABLE(property)
1758 };
1759
1760 static const msi_table rci_tables[] =
1761 {
1762 ADD_TABLE(directory),
1763 ADD_TABLE(rci_component),
1764 ADD_TABLE(rci_feature),
1765 ADD_TABLE(rci_feature_comp),
1766 ADD_TABLE(rci_file),
1767 ADD_TABLE(rci_appid),
1768 ADD_TABLE(rci_class),
1769 ADD_TABLE(rci_install_exec_seq),
1770 ADD_TABLE(media),
1771 ADD_TABLE(property)
1772 };
1773
1774 static const msi_table rei_tables[] =
1775 {
1776 ADD_TABLE(directory),
1777 ADD_TABLE(rei_component),
1778 ADD_TABLE(rei_feature),
1779 ADD_TABLE(rei_feature_comp),
1780 ADD_TABLE(rei_file),
1781 ADD_TABLE(rei_extension),
1782 ADD_TABLE(rei_verb),
1783 ADD_TABLE(rei_progid),
1784 ADD_TABLE(rei_install_exec_seq),
1785 ADD_TABLE(media),
1786 ADD_TABLE(property)
1787 };
1788
1789 static const msi_table rmi_tables[] =
1790 {
1791 ADD_TABLE(directory),
1792 ADD_TABLE(rmi_component),
1793 ADD_TABLE(rmi_feature),
1794 ADD_TABLE(rmi_feature_comp),
1795 ADD_TABLE(rmi_file),
1796 ADD_TABLE(rmi_extension),
1797 ADD_TABLE(rmi_verb),
1798 ADD_TABLE(rmi_mime),
1799 ADD_TABLE(rmi_install_exec_seq),
1800 ADD_TABLE(media),
1801 ADD_TABLE(property)
1802 };
1803
1804 static const msi_table pa_tables[] =
1805 {
1806 ADD_TABLE(directory),
1807 ADD_TABLE(pa_component),
1808 ADD_TABLE(pa_feature),
1809 ADD_TABLE(pa_feature_comp),
1810 ADD_TABLE(pa_file),
1811 ADD_TABLE(pa_msi_assembly),
1812 ADD_TABLE(pa_msi_assembly_name),
1813 ADD_TABLE(pa_install_exec_seq),
1814 ADD_TABLE(media),
1815 ADD_TABLE(property)
1816 };
1817
1818 /* cabinet definitions */
1819
1820 /* make the max size large so there is only one cab file */
1821 #define MEDIA_SIZE 0x7FFFFFFF
1822 #define FOLDER_THRESHOLD 900000
1823
1824 /* the FCI callbacks */
1825
1826 static void * CDECL mem_alloc(ULONG cb)
1827 {
1828 return HeapAlloc(GetProcessHeap(), 0, cb);
1829 }
1830
1831 static void CDECL mem_free(void *memory)
1832 {
1833 HeapFree(GetProcessHeap(), 0, memory);
1834 }
1835
1836 static BOOL CDECL get_next_cabinet(PCCAB pccab, ULONG cbPrevCab, void *pv)
1837 {
1838 sprintf(pccab->szCab, pv, pccab->iCab);
1839 return TRUE;
1840 }
1841
1842 static LONG CDECL progress(UINT typeStatus, ULONG cb1, ULONG cb2, void *pv)
1843 {
1844 return 0;
1845 }
1846
1847 static int CDECL file_placed(PCCAB pccab, char *pszFile, LONG cbFile,
1848 BOOL fContinuation, void *pv)
1849 {
1850 return 0;
1851 }
1852
1853 static INT_PTR CDECL fci_open(char *pszFile, int oflag, int pmode, int *err, void *pv)
1854 {
1855 HANDLE handle;
1856 DWORD dwAccess = 0;
1857 DWORD dwShareMode = 0;
1858 DWORD dwCreateDisposition = OPEN_EXISTING;
1859
1860 dwAccess = GENERIC_READ | GENERIC_WRITE;
1861 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
1862
1863 if (GetFileAttributesA(pszFile) != INVALID_FILE_ATTRIBUTES)
1864 dwCreateDisposition = OPEN_EXISTING;
1865 else
1866 dwCreateDisposition = CREATE_NEW;
1867
1868 handle = CreateFileA(pszFile, dwAccess, dwShareMode, NULL,
1869 dwCreateDisposition, 0, NULL);
1870
1871 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszFile);
1872
1873 return (INT_PTR)handle;
1874 }
1875
1876 static UINT CDECL fci_read(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
1877 {
1878 HANDLE handle = (HANDLE)hf;
1879 DWORD dwRead;
1880 BOOL res;
1881
1882 res = ReadFile(handle, memory, cb, &dwRead, NULL);
1883 ok(res, "Failed to ReadFile\n");
1884
1885 return dwRead;
1886 }
1887
1888 static UINT CDECL fci_write(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
1889 {
1890 HANDLE handle = (HANDLE)hf;
1891 DWORD dwWritten;
1892 BOOL res;
1893
1894 res = WriteFile(handle, memory, cb, &dwWritten, NULL);
1895 ok(res, "Failed to WriteFile\n");
1896
1897 return dwWritten;
1898 }
1899
1900 static int CDECL fci_close(INT_PTR hf, int *err, void *pv)
1901 {
1902 HANDLE handle = (HANDLE)hf;
1903 ok(CloseHandle(handle), "Failed to CloseHandle\n");
1904
1905 return 0;
1906 }
1907
1908 static LONG CDECL fci_seek(INT_PTR hf, LONG dist, int seektype, int *err, void *pv)
1909 {
1910 HANDLE handle = (HANDLE)hf;
1911 DWORD ret;
1912
1913 ret = SetFilePointer(handle, dist, NULL, seektype);
1914 ok(ret != INVALID_SET_FILE_POINTER, "Failed to SetFilePointer\n");
1915
1916 return ret;
1917 }
1918
1919 static int CDECL fci_delete(char *pszFile, int *err, void *pv)
1920 {
1921 BOOL ret = DeleteFileA(pszFile);
1922 ok(ret, "Failed to DeleteFile %s\n", pszFile);
1923
1924 return 0;
1925 }
1926
1927 static void init_functionpointers(void)
1928 {
1929 HMODULE hmsi = GetModuleHandleA("msi.dll");
1930 HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
1931 HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
1932
1933 #define GET_PROC(mod, func) \
1934 p ## func = (void*)GetProcAddress(mod, #func); \
1935 if(!p ## func) \
1936 trace("GetProcAddress(%s) failed\n", #func);
1937
1938 GET_PROC(hmsi, MsiQueryComponentStateA);
1939 GET_PROC(hmsi, MsiSourceListEnumSourcesA);
1940 GET_PROC(hmsi, MsiSourceListGetInfoA);
1941 GET_PROC(hmsi, MsiGetComponentPathExA);
1942
1943 GET_PROC(hadvapi32, ConvertSidToStringSidA);
1944 GET_PROC(hadvapi32, GetTokenInformation);
1945 GET_PROC(hadvapi32, OpenProcessToken);
1946 GET_PROC(hadvapi32, RegDeleteKeyExA)
1947 GET_PROC(hkernel32, IsWow64Process)
1948
1949 hsrclient = LoadLibraryA("srclient.dll");
1950 GET_PROC(hsrclient, SRRemoveRestorePoint);
1951 GET_PROC(hsrclient, SRSetRestorePointA);
1952
1953 #undef GET_PROC
1954 }
1955
1956 static BOOL is_process_limited(void)
1957 {
1958 HANDLE token;
1959
1960 if (!pOpenProcessToken || !pGetTokenInformation) return FALSE;
1961
1962 if (pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token))
1963 {
1964 BOOL ret;
1965 TOKEN_ELEVATION_TYPE type = TokenElevationTypeDefault;
1966 DWORD size;
1967
1968 ret = pGetTokenInformation(token, TokenElevationType, &type, sizeof(type), &size);
1969 CloseHandle(token);
1970 return (ret && type == TokenElevationTypeLimited);
1971 }
1972 return FALSE;
1973 }
1974
1975 static char *get_user_sid(void)
1976 {
1977 HANDLE token;
1978 DWORD size = 0;
1979 TOKEN_USER *user;
1980 char *usersid = NULL;
1981
1982 if (!pConvertSidToStringSidA)
1983 {
1984 win_skip("ConvertSidToStringSidA is not available\n");
1985 return NULL;
1986 }
1987 OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
1988 GetTokenInformation(token, TokenUser, NULL, size, &size);
1989
1990 user = HeapAlloc(GetProcessHeap(), 0, size);
1991 GetTokenInformation(token, TokenUser, user, size, &size);
1992 pConvertSidToStringSidA(user->User.Sid, &usersid);
1993 HeapFree(GetProcessHeap(), 0, user);
1994
1995 CloseHandle(token);
1996 return usersid;
1997 }
1998
1999 static BOOL CDECL get_temp_file(char *pszTempName, int cbTempName, void *pv)
2000 {
2001 LPSTR tempname;
2002
2003 tempname = HeapAlloc(GetProcessHeap(), 0, MAX_PATH);
2004 GetTempFileNameA(".", "xx", 0, tempname);
2005
2006 if (tempname && (strlen(tempname) < (unsigned)cbTempName))
2007 {
2008 lstrcpyA(pszTempName, tempname);
2009 HeapFree(GetProcessHeap(), 0, tempname);
2010 return TRUE;
2011 }
2012
2013 HeapFree(GetProcessHeap(), 0, tempname);
2014
2015 return FALSE;
2016 }
2017
2018 static INT_PTR CDECL get_open_info(char *pszName, USHORT *pdate, USHORT *ptime,
2019 USHORT *pattribs, int *err, void *pv)
2020 {
2021 BY_HANDLE_FILE_INFORMATION finfo;
2022 FILETIME filetime;
2023 HANDLE handle;
2024 DWORD attrs;
2025 BOOL res;
2026
2027 handle = CreateFile(pszName, GENERIC_READ, FILE_SHARE_READ, NULL,
2028 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
2029
2030 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszName);
2031
2032 res = GetFileInformationByHandle(handle, &finfo);
2033 ok(res, "Expected GetFileInformationByHandle to succeed\n");
2034
2035 FileTimeToLocalFileTime(&finfo.ftLastWriteTime, &filetime);
2036 FileTimeToDosDateTime(&filetime, pdate, ptime);
2037
2038 attrs = GetFileAttributes(pszName);
2039 ok(attrs != INVALID_FILE_ATTRIBUTES, "Failed to GetFileAttributes\n");
2040
2041 return (INT_PTR)handle;
2042 }
2043
2044 static BOOL add_file(HFCI hfci, const char *file, TCOMP compress)
2045 {
2046 char path[MAX_PATH];
2047 char filename[MAX_PATH];
2048
2049 lstrcpyA(path, CURR_DIR);
2050 lstrcatA(path, "\\");
2051 lstrcatA(path, file);
2052
2053 lstrcpyA(filename, file);
2054
2055 return FCIAddFile(hfci, path, filename, FALSE, get_next_cabinet,
2056 progress, get_open_info, compress);
2057 }
2058
2059 static void set_cab_parameters(PCCAB pCabParams, const CHAR *name, DWORD max_size)
2060 {
2061 ZeroMemory(pCabParams, sizeof(CCAB));
2062
2063 pCabParams->cb = max_size;
2064 pCabParams->cbFolderThresh = FOLDER_THRESHOLD;
2065 pCabParams->setID = 0xbeef;
2066 pCabParams->iCab = 1;
2067 lstrcpyA(pCabParams->szCabPath, CURR_DIR);
2068 lstrcatA(pCabParams->szCabPath, "\\");
2069 lstrcpyA(pCabParams->szCab, name);
2070 }
2071
2072 static void create_cab_file(const CHAR *name, DWORD max_size, const CHAR *files)
2073 {
2074 CCAB cabParams;
2075 LPCSTR ptr;
2076 HFCI hfci;
2077 ERF erf;
2078 BOOL res;
2079
2080 set_cab_parameters(&cabParams, name, max_size);
2081
2082 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open,
2083 fci_read, fci_write, fci_close, fci_seek, fci_delete,
2084 get_temp_file, &cabParams, NULL);
2085
2086 ok(hfci != NULL, "Failed to create an FCI context\n");
2087
2088 ptr = files;
2089 while (*ptr)
2090 {
2091 res = add_file(hfci, ptr, tcompTYPE_MSZIP);
2092 ok(res, "Failed to add file: %s\n", ptr);
2093 ptr += lstrlen(ptr) + 1;
2094 }
2095
2096 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress);
2097 ok(res, "Failed to flush the cabinet\n");
2098
2099 res = FCIDestroy(hfci);
2100 ok(res, "Failed to destroy the cabinet\n");
2101 }
2102
2103 static BOOL get_user_dirs(void)
2104 {
2105 HKEY hkey;
2106 DWORD type, size;
2107
2108 if (RegOpenKey(HKEY_CURRENT_USER,
2109 "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", &hkey))
2110 return FALSE;
2111
2112 size = MAX_PATH;
2113 if (RegQueryValueExA(hkey, "AppData", 0, &type, (LPBYTE)APP_DATA_DIR, &size))
2114 {
2115 RegCloseKey(hkey);
2116 return FALSE;
2117 }
2118
2119 RegCloseKey(hkey);
2120 return TRUE;
2121 }
2122
2123 static BOOL get_system_dirs(void)
2124 {
2125 HKEY hkey;
2126 DWORD type, size;
2127
2128 if (RegOpenKey(HKEY_LOCAL_MACHINE,
2129 "Software\\Microsoft\\Windows\\CurrentVersion", &hkey))
2130 return FALSE;
2131
2132 size = MAX_PATH;
2133 if (RegQueryValueExA(hkey, "ProgramFilesDir (x86)", 0, &type, (LPBYTE)PROG_FILES_DIR, &size) &&
2134 RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR, &size))
2135 {
2136 RegCloseKey(hkey);
2137 return FALSE;
2138 }
2139
2140 size = MAX_PATH;
2141 if (RegQueryValueExA(hkey, "CommonFilesDir (x86)", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size) &&
2142 RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size))
2143 {
2144 RegCloseKey(hkey);
2145 return FALSE;
2146 }
2147
2148 RegCloseKey(hkey);
2149
2150 if (!GetWindowsDirectoryA(WINDOWS_DIR, MAX_PATH))
2151 return FALSE;
2152
2153 return TRUE;
2154 }
2155
2156 static void create_file_data(LPCSTR name, LPCSTR data, DWORD size)
2157 {
2158 HANDLE file;
2159 DWORD written;
2160
2161 file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
2162 if (file == INVALID_HANDLE_VALUE)
2163 return;
2164
2165 WriteFile(file, data, strlen(data), &written, NULL);
2166
2167 if (size)
2168 {
2169 SetFilePointer(file, size, NULL, FILE_BEGIN);
2170 SetEndOfFile(file);
2171 }
2172
2173 CloseHandle(file);
2174 }
2175
2176 #define create_file(name, size) create_file_data(name, name, size)
2177
2178 static void create_test_files(void)
2179 {
2180 CreateDirectoryA("msitest", NULL);
2181 create_file("msitest\\one.txt", 100);
2182 CreateDirectoryA("msitest\\first", NULL);
2183 create_file("msitest\\first\\two.txt", 100);
2184 CreateDirectoryA("msitest\\second", NULL);
2185 create_file("msitest\\second\\three.txt", 100);
2186
2187 create_file("four.txt", 100);
2188 create_file("five.txt", 100);
2189 create_cab_file("msitest.cab", MEDIA_SIZE, "four.txt\0five.txt\0");
2190
2191 create_file("msitest\\filename", 100);
2192 create_file("msitest\\service.exe", 100);
2193 create_file("msitest\\service2.exe", 100);
2194
2195 DeleteFileA("four.txt");
2196 DeleteFileA("five.txt");
2197 }
2198
2199 static BOOL delete_pf(const CHAR *rel_path, BOOL is_file)
2200 {
2201 CHAR path[MAX_PATH];
2202
2203 lstrcpyA(path, PROG_FILES_DIR);
2204 lstrcatA(path, "\\");
2205 lstrcatA(path, rel_path);
2206
2207 if (is_file)
2208 return DeleteFileA(path);
2209 else
2210 return RemoveDirectoryA(path);
2211 }
2212
2213 static void delete_test_files(void)
2214 {
2215 DeleteFileA("msitest.msi");
2216 DeleteFileA("msitest.cab");
2217 DeleteFileA("msitest\\second\\three.txt");
2218 DeleteFileA("msitest\\first\\two.txt");
2219 DeleteFileA("msitest\\one.txt");
2220 DeleteFileA("msitest\\service.exe");
2221 DeleteFileA("msitest\\service2.exe");
2222 DeleteFileA("msitest\\filename");
2223 RemoveDirectoryA("msitest\\second");
2224 RemoveDirectoryA("msitest\\first");
2225 RemoveDirectoryA("msitest");
2226 }
2227
2228 static void write_file(const CHAR *filename, const char *data, int data_size)
2229 {
2230 DWORD size;
2231 HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2232 WriteFile(hf, data, data_size, &size, NULL);
2233 CloseHandle(hf);
2234 }
2235
2236 static void write_msi_summary_info(MSIHANDLE db, INT version, INT wordcount, const char *template)
2237 {
2238 MSIHANDLE summary;
2239 UINT r;
2240
2241 r = MsiGetSummaryInformationA(db, NULL, 5, &summary);
2242 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2243
2244 r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, template);
2245 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2246
2247 r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL,
2248 "{004757CA-5092-49c2-AD20-28E1CE0DF5F2}");
2249 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2250
2251 r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, version, NULL, NULL);
2252 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2253
2254 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, wordcount, NULL, NULL);
2255 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2256
2257 r = MsiSummaryInfoSetPropertyA(summary, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
2258 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2259
2260 /* write the summary changes back to the stream */
2261 r = MsiSummaryInfoPersist(summary);
2262 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2263
2264 MsiCloseHandle(summary);
2265 }
2266
2267 #define create_database(name, tables, num_tables) \
2268 create_database_wordcount(name, tables, num_tables, 100, 0, ";1033");
2269
2270 #define create_database_template(name, tables, num_tables, version, template) \
2271 create_database_wordcount(name, tables, num_tables, version, 0, template);
2272
2273 static void create_database_wordcount(const CHAR *name, const msi_table *tables,
2274 int num_tables, INT version, INT wordcount,
2275 const char *template)
2276 {
2277 MSIHANDLE db;
2278 UINT r;
2279 int j;
2280
2281 r = MsiOpenDatabaseA(name, MSIDBOPEN_CREATE, &db);
2282 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2283
2284 /* import the tables into the database */
2285 for (j = 0; j < num_tables; j++)
2286 {
2287 const msi_table *table = &tables[j];
2288
2289 write_file(table->filename, table->data, (table->size - 1) * sizeof(char));
2290
2291 r = MsiDatabaseImportA(db, CURR_DIR, table->filename);
2292 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2293
2294 DeleteFileA(table->filename);
2295 }
2296
2297 write_msi_summary_info(db, version, wordcount, template);
2298
2299 r = MsiDatabaseCommit(db);
2300 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2301
2302 MsiCloseHandle(db);
2303 }
2304
2305 static BOOL notify_system_change(DWORD event_type, STATEMGRSTATUS *status)
2306 {
2307 RESTOREPOINTINFOA spec;
2308
2309 spec.dwEventType = event_type;
2310 spec.dwRestorePtType = APPLICATION_INSTALL;
2311 spec.llSequenceNumber = status->llSequenceNumber;
2312 lstrcpyA(spec.szDescription, "msitest restore point");
2313
2314 return pSRSetRestorePointA(&spec, status);
2315 }
2316
2317 static void remove_restore_point(DWORD seq_number)
2318 {
2319 DWORD res;
2320
2321 res = pSRRemoveRestorePoint(seq_number);
2322 if (res != ERROR_SUCCESS)
2323 trace("Failed to remove the restore point : %08x\n", res);
2324 }
2325
2326 static LONG delete_key( HKEY key, LPCSTR subkey, REGSAM access )
2327 {
2328 if (pRegDeleteKeyExA)
2329 return pRegDeleteKeyExA( key, subkey, access, 0 );
2330 return RegDeleteKeyA( key, subkey );
2331 }
2332
2333 static BOOL file_exists(LPCSTR file)
2334 {
2335 return GetFileAttributes(file) != INVALID_FILE_ATTRIBUTES;
2336 }
2337
2338 static BOOL pf_exists(LPCSTR file)
2339 {
2340 CHAR path[MAX_PATH];
2341
2342 lstrcpyA(path, PROG_FILES_DIR);
2343 lstrcatA(path, "\\");
2344 lstrcatA(path, file);
2345
2346 return file_exists(path);
2347 }
2348
2349 static void delete_pfmsitest_files(void)
2350 {
2351 SHFILEOPSTRUCT shfl;
2352 CHAR path[MAX_PATH+11];
2353
2354 lstrcpyA(path, PROG_FILES_DIR);
2355 lstrcatA(path, "\\msitest\\*");
2356 path[strlen(path) + 1] = '\0';
2357
2358 shfl.hwnd = NULL;
2359 shfl.wFunc = FO_DELETE;
2360 shfl.pFrom = path;
2361 shfl.pTo = NULL;
2362 shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT | FOF_NOERRORUI;
2363
2364 SHFileOperation(&shfl);
2365
2366 lstrcpyA(path, PROG_FILES_DIR);
2367 lstrcatA(path, "\\msitest");
2368 RemoveDirectoryA(path);
2369 }
2370
2371 static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase, DWORD line)
2372 {
2373 char val[MAX_PATH];
2374 DWORD size, type;
2375 LONG res;
2376
2377 size = MAX_PATH;
2378 val[0] = '\0';
2379 res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)val, &size);
2380
2381 if (res != ERROR_SUCCESS ||
2382 (type != REG_SZ && type != REG_EXPAND_SZ && type != REG_MULTI_SZ))
2383 {
2384 ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
2385 return;
2386 }
2387
2388 if (!expected)
2389 ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val);
2390 else
2391 {
2392 if (bcase)
2393 ok_(__FILE__, line)(!lstrcmpA(val, expected), "Expected %s, got %s\n", expected, val);
2394 else
2395 ok_(__FILE__, line)(!lstrcmpiA(val, expected), "Expected %s, got %s\n", expected, val);
2396 }
2397 }
2398
2399 static void check_reg_dword(HKEY prodkey, LPCSTR name, DWORD expected, DWORD line)
2400 {
2401 DWORD val, size, type;
2402 LONG res;
2403
2404 size = sizeof(DWORD);
2405 res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size);
2406
2407 if (res != ERROR_SUCCESS || type != REG_DWORD)
2408 {
2409 ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
2410 return;
2411 }
2412
2413 ok_(__FILE__, line)(val == expected, "Expected %d, got %d\n", expected, val);
2414 }
2415
2416 static void check_reg_dword4(HKEY prodkey, LPCSTR name, DWORD expected1, DWORD expected2, DWORD expected3,
2417 DWORD expected4, DWORD line)
2418 {
2419 DWORD val, size, type;
2420 LONG res;
2421
2422 size = sizeof(DWORD);
2423 res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size);
2424
2425 if (res != ERROR_SUCCESS || type != REG_DWORD)
2426 {
2427 ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
2428 return;
2429 }
2430
2431 ok_(__FILE__, line)(val == expected1 || val == expected2 || val == expected3 || val == expected4,
2432 "Expected %d, %d, %d or %d, got %d\n", expected1, expected2, expected3, expected4, val);
2433 }
2434
2435 static void check_reg_dword5(HKEY prodkey, LPCSTR name, DWORD expected1, DWORD expected2, DWORD expected3,
2436 DWORD expected4, DWORD expected5, DWORD line)
2437 {
2438 DWORD val, size, type;
2439 LONG res;
2440
2441 size = sizeof(DWORD);
2442 res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size);
2443
2444 if (res != ERROR_SUCCESS || type != REG_DWORD)
2445 {
2446 ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
2447 return;
2448 }
2449
2450 ok_(__FILE__, line)(val == expected1 || val == expected2 || val == expected3 || val == expected4 ||
2451 val == expected5,
2452 "Expected %d, %d, %d, %d or %d, got %d\n", expected1, expected2, expected3, expected4, expected5, val);
2453 }
2454
2455 #define CHECK_REG_STR(prodkey, name, expected) \
2456 check_reg_str(prodkey, name, expected, TRUE, __LINE__);
2457
2458 #define CHECK_DEL_REG_STR(prodkey, name, expected) \
2459 check_reg_str(prodkey, name, expected, TRUE, __LINE__); \
2460 RegDeleteValueA(prodkey, name);
2461
2462 #define CHECK_REG_ISTR(prodkey, name, expected) \
2463 check_reg_str(prodkey, name, expected, FALSE, __LINE__);
2464
2465 #define CHECK_DEL_REG_ISTR(prodkey, name, expected) \
2466 check_reg_str(prodkey, name, expected, FALSE, __LINE__); \
2467 RegDeleteValueA(prodkey, name);
2468
2469 #define CHECK_REG_DWORD(prodkey, name, expected) \
2470 check_reg_dword(prodkey, name, expected, __LINE__);
2471
2472 #define CHECK_DEL_REG_DWORD(prodkey, name, expected) \
2473 check_reg_dword(prodkey, name, expected, __LINE__); \
2474 RegDeleteValueA(prodkey, name);
2475
2476 #define CHECK_REG_DWORD2(prodkey, name, expected1, expected2) \
2477 check_reg_dword2(prodkey, name, expected1, expected2, __LINE__);
2478
2479 #define CHECK_DEL_REG_DWORD2(prodkey, name, expected1, expected2) \
2480 check_reg_dword2(prodkey, name, expected1, expected2, __LINE__); \
2481 RegDeleteValueA(prodkey, name);
2482
2483 #define CHECK_REG_DWORD4(prodkey, name, expected1, expected2, expected3, expected4) \
2484 check_reg_dword4(prodkey, name, expected1, expected2, expected3, expected4, __LINE__);
2485
2486 #define CHECK_DEL_REG_DWORD5(prodkey, name, expected1, expected2, expected3, expected4 ,expected5) \
2487 check_reg_dword5(prodkey, name, expected1, expected2, expected3, expected4, expected5, __LINE__); \
2488 RegDeleteValueA(prodkey, name);
2489
2490 static void get_date_str(LPSTR date)
2491 {
2492 SYSTEMTIME systime;
2493
2494 static const char date_fmt[] = "%d%02d%02d";
2495 GetLocalTime(&systime);
2496 sprintf(date, date_fmt, systime.wYear, systime.wMonth, systime.wDay);
2497 }
2498
2499 static void test_register_product(void)
2500 {
2501 UINT r;
2502 LONG res;
2503 HKEY hkey, props, usage;
2504 LPSTR usersid;
2505 char date[MAX_PATH], temp[MAX_PATH], keypath[MAX_PATH], path[MAX_PATH];
2506 DWORD size, type;
2507 REGSAM access = KEY_ALL_ACCESS;
2508
2509 static const CHAR uninstall[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2510 "\\Uninstall\\{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2511 static const CHAR uninstall_32node[] = "Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion"
2512 "\\Uninstall\\{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2513 static const CHAR userdata[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer"
2514 "\\UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2515 static const CHAR ugkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer"
2516 "\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
2517 static const CHAR userugkey[] = "Software\\Microsoft\\Installer\\UpgradeCodes"
2518 "\\51AAE0C44620A5E4788506E91F249BD2";
2519
2520 if (is_process_limited())
2521 {
2522 skip("process is limited\n");
2523 return;
2524 }
2525
2526 if (!(usersid = get_user_sid()))
2527 return;
2528
2529 get_date_str(date);
2530 GetTempPath(MAX_PATH, temp);
2531
2532 CreateDirectoryA("msitest", NULL);
2533 create_file("msitest\\maximus", 500);
2534
2535 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2536
2537 if (is_wow64)
2538 access |= KEY_WOW64_64KEY;
2539
2540 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2541
2542 /* RegisterProduct */
2543 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
2544 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
2545 {
2546 skip("Not enough rights to perform tests\n");
2547 goto error;
2548 }
2549 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2550 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2551 ok(delete_pf("msitest", FALSE), "Directory not created\n");
2552
2553 res = RegOpenKeyA(HKEY_CURRENT_USER, userugkey, &hkey);
2554 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2555
2556 if (is_64bit)
2557 {
2558 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall_32node, 0, KEY_ALL_ACCESS, &hkey);
2559 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2560 }
2561 else
2562 {
2563 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_ALL_ACCESS, &hkey);
2564 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2565 }
2566
2567 CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST");
2568 CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1");
2569 CHECK_DEL_REG_STR(hkey, "InstallDate", date);
2570 CHECK_DEL_REG_STR(hkey, "InstallSource", temp);
2571 CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2572 CHECK_DEL_REG_STR(hkey, "Publisher", "Wine");
2573 CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2574 CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", NULL);
2575 CHECK_DEL_REG_STR(hkey, "Comments", NULL);
2576 CHECK_DEL_REG_STR(hkey, "Contact", NULL);
2577 CHECK_DEL_REG_STR(hkey, "HelpLink", NULL);
2578 CHECK_DEL_REG_STR(hkey, "HelpTelephone", NULL);
2579 CHECK_DEL_REG_STR(hkey, "InstallLocation", NULL);
2580 CHECK_DEL_REG_STR(hkey, "Readme", NULL);
2581 CHECK_DEL_REG_STR(hkey, "Size", NULL);
2582 CHECK_DEL_REG_STR(hkey, "URLInfoAbout", NULL);
2583 CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", NULL);
2584 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2585 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2586 CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1);
2587 CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1);
2588 CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1);
2589 todo_wine
2590 {
2591 CHECK_DEL_REG_DWORD5(hkey, "EstimatedSize", 12, -12, 4, 10, 24);
2592 }
2593
2594 delete_key(hkey, "", access);
2595 RegCloseKey(hkey);
2596
2597 sprintf(keypath, userdata, usersid);
2598 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey);
2599 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2600
2601 res = RegOpenKeyExA(hkey, "InstallProperties", 0, access, &props);
2602 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2603
2604 size = sizeof(path);
2605 RegQueryValueExA(props, "LocalPackage", NULL, &type, (LPBYTE)path, &size);
2606 DeleteFileA(path);
2607 RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */
2608
2609 CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST");
2610 CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1");
2611 CHECK_DEL_REG_STR(props, "InstallDate", date);
2612 CHECK_DEL_REG_STR(props, "InstallSource", temp);
2613 CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2614 CHECK_DEL_REG_STR(props, "Publisher", "Wine");
2615 CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2616 CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", NULL);
2617 CHECK_DEL_REG_STR(props, "Comments", NULL);
2618 CHECK_DEL_REG_STR(props, "Contact", NULL);
2619 CHECK_DEL_REG_STR(props, "HelpLink", NULL);
2620 CHECK_DEL_REG_STR(props, "HelpTelephone", NULL);
2621 CHECK_DEL_REG_STR(props, "InstallLocation", NULL);
2622 CHECK_DEL_REG_STR(props, "Readme", NULL);
2623 CHECK_DEL_REG_STR(props, "Size", NULL);
2624 CHECK_DEL_REG_STR(props, "URLInfoAbout", NULL);
2625 CHECK_DEL_REG_STR(props, "URLUpdateInfo", NULL);
2626 CHECK_DEL_REG_DWORD(props, "Language", 1033);
2627 CHECK_DEL_REG_DWORD(props, "Version", 0x1010001);
2628 CHECK_DEL_REG_DWORD(props, "VersionMajor", 1);
2629 CHECK_DEL_REG_DWORD(props, "VersionMinor"