1 /*
2 * Copyright (C) 2006 James Hawkins
3 *
4 * A test program for installing MSI products.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21 #define _WIN32_MSI 300
22 #define COBJMACROS
23
24 #include <stdio.h>
25
26 #include <windows.h>
27 #include <msiquery.h>
28 #include <msidefs.h>
29 #include <msi.h>
30 #include <fci.h>
31 #include <objidl.h>
32 #include <srrestoreptapi.h>
33
34 #include "wine/test.h"
35
36 static UINT (WINAPI *pMsiQueryComponentStateA)
37 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPCSTR, INSTALLSTATE*);
38 static UINT (WINAPI *pMsiSetExternalUIRecord)
39 (INSTALLUI_HANDLER_RECORD, DWORD, LPVOID, PINSTALLUI_HANDLER_RECORD);
40 static UINT (WINAPI *pMsiSourceListEnumSourcesA)
41 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD);
42 static UINT (WINAPI *pMsiSourceListGetInfoA)
43 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD);
44
45 static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
46
47 static HMODULE hsrclient = 0;
48 static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD);
49 static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*);
50
51 static BOOL on_win9x = FALSE;
52
53 static const char *msifile = "msitest.msi";
54 static const char *msifile2 = "winetest2.msi";
55 static const char *mstfile = "winetest.mst";
56 static CHAR CURR_DIR[MAX_PATH];
57 static CHAR PROG_FILES_DIR[MAX_PATH];
58 static CHAR COMMON_FILES_DIR[MAX_PATH];
59
60 /* msi database data */
61
62 static const CHAR component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
63 "s72\tS38\ts72\ti2\tS255\tS72\n"
64 "Component\tComponent\n"
65 "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n"
66 "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n"
67 "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\tNOT REINSTALL\tone.txt\n"
68 "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n"
69 "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n"
70 "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n"
71 "component\t\tMSITESTDIR\t\t1\tfile\n"
72 "service_comp\t\tMSITESTDIR\t\t1\tservice_file";
73
74 static const CHAR directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n"
75 "s72\tS72\tl255\n"
76 "Directory\tDirectory\n"
77 "CABOUTDIR\tMSITESTDIR\tcabout\n"
78 "CHANGEDDIR\tMSITESTDIR\tchanged:second\n"
79 "FIRSTDIR\tMSITESTDIR\tfirst\n"
80 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
81 "NEWDIR\tCABOUTDIR\tnew\n"
82 "ProgramFilesFolder\tTARGETDIR\t.\n"
83 "TARGETDIR\t\tSourceDir";
84
85 static const CHAR feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
86 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
87 "Feature\tFeature\n"
88 "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t\n"
89 "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t\n"
90 "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t\n"
91 "Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t\n"
92 "Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t\n"
93 "feature\t\t\t\t2\t1\tTARGETDIR\t\n"
94 "service_feature\t\t\t\t2\t1\tTARGETDIR\t";
95
96 static const CHAR feature_comp_dat[] = "Feature_\tComponent_\n"
97 "s38\ts72\n"
98 "FeatureComponents\tFeature_\tComponent_\n"
99 "Five\tFive\n"
100 "Four\tFour\n"
101 "One\tOne\n"
102 "Three\tThree\n"
103 "Two\tTwo\n"
104 "feature\tcomponent\n"
105 "service_feature\tservice_comp\n";
106
107 static const CHAR file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
108 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
109 "File\tFile\n"
110 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
111 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
112 "one.txt\tOne\tone.txt\t1000\t\t\t\t1\n"
113 "three.txt\tThree\tthree.txt\t1000\t\t\t\t3\n"
114 "two.txt\tTwo\ttwo.txt\t1000\t\t\t\t2\n"
115 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
116 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1";
117
118 static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
119 "s72\tS255\tI2\n"
120 "InstallExecuteSequence\tAction\n"
121 "AllocateRegistrySpace\tNOT Installed\t1550\n"
122 "CostFinalize\t\t1000\n"
123 "CostInitialize\t\t800\n"
124 "FileCost\t\t900\n"
125 "ResolveSource\t\t950\n"
126 "MoveFiles\t\t1700\n"
127 "InstallFiles\t\t4000\n"
128 "DuplicateFiles\t\t4500\n"
129 "WriteEnvironmentStrings\t\t4550\n"
130 "CreateShortcuts\t\t4600\n"
131 "InstallServices\t\t5000\n"
132 "InstallFinalize\t\t6600\n"
133 "InstallInitialize\t\t1500\n"
134 "InstallValidate\t\t1400\n"
135 "LaunchConditions\t\t100\n"
136 "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000";
137
138 static const CHAR media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
139 "i2\ti4\tL64\tS255\tS32\tS72\n"
140 "Media\tDiskId\n"
141 "1\t3\t\t\tDISK1\t\n"
142 "2\t5\t\tmsitest.cab\tDISK2\t\n";
143
144 static const CHAR property_dat[] = "Property\tValue\n"
145 "s72\tl0\n"
146 "Property\tProperty\n"
147 "DefaultUIFont\tDlgFont8\n"
148 "HASUIRUN\t\n"
149 "INSTALLLEVEL\t3\n"
150 "InstallMode\tTypical\n"
151 "Manufacturer\tWine\n"
152 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
153 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
154 "ProductID\tnone\n"
155 "ProductLanguage\t1033\n"
156 "ProductName\tMSITEST\n"
157 "ProductVersion\t1.1.1\n"
158 "PROMPTROLLBACKCOST\tP\n"
159 "Setup\tSetup\n"
160 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
161 "AdminProperties\tPOSTADMIN\n"
162 "ROOTDRIVE\tC:\\\n"
163 "SERVNAME\tTestService\n"
164 "SERVDISP\tTestServiceDisp\n";
165
166 static const CHAR aup_property_dat[] = "Property\tValue\n"
167 "s72\tl0\n"
168 "Property\tProperty\n"
169 "DefaultUIFont\tDlgFont8\n"
170 "HASUIRUN\t\n"
171 "ALLUSERS\t1\n"
172 "INSTALLLEVEL\t3\n"
173 "InstallMode\tTypical\n"
174 "Manufacturer\tWine\n"
175 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
176 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
177 "ProductID\tnone\n"
178 "ProductLanguage\t1033\n"
179 "ProductName\tMSITEST\n"
180 "ProductVersion\t1.1.1\n"
181 "PROMPTROLLBACKCOST\tP\n"
182 "Setup\tSetup\n"
183 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
184 "AdminProperties\tPOSTADMIN\n"
185 "ROOTDRIVE\tC:\\\n"
186 "SERVNAME\tTestService\n"
187 "SERVDISP\tTestServiceDisp\n";
188
189 static const CHAR aup2_property_dat[] = "Property\tValue\n"
190 "s72\tl0\n"
191 "Property\tProperty\n"
192 "DefaultUIFont\tDlgFont8\n"
193 "HASUIRUN\t\n"
194 "ALLUSERS\t2\n"
195 "INSTALLLEVEL\t3\n"
196 "InstallMode\tTypical\n"
197 "Manufacturer\tWine\n"
198 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
199 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
200 "ProductID\tnone\n"
201 "ProductLanguage\t1033\n"
202 "ProductName\tMSITEST\n"
203 "ProductVersion\t1.1.1\n"
204 "PROMPTROLLBACKCOST\tP\n"
205 "Setup\tSetup\n"
206 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
207 "AdminProperties\tPOSTADMIN\n"
208 "ROOTDRIVE\tC:\\\n"
209 "SERVNAME\tTestService\n"
210 "SERVDISP\tTestServiceDisp\n";
211
212 static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"
213 "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n"
214 "Shortcut\tShortcut\n"
215 "Shortcut\tMSITESTDIR\tShortcut\tcomponent\tShortcut\t\tShortcut\t\t\t\t\t\n";
216
217 static const CHAR environment_dat[] = "Environment\tName\tValue\tComponent_\n"
218 "s72\tl255\tL255\ts72\n"
219 "Environment\tEnvironment\n"
220 "Var1\t=-MSITESTVAR1\t1\tOne\n"
221 "Var2\tMSITESTVAR2\t1\tOne\n"
222 "Var3\t=-MSITESTVAR3\t1\tOne\n"
223 "Var4\tMSITESTVAR4\t1\tOne\n"
224 "Var5\t-MSITESTVAR5\t\tOne\n"
225 "Var6\tMSITESTVAR6\t\tOne\n"
226 "Var7\t!-MSITESTVAR7\t\tOne\n"
227 "Var8\t!-*MSITESTVAR8\t\tOne\n"
228 "Var9\t=-MSITESTVAR9\t\tOne\n"
229 "Var10\t=MSITESTVAR10\t\tOne\n"
230 "Var11\t+-MSITESTVAR11\t[~];1\tOne\n"
231 "Var12\t+-MSITESTVAR11\t[~];2\tOne\n"
232 "Var13\t+-MSITESTVAR12\t[~];1\tOne\n"
233 "Var14\t=MSITESTVAR13\t[~];1\tOne\n"
234 "Var15\t=MSITESTVAR13\t[~];2\tOne\n"
235 "Var16\t=MSITESTVAR14\t;1;\tOne\n"
236 "Var17\t=MSITESTVAR15\t;;1;;\tOne\n"
237 "Var18\t=MSITESTVAR16\t 1 \tOne\n"
238 "Var19\t+-MSITESTVAR17\t1\tOne\n"
239 "Var20\t+-MSITESTVAR17\t;;2;;[~]\tOne\n"
240 "Var21\t+-MSITESTVAR18\t1\tOne\n"
241 "Var22\t+-MSITESTVAR18\t[~];;2;;\tOne\n"
242 "Var23\t+-MSITESTVAR19\t1\tOne\n"
243 "Var24\t+-MSITESTVAR19\t[~]2\tOne\n"
244 "Var25\t+-MSITESTVAR20\t1\tOne\n"
245 "Var26\t+-MSITESTVAR20\t2[~]\tOne\n";
246
247 /* Expected results, starting from MSITESTVAR11 onwards */
248 static const CHAR *environment_dat_results[] = {"1;2", /*MSITESTVAR11*/
249 "1", /*MSITESTVAR12*/
250 "1;2", /*MSITESTVAR13*/
251 ";1;", /*MSITESTVAR14*/
252 ";;1;;", /*MSITESTVAR15*/
253 " 1 ", /*MSITESTVAR16*/
254 ";;2;;1", /*MSITESTVAR17*/
255 "1;;2;;", /*MSITESTVAR18*/
256 "1", /*MSITESTVAR19*/
257 "1", /*MSITESTVAR20*/
258 NULL};
259
260 static const CHAR condition_dat[] = "Feature_\tLevel\tCondition\n"
261 "s38\ti2\tS255\n"
262 "Condition\tFeature_\tLevel\n"
263 "One\t4\t1\n";
264
265 static const CHAR up_property_dat[] = "Property\tValue\n"
266 "s72\tl0\n"
267 "Property\tProperty\n"
268 "DefaultUIFont\tDlgFont8\n"
269 "HASUIRUN\t\n"
270 "INSTALLLEVEL\t3\n"
271 "InstallMode\tTypical\n"
272 "Manufacturer\tWine\n"
273 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
274 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
275 "ProductID\tnone\n"
276 "ProductLanguage\t1033\n"
277 "ProductName\tMSITEST\n"
278 "ProductVersion\t1.1.1\n"
279 "PROMPTROLLBACKCOST\tP\n"
280 "Setup\tSetup\n"
281 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
282 "AdminProperties\tPOSTADMIN\n"
283 "ROOTDRIVE\tC:\\\n"
284 "SERVNAME\tTestService\n"
285 "SERVDISP\tTestServiceDisp\n"
286 "RemovePreviousVersions\t1\n";
287
288 static const CHAR up2_property_dat[] = "Property\tValue\n"
289 "s72\tl0\n"
290 "Property\tProperty\n"
291 "DefaultUIFont\tDlgFont8\n"
292 "HASUIRUN\t\n"
293 "INSTALLLEVEL\t3\n"
294 "InstallMode\tTypical\n"
295 "Manufacturer\tWine\n"
296 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
297 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
298 "ProductID\tnone\n"
299 "ProductLanguage\t1033\n"
300 "ProductName\tMSITEST\n"
301 "ProductVersion\t1.1.2\n"
302 "PROMPTROLLBACKCOST\tP\n"
303 "Setup\tSetup\n"
304 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
305 "AdminProperties\tPOSTADMIN\n"
306 "ROOTDRIVE\tC:\\\n"
307 "SERVNAME\tTestService\n"
308 "SERVDISP\tTestServiceDisp\n";
309
310 static const CHAR up3_property_dat[] = "Property\tValue\n"
311 "s72\tl0\n"
312 "Property\tProperty\n"
313 "DefaultUIFont\tDlgFont8\n"
314 "HASUIRUN\t\n"
315 "INSTALLLEVEL\t3\n"
316 "InstallMode\tTypical\n"
317 "Manufacturer\tWine\n"
318 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
319 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
320 "ProductID\tnone\n"
321 "ProductLanguage\t1033\n"
322 "ProductName\tMSITEST\n"
323 "ProductVersion\t1.1.2\n"
324 "PROMPTROLLBACKCOST\tP\n"
325 "Setup\tSetup\n"
326 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
327 "AdminProperties\tPOSTADMIN\n"
328 "ROOTDRIVE\tC:\\\n"
329 "SERVNAME\tTestService\n"
330 "SERVDISP\tTestServiceDisp\n"
331 "RemovePreviousVersions\t1\n";
332
333 static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
334 "s72\ti2\tl255\tL255\tL0\ts72\n"
335 "Registry\tRegistry\n"
336 "Apples\t2\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n"
337 "Oranges\t2\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n"
338 "regdata\t2\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n"
339 "OrderTest\t2\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent";
340
341 static const CHAR service_install_dat[] = "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
342 "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n"
343 "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n"
344 "ServiceInstall\tServiceInstall\n"
345 "TestService\t[SERVNAME]\t[SERVDISP]\t2\t3\t\t\t\tTestService\t\t\tservice_comp\t\t";
346
347 static const CHAR service_control_dat[] = "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
348 "s72\tl255\ti2\tL255\tI2\ts72\n"
349 "ServiceControl\tServiceControl\n"
350 "ServiceControl\tTestService\t8\t\t\tservice_comp";
351
352 static const CHAR sss_service_control_dat[] = "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
353 "s72\tl255\ti2\tL255\tI2\ts72\n"
354 "ServiceControl\tServiceControl\n"
355 "ServiceControl\tSpooler\t1\t\t\tservice_comp";
356
357 static const CHAR sss_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
358 "s72\tS255\tI2\n"
359 "InstallExecuteSequence\tAction\n"
360 "CostFinalize\t\t1000\n"
361 "CostInitialize\t\t800\n"
362 "FileCost\t\t900\n"
363 "ResolveSource\t\t950\n"
364 "MoveFiles\t\t1700\n"
365 "InstallFiles\t\t4000\n"
366 "DuplicateFiles\t\t4500\n"
367 "WriteEnvironmentStrings\t\t4550\n"
368 "CreateShortcuts\t\t4600\n"
369 "StartServices\t\t5000\n"
370 "DeleteServices\t\t5500\n"
371 "InstallFinalize\t\t6600\n"
372 "InstallInitialize\t\t1500\n"
373 "InstallValidate\t\t1400\n"
374 "LaunchConditions\t\t100\n";
375
376 /* tables for test_continuouscabs */
377 static const CHAR cc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
378 "s72\tS38\ts72\ti2\tS255\tS72\n"
379 "Component\tComponent\n"
380 "maximus\t\tMSITESTDIR\t\t1\tmaximus\n"
381 "augustus\t\tMSITESTDIR\t\t1\taugustus\n"
382 "caesar\t\tMSITESTDIR\t\t1\tcaesar\n";
383
384 static const CHAR cc2_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
385 "s72\tS38\ts72\ti2\tS255\tS72\n"
386 "Component\tComponent\n"
387 "maximus\t\tMSITESTDIR\t\t1\tmaximus\n"
388 "augustus\t\tMSITESTDIR\t\t\taugustus\n"
389 "caesar\t\tMSITESTDIR\t\t1\tcaesar\n";
390
391 static const CHAR cc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
392 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
393 "Feature\tFeature\n"
394 "feature\t\t\t\t2\t1\tTARGETDIR\t";
395
396 static const CHAR cc_feature_comp_dat[] = "Feature_\tComponent_\n"
397 "s38\ts72\n"
398 "FeatureComponents\tFeature_\tComponent_\n"
399 "feature\tmaximus\n"
400 "feature\taugustus\n"
401 "feature\tcaesar";
402
403 static const CHAR cc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
404 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
405 "File\tFile\n"
406 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
407 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
408 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
409
410 static const CHAR cc2_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
411 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
412 "File\tFile\n"
413 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
414 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
415 "tiberius\tmaximus\ttiberius\t500\t\t\t16384\t3\n"
416 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
417
418 static const CHAR cc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
419 "i2\ti4\tL64\tS255\tS32\tS72\n"
420 "Media\tDiskId\n"
421 "1\t10\t\ttest1.cab\tDISK1\t\n"
422 "2\t2\t\ttest2.cab\tDISK2\t\n"
423 "3\t12\t\ttest3.cab\tDISK3\t\n";
424
425 static const CHAR co_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
426 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
427 "File\tFile\n"
428 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
429 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
430 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
431
432 static const CHAR co_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
433 "i2\ti4\tL64\tS255\tS32\tS72\n"
434 "Media\tDiskId\n"
435 "1\t10\t\ttest1.cab\tDISK1\t\n"
436 "2\t2\t\ttest2.cab\tDISK2\t\n"
437 "3\t3\t\ttest3.cab\tDISK3\t\n";
438
439 static const CHAR co2_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
440 "i2\ti4\tL64\tS255\tS32\tS72\n"
441 "Media\tDiskId\n"
442 "1\t10\t\ttest1.cab\tDISK1\t\n"
443 "2\t12\t\ttest3.cab\tDISK3\t\n"
444 "3\t2\t\ttest2.cab\tDISK2\t\n";
445
446 static const CHAR mm_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
447 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
448 "File\tFile\n"
449 "maximus\tmaximus\tmaximus\t500\t\t\t512\t1\n"
450 "augustus\taugustus\taugustus\t500\t\t\t512\t2\n"
451 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
452
453 static const CHAR mm_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
454 "i2\ti4\tL64\tS255\tS32\tS72\n"
455 "Media\tDiskId\n"
456 "1\t3\t\ttest1.cab\tDISK1\t\n";
457
458 static const CHAR ss_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
459 "i2\ti4\tL64\tS255\tS32\tS72\n"
460 "Media\tDiskId\n"
461 "1\t2\t\ttest1.cab\tDISK1\t\n"
462 "2\t2\t\ttest2.cab\tDISK2\t\n"
463 "3\t12\t\ttest3.cab\tDISK3\t\n";
464
465 /* tables for test_uiLevelFlags */
466 static const CHAR ui_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
467 "s72\tS38\ts72\ti2\tS255\tS72\n"
468 "Component\tComponent\n"
469 "maximus\t\tMSITESTDIR\t\tHASUIRUN=1\tmaximus\n"
470 "augustus\t\tMSITESTDIR\t\t1\taugustus\n"
471 "caesar\t\tMSITESTDIR\t\t1\tcaesar\n";
472
473 static const CHAR ui_install_ui_seq_dat[] = "Action\tCondition\tSequence\n"
474 "s72\tS255\tI2\n"
475 "InstallUISequence\tAction\n"
476 "SetUIProperty\t\t5\n"
477 "ExecuteAction\t\t1100\n";
478
479 static const CHAR ui_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
480 "s72\ti2\tS64\tS0\tS255\n"
481 "CustomAction\tAction\n"
482 "SetUIProperty\t51\tHASUIRUN\t1\t\n";
483
484 static const CHAR rof_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
485 "s72\tS38\ts72\ti2\tS255\tS72\n"
486 "Component\tComponent\n"
487 "maximus\t\tMSITESTDIR\t\t1\tmaximus\n";
488
489 static const CHAR rof_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
490 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
491 "Feature\tFeature\n"
492 "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t\n"
493 "montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t";
494
495 static const CHAR rof_feature_comp_dat[] = "Feature_\tComponent_\n"
496 "s38\ts72\n"
497 "FeatureComponents\tFeature_\tComponent_\n"
498 "feature\tmaximus\n"
499 "montecristo\tmaximus";
500
501 static const CHAR rof_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
502 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
503 "File\tFile\n"
504 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1";
505
506 static const CHAR rof_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
507 "i2\ti4\tL64\tS255\tS32\tS72\n"
508 "Media\tDiskId\n"
509 "1\t1\t\t\tDISK1\t\n";
510
511 static const CHAR rofc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
512 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
513 "File\tFile\n"
514 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1";
515
516 static const CHAR rofc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
517 "i2\ti4\tL64\tS255\tS32\tS72\n"
518 "Media\tDiskId\n"
519 "1\t1\t\ttest1.cab\tDISK1\t\n";
520
521 static const CHAR lus2_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
522 "i2\ti4\tL64\tS255\tS32\tS72\n"
523 "Media\tDiskId\n"
524 "1\t1\t\t#test1.cab\tDISK1\t\n";
525
526 static const CHAR sdp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
527 "s72\tS255\tI2\n"
528 "InstallExecuteSequence\tAction\n"
529 "AllocateRegistrySpace\tNOT Installed\t1550\n"
530 "CostFinalize\t\t1000\n"
531 "CostInitialize\t\t800\n"
532 "FileCost\t\t900\n"
533 "InstallFiles\t\t4000\n"
534 "InstallFinalize\t\t6600\n"
535 "InstallInitialize\t\t1500\n"
536 "InstallValidate\t\t1400\n"
537 "LaunchConditions\t\t100\n"
538 "SetDirProperty\t\t950";
539
540 static const CHAR sdp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
541 "s72\ti2\tS64\tS0\tS255\n"
542 "CustomAction\tAction\n"
543 "SetDirProperty\t51\tMSITESTDIR\t[CommonFilesFolder]msitest\\\t\n";
544
545 static const CHAR cie_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
546 "s72\tS38\ts72\ti2\tS255\tS72\n"
547 "Component\tComponent\n"
548 "maximus\t\tMSITESTDIR\t\t1\tmaximus\n"
549 "augustus\t\tMSITESTDIR\t\t1\taugustus\n"
550 "caesar\t\tMSITESTDIR\t\t1\tcaesar\n"
551 "gaius\t\tMSITESTDIR\t\t1\tgaius\n";
552
553 static const CHAR cie_feature_comp_dat[] = "Feature_\tComponent_\n"
554 "s38\ts72\n"
555 "FeatureComponents\tFeature_\tComponent_\n"
556 "feature\tmaximus\n"
557 "feature\taugustus\n"
558 "feature\tcaesar\n"
559 "feature\tgaius";
560
561 static const CHAR cie_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
562 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
563 "File\tFile\n"
564 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
565 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
566 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12\n"
567 "gaius\tgaius\tgaius\t500\t\t\t8192\t11";
568
569 static const CHAR cie_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
570 "i2\ti4\tL64\tS255\tS32\tS72\n"
571 "Media\tDiskId\n"
572 "1\t1\t\ttest1.cab\tDISK1\t\n"
573 "2\t2\t\ttest2.cab\tDISK2\t\n"
574 "3\t12\t\ttest3.cab\tDISK3\t\n";
575
576 static const CHAR ci_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
577 "s72\tS255\tI2\n"
578 "InstallExecuteSequence\tAction\n"
579 "CostFinalize\t\t1000\n"
580 "CostInitialize\t\t800\n"
581 "FileCost\t\t900\n"
582 "InstallFiles\t\t4000\n"
583 "InstallServices\t\t5000\n"
584 "InstallFinalize\t\t6600\n"
585 "InstallInitialize\t\t1500\n"
586 "RunInstall\t\t1600\n"
587 "InstallValidate\t\t1400\n"
588 "LaunchConditions\t\t100";
589
590 static const CHAR ci_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
591 "s72\ti2\tS64\tS0\tS255\n"
592 "CustomAction\tAction\n"
593 "RunInstall\t87\tmsitest\\concurrent.msi\tMYPROP=[UILevel]\t\n";
594
595 static const CHAR ci_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
596 "s72\tS38\ts72\ti2\tS255\tS72\n"
597 "Component\tComponent\n"
598 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t\tUILevel=5\tmaximus\n";
599
600 static const CHAR ci2_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
601 "s72\tS38\ts72\ti2\tS255\tS72\n"
602 "Component\tComponent\n"
603 "augustus\t\tMSITESTDIR\t\tUILevel=3 AND MYPROP=5\taugustus\n";
604
605 static const CHAR ci2_feature_comp_dat[] = "Feature_\tComponent_\n"
606 "s38\ts72\n"
607 "FeatureComponents\tFeature_\tComponent_\n"
608 "feature\taugustus";
609
610 static const CHAR ci2_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
611 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
612 "File\tFile\n"
613 "augustus\taugustus\taugustus\t500\t\t\t8192\t1";
614
615 static const CHAR spf_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
616 "s72\ti2\tS64\tS0\tS255\n"
617 "CustomAction\tAction\n"
618 "SetFolderProp\t51\tMSITESTDIR\t[ProgramFilesFolder]\\msitest\\added\t\n";
619
620 static const CHAR spf_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
621 "s72\tS255\tI2\n"
622 "InstallExecuteSequence\tAction\n"
623 "CostFinalize\t\t1000\n"
624 "CostInitialize\t\t800\n"
625 "FileCost\t\t900\n"
626 "SetFolderProp\t\t950\n"
627 "InstallFiles\t\t4000\n"
628 "InstallServices\t\t5000\n"
629 "InstallFinalize\t\t6600\n"
630 "InstallInitialize\t\t1500\n"
631 "InstallValidate\t\t1400\n"
632 "LaunchConditions\t\t100";
633
634 static const CHAR spf_install_ui_seq_dat[] = "Action\tCondition\tSequence\n"
635 "s72\tS255\tI2\n"
636 "InstallUISequence\tAction\n"
637 "CostInitialize\t\t800\n"
638 "FileCost\t\t900\n"
639 "CostFinalize\t\t1000\n"
640 "ExecuteAction\t\t1100\n";
641
642 static const CHAR pp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
643 "s72\tS255\tI2\n"
644 "InstallExecuteSequence\tAction\n"
645 "ValidateProductID\t\t700\n"
646 "CostInitialize\t\t800\n"
647 "FileCost\t\t900\n"
648 "CostFinalize\t\t1000\n"
649 "InstallValidate\t\t1400\n"
650 "InstallInitialize\t\t1500\n"
651 "ProcessComponents\tPROCESS_COMPONENTS=1 Or FULL=1\t1600\n"
652 "UnpublishFeatures\tUNPUBLISH_FEATURES=1 Or FULL=1\t1800\n"
653 "RemoveFiles\t\t3500\n"
654 "InstallFiles\t\t4000\n"
655 "RegisterUser\tREGISTER_USER=1 Or FULL=1\t6000\n"
656 "RegisterProduct\tREGISTER_PRODUCT=1 Or FULL=1\t6100\n"
657 "PublishFeatures\tPUBLISH_FEATURES=1 Or FULL=1\t6300\n"
658 "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n"
659 "InstallFinalize\t\t6600";
660
661 static const CHAR ppc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
662 "s72\tS38\ts72\ti2\tS255\tS72\n"
663 "Component\tComponent\n"
664 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t\tUILevel=5\tmaximus\n"
665 "augustus\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\taugustus\n";
666
667 static const CHAR ppc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
668 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
669 "File\tFile\n"
670 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1\n"
671 "augustus\taugustus\taugustus\t500\t\t\t8192\t2";
672
673 static const CHAR ppc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
674 "i2\ti4\tL64\tS255\tS32\tS72\n"
675 "Media\tDiskId\n"
676 "1\t2\t\t\tDISK1\t\n";
677
678 static const CHAR ppc_feature_comp_dat[] = "Feature_\tComponent_\n"
679 "s38\ts72\n"
680 "FeatureComponents\tFeature_\tComponent_\n"
681 "feature\tmaximus\n"
682 "feature\taugustus\n"
683 "montecristo\tmaximus";
684
685 static const CHAR tp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
686 "s72\tS38\ts72\ti2\tS255\tS72\n"
687 "Component\tComponent\n"
688 "augustus\t\tMSITESTDIR\t\tprop=\"val\"\taugustus\n";
689
690 static const CHAR cwd_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
691 "s72\tS38\ts72\ti2\tS255\tS72\n"
692 "Component\tComponent\n"
693 "augustus\t\tMSITESTDIR\t\t\taugustus\n";
694
695 static const CHAR adm_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
696 "s72\tS38\ts72\ti2\tS255\tS72\n"
697 "Component\tComponent\n"
698 "augustus\t\tMSITESTDIR\t\tPOSTADMIN=1\taugustus";
699
700 static const CHAR adm_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
701 "s72\ti2\tS64\tS0\tS255\n"
702 "CustomAction\tAction\n"
703 "SetPOSTADMIN\t51\tPOSTADMIN\t1\t\n";
704
705 static const CHAR adm_admin_exec_seq_dat[] = "Action\tCondition\tSequence\n"
706 "s72\tS255\tI2\n"
707 "AdminExecuteSequence\tAction\n"
708 "CostFinalize\t\t1000\n"
709 "CostInitialize\t\t800\n"
710 "FileCost\t\t900\n"
711 "SetPOSTADMIN\t\t950\n"
712 "InstallFiles\t\t4000\n"
713 "InstallFinalize\t\t6600\n"
714 "InstallInitialize\t\t1500\n"
715 "InstallValidate\t\t1400\n"
716 "LaunchConditions\t\t100";
717
718 static const CHAR amp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
719 "s72\tS38\ts72\ti2\tS255\tS72\n"
720 "Component\tComponent\n"
721 "augustus\t\tMSITESTDIR\t\tMYPROP=2718 and MyProp=42\taugustus\n";
722
723 static const CHAR rem_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
724 "s72\tS38\ts72\ti2\tS255\tS72\n"
725 "Component\tComponent\n"
726 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t\t\thydrogen\n"
727 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\thelium\n"
728 "lithium\t\tMSITESTDIR\t2\t\tlithium\n";
729
730 static const CHAR rem_feature_comp_dat[] = "Feature_\tComponent_\n"
731 "s38\ts72\n"
732 "FeatureComponents\tFeature_\tComponent_\n"
733 "feature\thydrogen\n"
734 "feature\thelium\n"
735 "feature\tlithium";
736
737 static const CHAR rem_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
738 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
739 "File\tFile\n"
740 "hydrogen\thydrogen\thydrogen\t\t\t\t8192\t1\n"
741 "helium\thelium\thelium\t\t\t\t8192\t1\n"
742 "lithium\tlithium\tlithium\t\t\t\t8192\t1";
743
744 static const CHAR rem_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
745 "s72\tS255\tI2\n"
746 "InstallExecuteSequence\tAction\n"
747 "ValidateProductID\t\t700\n"
748 "CostInitialize\t\t800\n"
749 "FileCost\t\t900\n"
750 "CostFinalize\t\t1000\n"
751 "InstallValidate\t\t1400\n"
752 "InstallInitialize\t\t1500\n"
753 "ProcessComponents\t\t1600\n"
754 "UnpublishFeatures\t\t1800\n"
755 "RemoveFiles\t\t3500\n"
756 "InstallFiles\t\t4000\n"
757 "RegisterProduct\t\t6100\n"
758 "PublishFeatures\t\t6300\n"
759 "PublishProduct\t\t6400\n"
760 "InstallFinalize\t\t6600";
761
762 static const CHAR rem_remove_files_dat[] = "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n"
763 "s72\ts72\tS255\ts72\tI2\n"
764 "RemoveFile\tFileKey\n"
765 "furlong\thydrogen\tfurlong\tMSITESTDIR\t1\n"
766 "firkin\thelium\tfirkin\tMSITESTDIR\t1\n"
767 "fortnight\tlithium\tfortnight\tMSITESTDIR\t1\n"
768 "becquerel\thydrogen\tbecquerel\tMSITESTDIR\t2\n"
769 "dioptre\thelium\tdioptre\tMSITESTDIR\t2\n"
770 "attoparsec\tlithium\tattoparsec\tMSITESTDIR\t2\n"
771 "storeys\thydrogen\tstoreys\tMSITESTDIR\t3\n"
772 "block\thelium\tblock\tMSITESTDIR\t3\n"
773 "siriometer\tlithium\tsiriometer\tMSITESTDIR\t3\n"
774 "nanoacre\thydrogen\t\tCABOUTDIR\t3\n";
775
776 static const CHAR mov_move_file_dat[] = "FileKey\tComponent_\tSourceName\tDestName\tSourceFolder\tDestFolder\tOptions\n"
777 "s72\ts72\tS255\tS255\tS72\ts72\ti2\n"
778 "MoveFile\tFileKey\n"
779 "abkhazia\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t\n"
780 "bahamas\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t1\n"
781 "cambodia\taugustus\tcameroon\tcanada\tSourceDir\tMSITESTDIR\t\n"
782 "denmark\taugustus\tdjibouti\tdominica\tSourceDir\tMSITESTDIR\t1\n"
783 "ecuador\taugustus\tegypt\telsalvador\tNotAProp\tMSITESTDIR\t1\n"
784 "fiji\taugustus\tfinland\tfrance\tSourceDir\tNotAProp\t1\n"
785 "gabon\taugustus\tgambia\tgeorgia\tSOURCEFULL\tMSITESTDIR\t1\n"
786 "haiti\taugustus\thonduras\thungary\tSourceDir\tDESTFULL\t1\n"
787 "iceland\taugustus\tindia\tindonesia\tMSITESTDIR\tMSITESTDIR\t1\n"
788 "jamaica\taugustus\tjapan\tjordan\tFILEPATHBAD\tMSITESTDIR\t1\n"
789 "kazakhstan\taugustus\t\tkiribati\tFILEPATHGOOD\tMSITESTDIR\t1\n"
790 "laos\taugustus\tlatvia\tlebanon\tSourceDir\tMSITESTDIR\t1\n"
791 "namibia\taugustus\tnauru\tkiribati\tSourceDir\tMSITESTDIR\t1\n"
792 "pakistan\taugustus\tperu\tsfn|poland\tSourceDir\tMSITESTDIR\t1\n"
793 "wildcard\taugustus\tapp*\twildcard\tSourceDir\tMSITESTDIR\t1\n"
794 "single\taugustus\tf?o\tsingle\tSourceDir\tMSITESTDIR\t1\n"
795 "wildcardnodest\taugustus\tbudd*\t\tSourceDir\tMSITESTDIR\t1\n"
796 "singlenodest\taugustus\tb?r\t\tSourceDir\tMSITESTDIR\t1\n";
797
798 static const CHAR mc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
799 "s72\tS38\ts72\ti2\tS255\tS72\n"
800 "Component\tComponent\n"
801 "maximus\t\tMSITESTDIR\t\t1\tmaximus\n"
802 "augustus\t\tMSITESTDIR\t\t1\taugustus\n"
803 "caesar\t\tMSITESTDIR\t\t1\tcaesar\n"
804 "gaius\t\tMSITESTDIR\t\tGAIUS=1\tgaius\n";
805
806 static const CHAR mc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
807 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
808 "File\tFile\n"
809 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
810 "augustus\taugustus\taugustus\t500\t\t\t\t2\n"
811 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3\n"
812 "gaius\tgaius\tgaius\t500\t\t\t16384\t4";
813
814 static const CHAR mc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
815 "i2\ti4\tL64\tS255\tS32\tS72\n"
816 "Media\tDiskId\n"
817 "1\t1\t\ttest1.cab\tDISK1\t\n"
818 "2\t2\t\ttest2.cab\tDISK2\t\n"
819 "3\t3\t\ttest3.cab\tDISK3\t\n"
820 "4\t4\t\ttest3.cab\tDISK3\t\n";
821
822 static const CHAR mc_file_hash_dat[] = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"
823 "s72\ti2\ti4\ti4\ti4\ti4\n"
824 "MsiFileHash\tFile_\n"
825 "caesar\t\t850433704\t-241429251\t675791761\t-1221108824";
826
827 static const CHAR df_directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n"
828 "s72\tS72\tl255\n"
829 "Directory\tDirectory\n"
830 "THIS\tMSITESTDIR\tthis\n"
831 "DOESNOT\tTHIS\tdoesnot\n"
832 "NONEXISTENT\tDOESNOT\texist\n"
833 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
834 "ProgramFilesFolder\tTARGETDIR\t.\n"
835 "TARGETDIR\t\tSourceDir";
836
837 static const CHAR df_duplicate_file_dat[] = "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n"
838 "s72\ts72\ts72\tS255\tS72\n"
839 "DuplicateFile\tFileKey\n"
840 "maximus\tmaximus\tmaximus\taugustus\t\n"
841 "caesar\tmaximus\tmaximus\t\tNONEXISTENT\n"
842 "augustus\tnosuchcomponent\tmaximus\t\tMSITESTDIR\n";
843
844 static const CHAR wrv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
845 "s72\tS38\ts72\ti2\tS255\tS72\n"
846 "Component\tComponent\n"
847 "augustus\t\tMSITESTDIR\t\t\taugustus\n";
848
849 static const CHAR wrv_registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
850 "s72\ti2\tl255\tL255\tL0\ts72\n"
851 "Registry\tRegistry\n"
852 "regdata\t2\tSOFTWARE\\Wine\\msitest\tValue\t[~]one[~]two[~]three\taugustus";
853
854 static const CHAR ca51_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
855 "s72\tS38\ts72\ti2\tS255\tS72\n"
856 "Component\tComponent\n"
857 "augustus\t\tMSITESTDIR\t\tMYPROP=42\taugustus\n";
858
859 static const CHAR ca51_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
860 "s72\tS255\tI2\n"
861 "InstallExecuteSequence\tAction\n"
862 "ValidateProductID\t\t700\n"
863 "GoodSetProperty\t\t725\n"
864 "BadSetProperty\t\t750\n"
865 "CostInitialize\t\t800\n"
866 "ResolveSource\t\t810\n"
867 "FileCost\t\t900\n"
868 "SetSourceDir\tSRCDIR\t910\n"
869 "CostFinalize\t\t1000\n"
870 "InstallValidate\t\t1400\n"
871 "InstallInitialize\t\t1500\n"
872 "InstallFiles\t\t4000\n"
873 "InstallFinalize\t\t6600";
874
875 static const CHAR ca51_custom_action_dat[] = "Action\tType\tSource\tTarget\n"
876 "s72\ti2\tS64\tS0\n"
877 "CustomAction\tAction\n"
878 "GoodSetProperty\t51\tMYPROP\t42\n"
879 "BadSetProperty\t51\t\tMYPROP\n"
880 "SetSourceDir\t51\tSourceDir\t[SRCDIR]\n";
881
882 static const CHAR is_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
883 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
884 "Feature\tFeature\n"
885 "one\t\t\t\t2\t1\t\t\n" /* favorLocal */
886 "two\t\t\t\t2\t1\t\t1\n" /* favorSource */
887 "three\t\t\t\t2\t1\t\t4\n" /* favorAdvertise */
888 "four\t\t\t\t2\t\t\t"; /* disabled */
889
890 static const CHAR is_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
891 "s72\tS38\ts72\ti2\tS255\tS72\n"
892 "Component\tComponent\n"
893 "alpha\t\tMSITESTDIR\t\t\talpha_file\n" /* favorLocal:Local */
894 "beta\t\tMSITESTDIR\t1\t\tbeta_file\n" /* favorLocal:Source */
895 "gamma\t\tMSITESTDIR\t2\t\tgamma_file\n" /* favorLocal:Optional */
896 "theta\t\tMSITESTDIR\t\t\ttheta_file\n" /* favorSource:Local */
897 "delta\t\tMSITESTDIR\t1\t\tdelta_file\n" /* favorSource:Source */
898 "epsilon\t\tMSITESTDIR\t2\t\tepsilon_file\n" /* favorSource:Optional */
899 "zeta\t\tMSITESTDIR\t\t\tzeta_file\n" /* favorAdvertise:Local */
900 "iota\t\tMSITESTDIR\t1\t\tiota_file\n" /* favorAdvertise:Source */
901 "eta\t\tMSITESTDIR\t2\t\teta_file\n" /* favorAdvertise:Optional */
902 "kappa\t\tMSITESTDIR\t\t\tkappa_file\n" /* disabled:Local */
903 "lambda\t\tMSITESTDIR\t1\t\tlambda_file\n" /* disabled:Source */
904 "mu\t\tMSITESTDIR\t2\t\tmu_file\n"; /* disabled:Optional */
905
906 static const CHAR is_feature_comp_dat[] = "Feature_\tComponent_\n"
907 "s38\ts72\n"
908 "FeatureComponents\tFeature_\tComponent_\n"
909 "one\talpha\n"
910 "one\tbeta\n"
911 "one\tgamma\n"
912 "two\ttheta\n"
913 "two\tdelta\n"
914 "two\tepsilon\n"
915 "three\tzeta\n"
916 "three\tiota\n"
917 "three\teta\n"
918 "four\tkappa\n"
919 "four\tlambda\n"
920 "four\tmu";
921
922 static const CHAR is_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
923 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
924 "File\tFile\n"
925 "alpha_file\talpha\talpha\t500\t\t\t8192\t1\n"
926 "beta_file\tbeta\tbeta\t500\t\t\t8291\t2\n"
927 "gamma_file\tgamma\tgamma\t500\t\t\t8192\t3\n"
928 "theta_file\ttheta\ttheta\t500\t\t\t8192\t4\n"
929 "delta_file\tdelta\tdelta\t500\t\t\t8192\t5\n"
930 "epsilon_file\tepsilon\tepsilon\t500\t\t\t8192\t6\n"
931 "zeta_file\tzeta\tzeta\t500\t\t\t8192\t7\n"
932 "iota_file\tiota\tiota\t500\t\t\t8192\t8\n"
933 "eta_file\teta\teta\t500\t\t\t8192\t9\n"
934 "kappa_file\tkappa\tkappa\t500\t\t\t8192\t10\n"
935 "lambda_file\tlambda\tlambda\t500\t\t\t8192\t11\n"
936 "mu_file\tmu\tmu\t500\t\t\t8192\t12";
937
938 static const CHAR is_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
939 "i2\ti4\tL64\tS255\tS32\tS72\n"
940 "Media\tDiskId\n"
941 "1\t12\t\t\tDISK1\t\n";
942
943 static const CHAR sp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
944 "s72\tS38\ts72\ti2\tS255\tS72\n"
945 "Component\tComponent\n"
946 "augustus\t\tTWODIR\t\t\taugustus\n";
947
948 static const CHAR sp_directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n"
949 "s72\tS72\tl255\n"
950 "Directory\tDirectory\n"
951 "TARGETDIR\t\tSourceDir\n"
952 "ProgramFilesFolder\tTARGETDIR\t.\n"
953 "MSITESTDIR\tProgramFilesFolder\tmsitest:.\n"
954 "ONEDIR\tMSITESTDIR\t.:shortone|longone\n"
955 "TWODIR\tONEDIR\t.:shorttwo|longtwo";
956
957 static const CHAR mcp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
958 "s72\tS38\ts72\ti2\tS255\tS72\n"
959 "Component\tComponent\n"
960 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t2\t\thydrogen\n"
961 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t2\t\thelium\n"
962 "lithium\t{4AF28FFC-71C7-4307-BDE4-B77C5338F56F}\tMSITESTDIR\t2\tPROPVAR=42\tlithium\n";
963
964 static const CHAR mcp_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
965 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
966 "Feature\tFeature\n"
967 "hydroxyl\t\thydroxyl\thydroxyl\t2\t1\tTARGETDIR\t\n"
968 "heliox\t\theliox\theliox\t2\t5\tTARGETDIR\t\n"
969 "lithia\t\tlithia\tlithia\t2\t10\tTARGETDIR\t";
970
971 static const CHAR mcp_feature_comp_dat[] = "Feature_\tComponent_\n"
972 "s38\ts72\n"
973 "FeatureComponents\tFeature_\tComponent_\n"
974 "hydroxyl\thydrogen\n"
975 "heliox\thelium\n"
976 "lithia\tlithium";
977
978 static const CHAR mcomp_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
979 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
980 "File\tFile\n"
981 "hydrogen\thydrogen\thydrogen\t\t\t\t8192\t1\n"
982 "helium\thelium\thelium\t\t\t\t8192\t1\n"
983 "lithium\tlithium\tlithium\t\t\t\t8192\t1\n"
984 "beryllium\tmissingcomp\tberyllium\t\t\t\t8192\t1";
985
986 static const CHAR ai_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
987 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
988 "File\tFile\n"
989 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
990 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
991 "one.txt\tOne\tone.txt\t1000\t\t\t16384\t1\n"
992 "three.txt\tThree\tthree.txt\t1000\t\t\t16384\t3\n"
993 "two.txt\tTwo\ttwo.txt\t1000\t\t\t16384\t2\n"
994 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
995 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1";
996
997 static const CHAR ip_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
998 "s72\tS255\tI2\n"
999 "InstallExecuteSequence\tAction\n"
1000 "CostFinalize\t\t1000\n"
1001 "ValidateProductID\t\t700\n"
1002 "CostInitialize\t\t800\n"
1003 "FileCost\t\t900\n"
1004 "RemoveFiles\t\t3500\n"
1005 "InstallFiles\t\t4000\n"
1006 "RegisterUser\t\t6000\n"
1007 "RegisterProduct\t\t6100\n"
1008 "PublishFeatures\t\t6300\n"
1009 "PublishProduct\t\t6400\n"
1010 "InstallFinalize\t\t6600\n"
1011 "InstallInitialize\t\t1500\n"
1012 "ProcessComponents\t\t1600\n"
1013 "UnpublishFeatures\t\t1800\n"
1014 "InstallValidate\t\t1400\n"
1015 "LaunchConditions\t\t100\n"
1016 "TestInstalledProp\tInstalled AND NOT REMOVE\t950\n";
1017
1018 static const CHAR ip_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
1019 "s72\ti2\tS64\tS0\tS255\n"
1020 "CustomAction\tAction\n"
1021 "TestInstalledProp\t19\t\tTest failed\t\n";
1022
1023 static const CHAR aup_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1024 "s72\tS255\tI2\n"
1025 "InstallExecuteSequence\tAction\n"
1026 "CostFinalize\t\t1000\n"
1027 "ValidateProductID\t\t700\n"
1028 "CostInitialize\t\t800\n"
1029 "FileCost\t\t900\n"
1030 "RemoveFiles\t\t3500\n"
1031 "InstallFiles\t\t4000\n"
1032 "RegisterUser\t\t6000\n"
1033 "RegisterProduct\t\t6100\n"
1034 "PublishFeatures\t\t6300\n"
1035 "PublishProduct\t\t6400\n"
1036 "InstallFinalize\t\t6600\n"
1037 "InstallInitialize\t\t1500\n"
1038 "ProcessComponents\t\t1600\n"
1039 "UnpublishFeatures\t\t1800\n"
1040 "InstallValidate\t\t1400\n"
1041 "LaunchConditions\t\t100\n"
1042 "TestAllUsersProp\tALLUSERS AND NOT REMOVE\t50\n";
1043
1044 static const CHAR aup2_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1045 "s72\tS255\tI2\n"
1046 "InstallExecuteSequence\tAction\n"
1047 "CostFinalize\t\t1000\n"
1048 "ValidateProductID\t\t700\n"
1049 "CostInitialize\t\t800\n"
1050 "FileCost\t\t900\n"
1051 "RemoveFiles\t\t3500\n"
1052 "InstallFiles\t\t4000\n"
1053 "RegisterUser\t\t6000\n"
1054 "RegisterProduct\t\t6100\n"
1055 "PublishFeatures\t\t6300\n"
1056 "PublishProduct\t\t6400\n"
1057 "InstallFinalize\t\t6600\n"
1058 "InstallInitialize\t\t1500\n"
1059 "ProcessComponents\t\t1600\n"
1060 "UnpublishFeatures\t\t1800\n"
1061 "InstallValidate\t\t1400\n"
1062 "LaunchConditions\t\t100\n"
1063 "TestAllUsersProp\tALLUSERS=2 AND NOT REMOVE\t50\n";
1064
1065 static const CHAR aup3_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1066 "s72\tS255\tI2\n"
1067 "InstallExecuteSequence\tAction\n"
1068 "CostFinalize\t\t1000\n"
1069 "ValidateProductID\t\t700\n"
1070 "CostInitialize\t\t800\n"
1071 "FileCost\t\t900\n"
1072 "RemoveFiles\t\t3500\n"
1073 "InstallFiles\t\t4000\n"
1074 "RegisterUser\t\t6000\n"
1075 "RegisterProduct\t\t6100\n"
1076 "PublishFeatures\t\t6300\n"
1077 "PublishProduct\t\t6400\n"
1078 "InstallFinalize\t\t6600\n"
1079 "InstallInitialize\t\t1500\n"
1080 "ProcessComponents\t\t1600\n"
1081 "UnpublishFeatures\t\t1800\n"
1082 "InstallValidate\t\t1400\n"
1083 "LaunchConditions\t\t100\n"
1084 "TestAllUsersProp\tALLUSERS=1 AND NOT REMOVE\t50\n";
1085
1086 static const CHAR aup_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
1087 "s72\ti2\tS64\tS0\tS255\n"
1088 "CustomAction\tAction\n"
1089 "TestAllUsersProp\t19\t\tTest failed\t\n";
1090
1091 static const CHAR cf_create_folders_dat[] = "Directory_\tComponent_\n"
1092 "s72\ts72\n"
1093 "CreateFolder\tDirectory_\tComponent_\n"
1094 "FIRSTDIR\tOne\n";
1095
1096 static const CHAR cf_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1097 "s72\tS255\tI2\n"
1098 "InstallExecuteSequence\tAction\n"
1099 "CostFinalize\t\t1000\n"
1100 "ValidateProductID\t\t700\n"
1101 "CostInitialize\t\t800\n"
1102 "FileCost\t\t900\n"
1103 "RemoveFiles\t\t3500\n"
1104 "CreateFolders\t\t3700\n"
1105 "InstallExecute\t\t3800\n"
1106 "TestCreateFolders\t\t3900\n"
1107 "InstallFiles\t\t4000\n"
1108 "RegisterUser\t\t6000\n"
1109 "RegisterProduct\t\t6100\n"
1110 "PublishFeatures\t\t6300\n"
1111 "PublishProduct\t\t6400\n"
1112 "InstallFinalize\t\t6600\n"
1113 "InstallInitialize\t\t1500\n"
1114 "ProcessComponents\t\t1600\n"
1115 "UnpublishFeatures\t\t1800\n"
1116 "InstallValidate\t\t1400\n"
1117 "LaunchConditions\t\t100\n";
1118
1119 static const CHAR cf_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
1120 "s72\ti2\tS64\tS0\tS255\n"
1121 "CustomAction\tAction\n"
1122 "TestCreateFolders\t19\t\tHalts installation\t\n";
1123
1124 static const CHAR rf_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1125 "s72\tS255\tI2\n"
1126 "InstallExecuteSequence\tAction\n"
1127 "CostFinalize\t\t1000\n"
1128 "ValidateProductID\t\t700\n"
1129 "CostInitialize\t\t800\n"
1130 "FileCost\t\t900\n"
1131 "RemoveFiles\t\t3500\n"
1132 "CreateFolders\t\t3600\n"
1133 "RemoveFolders\t\t3700\n"
1134 "InstallExecute\t\t3800\n"
1135 "TestCreateFolders\t\t3900\n"
1136 "InstallFiles\t\t4000\n"
1137 "RegisterUser\t\t6000\n"
1138 "RegisterProduct\t\t6100\n"
1139 "PublishFeatures\t\t6300\n"
1140 "PublishProduct\t\t6400\n"
1141 "InstallFinalize\t\t6600\n"
1142 "InstallInitialize\t\t1500\n"
1143 "ProcessComponents\t\t1600\n"
1144 "UnpublishFeatures\t\t1800\n"
1145 "InstallValidate\t\t1400\n"
1146 "LaunchConditions\t\t100\n";
1147
1148
1149 static const CHAR sr_selfreg_dat[] = "File_\tCost\n"
1150 "s72\tI2\n"
1151 "SelfReg\tFile_\n"
1152 "one.txt\t1\n";
1153
1154 static const CHAR sr_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1155 "s72\tS255\tI2\n"
1156 "InstallExecuteSequence\tAction\n"
1157 "CostFinalize\t\t1000\n"
1158 "CostInitialize\t\t800\n"
1159 "FileCost\t\t900\n"
1160 "ResolveSource\t\t950\n"
1161 "MoveFiles\t\t1700\n"
1162 "SelfUnregModules\t\t3900\n"
1163 "InstallFiles\t\t4000\n"
1164 "DuplicateFiles\t\t4500\n"
1165 "WriteEnvironmentStrings\t\t4550\n"
1166 "CreateShortcuts\t\t4600\n"
1167 "InstallFinalize\t\t6600\n"
1168 "InstallInitialize\t\t1500\n"
1169 "InstallValidate\t\t1400\n"
1170 "LaunchConditions\t\t100\n";
1171
1172 static const CHAR font_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
1173 "i2\ti4\tL64\tS255\tS32\tS72\n"
1174 "Media\tDiskId\n"
1175 "1\t3\t\t\tDISK1\t\n";
1176
1177 static const CHAR font_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1178 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1179 "File\tFile\n"
1180 "font.ttf\tfonts\tfont.ttf\t1000\t\t\t8192\t1\n";
1181
1182 static const CHAR font_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1183 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1184 "Feature\tFeature\n"
1185 "fonts\t\t\tfont feature\t1\t2\tMSITESTDIR\t\n";
1186
1187 static const CHAR font_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1188 "s72\tS38\ts72\ti2\tS255\tS72\n"
1189 "Component\tComponent\n"
1190 "fonts\t{F5920ED0-1183-4B8F-9330-86CE56557C05}\tMSITESTDIR\t\t\tfont.ttf\n";
1191
1192 static const CHAR font_feature_comp_dat[] = "Feature_\tComponent_\n"
1193 "s38\ts72\n"
1194 "FeatureComponents\tFeature_\tComponent_\n"
1195 "fonts\tfonts\n";
1196
1197 static const CHAR font_dat[] = "File_\tFontTitle\n"
1198 "s72\tS128\n"
1199 "Font\tFile_\n"
1200 "font.ttf\tmsi test font\n";
1201
1202 static const CHAR font_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1203 "s72\tS255\tI2\n"
1204 "InstallExecuteSequence\tAction\n"
1205 "ValidateProductID\t\t700\n"
1206 "CostInitialize\t\t800\n"
1207 "FileCost\t\t900\n"
1208 "CostFinalize\t\t1000\n"
1209 "InstallValidate\t\t1400\n"
1210 "InstallInitialize\t\t1500\n"
1211 "ProcessComponents\t\t1600\n"
1212 "UnpublishFeatures\t\t1800\n"
1213 "RemoveFiles\t\t3500\n"
1214 "InstallFiles\t\t4000\n"
1215 "RegisterFonts\t\t4100\n"
1216 "UnregisterFonts\t\t4200\n"
1217 "RegisterUser\t\t6000\n"
1218 "RegisterProduct\t\t6100\n"
1219 "PublishFeatures\t\t6300\n"
1220 "PublishProduct\t\t6400\n"
1221 "InstallFinalize\t\t6600";
1222
1223 static const CHAR vp_property_dat[] = "Property\tValue\n"
1224 "s72\tl0\n"
1225 "Property\tProperty\n"
1226 "HASUIRUN\t\n"
1227 "INSTALLLEVEL\t3\n"
1228 "InstallMode\tTypical\n"
1229 "Manufacturer\tWine\n"
1230 "PIDTemplate\t###-#######\n"
1231 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
1232 "ProductLanguage\t1033\n"
1233 "ProductName\tMSITEST\n"
1234 "ProductVersion\t1.1.1\n"
1235 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n";
1236
1237 static const CHAR vp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
1238 "s72\ti2\tS64\tS0\tS255\n"
1239 "CustomAction\tAction\n"
1240 "SetProductID1\t51\tProductID\t1\t\n"
1241 "SetProductID2\t51\tProductID\t2\t\n"
1242 "TestProductID1\t19\t\t\tHalts installation\n"
1243 "TestProductID2\t19\t\t\tHalts installation\n";
1244
1245 static const CHAR vp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1246 "s72\tS255\tI2\n"
1247 "InstallExecuteSequence\tAction\n"
1248 "LaunchConditions\t\t100\n"
1249 "CostInitialize\t\t800\n"
1250 "FileCost\t\t900\n"
1251 "CostFinalize\t\t1000\n"
1252 "InstallValidate\t\t1400\n"
1253 "InstallInitialize\t\t1500\n"
1254 "SetProductID1\tSET_PRODUCT_ID=1\t3000\n"
1255 "SetProductID2\tSET_PRODUCT_ID=2\t3100\n"
1256 "ValidateProductID\t\t3200\n"
1257 "InstallExecute\t\t3300\n"
1258 "TestProductID1\tProductID=1\t3400\n"
1259 "TestProductID2\tProductID=\"123-1234567\"\t3500\n"
1260 "InstallFiles\t\t4000\n"
1261 "InstallFinalize\t\t6000\n";
1262
1263 static const CHAR odbc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1264 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1265 "File\tFile\n"
1266 "ODBCdriver.dll\todbc\tODBCdriver.dll\t1000\t\t\t8192\t1\n"
1267 "ODBCdriver2.dll\todbc\tODBCdriver2.dll\t1000\t\t\t8192\t2\n"
1268 "ODBCtranslator.dll\todbc\tODBCtranslator.dll\t1000\t\t\t8192\t3\n"
1269 "ODBCtranslator2.dll\todbc\tODBCtranslator2.dll\t1000\t\t\t8192\t4\n"
1270 "ODBCsetup.dll\todbc\tODBCsetup.dll\t1000\t\t\t8192\t5\n";
1271
1272 static const CHAR odbc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1273 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1274 "Feature\tFeature\n"
1275 "odbc\t\t\todbc feature\t1\t2\tMSITESTDIR\t\n";
1276
1277 static const CHAR odbc_feature_comp_dat[] = "Feature_\tComponent_\n"
1278 "s38\ts72\n"
1279 "FeatureComponents\tFeature_\tComponent_\n"
1280 "odbc\todbc\n";
1281
1282 static const CHAR odbc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1283 "s72\tS38\ts72\ti2\tS255\tS72\n"
1284 "Component\tComponent\n"
1285 "odbc\t{B6F3E4AE-35D1-4B72-9044-989F03E20A43}\tMSITESTDIR\t\t\tODBCdriver.dll\n";
1286
1287 static const CHAR odbc_driver_dat[] = "Driver\tComponent_\tDescription\tFile_\tFile_Setup\n"
1288 "s72\ts72\ts255\ts72\tS72\n"
1289 "ODBCDriver\tDriver\n"
1290 "ODBC test driver\todbc\tODBC test driver\tODBCdriver.dll\t\n"
1291 "ODBC test driver2\todbc\tODBC test driver2\tODBCdriver2.dll\tODBCsetup.dll\n";
1292
1293 static const CHAR odbc_translator_dat[] = "Translator\tComponent_\tDescription\tFile_\tFile_Setup\n"
1294 "s72\ts72\ts255\ts72\tS72\n"
1295 "ODBCTranslator\tTranslator\n"
1296 "ODBC test translator\todbc\tODBC test translator\tODBCtranslator.dll\t\n"
1297 "ODBC test translator2\todbc\tODBC test translator2\tODBCtranslator2.dll\tODBCsetup.dll\n";
1298
1299 static const CHAR odbc_datasource_dat[] = "DataSource\tComponent_\tDescription\tDriverDescription\tRegistration\n"
1300 "s72\ts72\ts255\ts255\ti2\n"
1301 "ODBCDataSource\tDataSource\n"
1302 "ODBC data source\todbc\tODBC data source\tODBC driver\t\n";
1303
1304 static const CHAR odbc_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1305 "s72\tS255\tI2\n"
1306 "InstallExecuteSequence\tAction\n"
1307 "LaunchConditions\t\t100\n"
1308 "CostInitialize\t\t800\n"
1309 "FileCost\t\t900\n"
1310 "CostFinalize\t\t1000\n"
1311 "InstallValidate\t\t1400\n"
1312 "InstallInitialize\t\t1500\n"
1313 "InstallODBC\t\t3000\n"
1314 "RemoveODBC\t\t3100\n"
1315 "InstallFiles\t\t4000\n"
1316 "InstallFinalize\t\t6000\n";
1317
1318 static const CHAR odbc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
1319 "i2\ti4\tL64\tS255\tS32\tS72\n"
1320 "Media\tDiskId\n"
1321 "1\t5\t\t\tDISK1\t\n";
1322
1323 static const CHAR tl_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1324 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1325 "File\tFile\n"
1326 "typelib.dll\ttypelib\ttypelib.dll\t1000\t\t\t8192\t1\n";
1327
1328 static const CHAR tl_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1329 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1330 "Feature\tFeature\n"
1331 "typelib\t\t\ttypelib feature\t1\t2\tMSITESTDIR\t\n";
1332
1333 static const CHAR tl_feature_comp_dat[] = "Feature_\tComponent_\n"
1334 "s38\ts72\n"
1335 "FeatureComponents\tFeature_\tComponent_\n"
1336 "typelib\ttypelib\n";
1337
1338 static const CHAR tl_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1339 "s72\tS38\ts72\ti2\tS255\tS72\n"
1340 "Component\tComponent\n"
1341 "typelib\t{BB4C26FD-89D8-4E49-AF1C-DB4DCB5BF1B0}\tMSITESTDIR\t\t\ttypelib.dll\n";
1342
1343 static const CHAR tl_typelib_dat[] = "LibID\tLanguage\tComponent_\tVersion\tDescription\tDirectory_\tFeature_\tCost\n"
1344 "s38\ti2\ts72\tI4\tL128\tS72\ts38\tI4\n"
1345 "TypeLib\tLibID\tLanguage\tComponent_\n"
1346 "{EAC5166A-9734-4D91-878F-1DD02304C66C}\t\ttypelib\t1793\t\tMSITESTDIR\ttypelib\t\n";
1347
1348 static const CHAR tl_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1349 "s72\tS255\tI2\n"
1350 "InstallExecuteSequence\tAction\n"
1351 "LaunchConditions\t\t100\n"
1352 "CostInitialize\t\t800\n"
1353 "FileCost\t\t900\n"
1354 "CostFinalize\t\t1000\n"
1355 "InstallValidate\t\t1400\n"
1356 "InstallInitialize\t\t1500\n"
1357 "ProcessComponents\t\t1600\n"
1358 "RemoveFiles\t\t1700\n"
1359 "InstallFiles\t\t2000\n"
1360 "RegisterTypeLibraries\tREGISTER_TYPELIB=1\t3000\n"
1361 "UnregisterTypeLibraries\t\t3100\n"
1362 "RegisterProduct\t\t5100\n"
1363 "PublishFeatures\t\t5200\n"
1364 "PublishProduct\t\t5300\n"
1365 "InstallFinalize\t\t6000\n";
1366
1367 static const CHAR crs_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1368 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1369 "File\tFile\n"
1370 "target.txt\tshortcut\ttarget.txt\t1000\t\t\t8192\t1\n";
1371
1372 static const CHAR crs_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1373 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1374 "Feature\tFeature\n"
1375 "shortcut\t\t\tshortcut feature\t1\t2\tMSITESTDIR\t\n";
1376
1377 static const CHAR crs_feature_comp_dat[] = "Feature_\tComponent_\n"
1378 "s38\ts72\n"
1379 "FeatureComponents\tFeature_\tComponent_\n"
1380 "shortcut\tshortcut\n";
1381
1382 static const CHAR crs_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1383 "s72\tS38\ts72\ti2\tS255\tS72\n"
1384 "Component\tComponent\n"
1385 "shortcut\t{5D20E3C6-7206-498F-AC28-87AF2F9AD4CC}\tMSITESTDIR\t\t\ttarget.txt\n";
1386
1387 static const CHAR crs_shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"
1388 "s72\ts72\tl128\ts72\ts72\tL255\tL255\tI2\tS72\tI2\tI2\tS72\n"
1389 "Shortcut\tShortcut\n"
1390 "shortcut\tMSITESTDIR\tshortcut\tshortcut\t[MSITESTDIR]target.txt\t\t\t\t\t\t\t\n";
1391
1392 static const CHAR crs_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1393 "s72\tS255\tI2\n"
1394 "InstallExecuteSequence\tAction\n"
1395 "LaunchConditions\t\t100\n"
1396 "CostInitialize\t\t800\n"
1397 "FileCost\t\t900\n"
1398 "CostFinalize\t\t1000\n"
1399 "InstallValidate\t\t1400\n"
1400 "InstallInitialize\t\t1500\n"
1401 "ProcessComponents\t\t1600\n"
1402 "RemoveFiles\t\t1700\n"
1403 "InstallFiles\t\t2000\n"
1404 "RemoveShortcuts\t\t3000\n"
1405 "CreateShortcuts\t\t3100\n"
1406 "RegisterProduct\t\t5000\n"
1407 "PublishFeatures\t\t5100\n"
1408 "PublishProduct\t\t5200\n"
1409 "InstallFinalize\t\t6000\n";
1410
1411 static const CHAR pub_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1412 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1413 "File\tFile\n"
1414 "english.txt\tpublish\tenglish.txt\t1000\t\t\t8192\t1\n";
1415
1416 static const CHAR pub_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1417 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1418 "Feature\tFeature\n"
1419 "publish\t\t\tpublish feature\t1\t2\tMSITESTDIR\t\n";
1420
1421 static const CHAR pub_feature_comp_dat[] = "Feature_\tComponent_\n"
1422 "s38\ts72\n"
1423 "FeatureComponents\tFeature_\tComponent_\n"
1424 "publish\tpublish\n";
1425
1426 static const CHAR pub_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1427 "s72\tS38\ts72\ti2\tS255\tS72\n"
1428 "Component\tComponent\n"
1429 "publish\t{B4EA0ACF-6238-426E-9C6D-7869F0F9C768}\tMSITESTDIR\t\t\tenglish.txt\n";
1430
1431 static const CHAR pub_publish_component_dat[] = "ComponentId\tQualifier\tComponent_\tAppData\tFeature_\n"
1432 "s38\ts255\ts72\tL255\ts38\n"
1433 "PublishComponent\tComponentId\tQualifier\tComponent_\n"
1434 "{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}\tenglish.txt\tpublish\t\tpublish\n";
1435
1436 static const CHAR pub_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1437 "s72\tS255\tI2\n"
1438 "InstallExecuteSequence\tAction\n"
1439 "LaunchConditions\t\t100\n"
1440 "CostInitialize\t\t800\n"
1441 "FileCost\t\t900\n"
1442 "CostFinalize\t\t1000\n"
1443 "InstallValidate\t\t1400\n"
1444 "InstallInitialize\t\t1500\n"
1445 "ProcessComponents\t\t1600\n"
1446 "RemoveFiles\t\t1700\n"
1447 "InstallFiles\t\t2000\n"
1448 "PublishComponents\t\t3000\n"
1449 "UnpublishComponents\t\t3100\n"
1450 "RegisterProduct\t\t5000\n"
1451 "PublishFeatures\t\t5100\n"
1452 "PublishProduct\t\t5200\n"
1453 "InstallFinalize\t\t6000\n";
1454
1455 static const CHAR rd_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1456 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1457 "File\tFile\n"
1458 "original.txt\tduplicate\toriginal.txt\t1000\t\t\t8192\t1\n"
1459 "original2.txt\tduplicate\toriginal2.txt\t1000\t\t\t8192\t2\n"
1460 "original3.txt\tduplicate2\toriginal3.txt\t1000\t\t\t8192\t3\n";
1461
1462 static const CHAR rd_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1463 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1464 "Feature\tFeature\n"
1465 "duplicate\t\t\tduplicate feature\t1\t2\tMSITESTDIR\t\n";
1466
1467 static const CHAR rd_feature_comp_dat[] = "Feature_\tComponent_\n"
1468 "s38\ts72\n"
1469 "FeatureComponents\tFeature_\tComponent_\n"
1470 "duplicate\tduplicate\n";
1471
1472 static const CHAR rd_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1473 "s72\tS38\ts72\ti2\tS255\tS72\n"
1474 "Component\tComponent\n"
1475 "duplicate\t{EB45D06A-ADFE-44E3-8D41-B7DE150E41AD}\tMSITESTDIR\t\t\toriginal.txt\n"
1476 "duplicate2\t{B8BA60E0-B2E9-488E-9D0E-E60F25F04F97}\tMSITESTDIR\t\tDUPLICATE2=1\toriginal3.txt\n";
1477
1478 static const CHAR rd_duplicate_file_dat[] = "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n"
1479 "s72\ts72\ts72\tS255\tS72\n"
1480 "DuplicateFile\tFileKey\n"
1481 "duplicate\tduplicate\toriginal.txt\tduplicate.txt\t\n"
1482 "duplicate2\tduplicate\toriginal2.txt\t\tMSITESTDIR\n"
1483 "duplicate3\tduplicate2\toriginal3.txt\tduplicate2.txt\t\n";
1484
1485 static const CHAR rd_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1486 "s72\tS255\tI2\n"
1487 "InstallExecuteSequence\tAction\n"
1488 "LaunchConditions\t\t100\n"
1489 "CostInitialize\t\t800\n"
1490 "FileCost\t\t900\n"
1491 "CostFinalize\t\t1000\n"
1492 "InstallValidate\t\t1400\n"
1493 "InstallInitialize\t\t1500\n"
1494 "ProcessComponents\t\t1600\n"
1495 "RemoveDuplicateFiles\t\t1900\n"
1496 "InstallFiles\t\t2000\n"
1497 "DuplicateFiles\t\t2100\n"
1498 "RegisterProduct\t\t5000\n"
1499 "PublishFeatures\t\t5100\n"
1500 "PublishProduct\t\t5200\n"
1501 "InstallFinalize\t\t6000\n";
1502
1503 static const CHAR rrv_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1504 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1505 "File\tFile\n"
1506 "registry.txt\tregistry\tregistry.txt\t1000\t\t\t8192\t1\n";
1507
1508 static const CHAR rrv_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1509 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1510 "Feature\tFeature\n"
1511 "registry\t\t\tregistry feature\t1\t2\tMSITESTDIR\t\n";
1512
1513 static const CHAR rrv_feature_comp_dat[] = "Feature_\tComponent_\n"
1514 "s38\ts72\n"
1515 "FeatureComponents\tFeature_\tComponent_\n"
1516 "registry\tregistry\n";
1517
1518 static const CHAR rrv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1519 "s72\tS38\ts72\ti2\tS255\tS72\n"
1520 "Component\tComponent\n"
1521 "registry\t{DA97585B-962D-45EB-AD32-DA15E60CA9EE}\tMSITESTDIR\t\t\tregistry.txt\n";
1522
1523 static const CHAR rrv_registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
1524 "s72\ti2\tl255\tL255\tL0\ts72\n"
1525 "Registry\tRegistry\n"
1526 "reg1\t2\tSOFTWARE\\Wine\\keyA\t\tA\tregistry\n"
1527 "reg2\t2\tSOFTWARE\\Wine\\keyA\tvalueA\tA\tregistry\n"
1528 "reg3\t2\tSOFTWARE\\Wine\\key1\t-\t\tregistry\n";
1529
1530 static const CHAR rrv_remove_registry_dat[] = "RemoveRegistry\tRoot\tKey\tName\tComponent_\n"
1531 "s72\ti2\tl255\tL255\ts72\n"
1532 "RemoveRegistry\tRemoveRegistry\n"
1533 "reg1\t2\tSOFTWARE\\Wine\\keyB\t\tregistry\n"
1534 "reg2\t2\tSOFTWARE\\Wine\\keyB\tValueB\tregistry\n"
1535 "reg3\t2\tSOFTWARE\\Wine\\key2\t-\tregistry\n";
1536
1537 static const CHAR rrv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1538 "s72\tS255\tI2\n"
1539 "InstallExecuteSequence\tAction\n"
1540 "LaunchConditions\t\t100\n"
1541 "CostInitialize\t\t800\n"
1542 "FileCost\t\t900\n"
1543 "CostFinalize\t\t1000\n"
1544 "InstallValidate\t\t1400\n"
1545 "InstallInitialize\t\t1500\n"
1546 "ProcessComponents\t\t1600\n"
1547 "RemoveFiles\t\t1700\n"
1548 "InstallFiles\t\t2000\n"
1549 "RemoveRegistryValues\t\t3000\n"
1550 "RegisterProduct\t\t5000\n"
1551 "PublishFeatures\t\t5100\n"
1552 "PublishProduct\t\t5200\n"
1553 "InstallFinalize\t\t6000\n";
1554
1555 static const CHAR frp_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1556 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1557 "File\tFile\n"
1558 "product.txt\tproduct\tproduct.txt\t1000\t\t\t8192\t1\n";
1559
1560 static const CHAR frp_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1561 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1562 "Feature\tFeature\n"
1563 "product\t\t\tproduct feature\t1\t2\tMSITESTDIR\t\n";
1564
1565 static const CHAR frp_feature_comp_dat[] = "Feature_\tComponent_\n"
1566 "s38\ts72\n"
1567 "FeatureComponents\tFeature_\tComponent_\n"
1568 "product\tproduct\n";
1569
1570 static const CHAR frp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1571 "s72\tS38\ts72\ti2\tS255\tS72\n"
1572 "Component\tComponent\n"
1573 "product\t{44725EE0-EEA8-40BD-8162-A48224A2FEA1}\tMSITESTDIR\t\t\tproduct.txt\n";
1574
1575 static const CHAR frp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
1576 "s72\ti2\tS64\tS0\tS255\n"
1577 "CustomAction\tAction\n"
1578 "TestProp\t19\t\t\tPROP set\n";
1579
1580 static const CHAR frp_upgrade_dat[] = "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n"
1581 "s38\tS20\tS20\tS255\ti4\tS255\ts72\n"
1582 "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n"
1583 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}\t1.1.1\t2.2.2\t\t768\t\tPROP\n";
1584
1585 static const CHAR frp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1586 "s72\tS255\tI2\n"
1587 "InstallExecuteSequence\tAction\n"
1588 "FindRelatedProducts\t\t50\n"
1589 "TestProp\tPROP AND NOT REMOVE\t51\n"
1590 "LaunchConditions\t\t100\n"
1591 "CostInitialize\t\t800\n"
1592 "FileCost\t\t900\n"
1593 "CostFinalize\t\t1000\n"
1594 "InstallValidate\t\t1400\n"
1595 "InstallInitialize\t\t1500\n"
1596 "ProcessComponents\t\t1600\n"
1597 "RemoveFiles\t\t1700\n"
1598 "InstallFiles\t\t2000\n"
1599 "RegisterProduct\t\t5000\n"
1600 "PublishFeatures\t\t5100\n"
1601 "PublishProduct\t\t5200\n"
1602 "InstallFinalize\t\t6000\n";
1603
1604 static const CHAR riv_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1605 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1606 "File\tFile\n"
1607 "inifile.txt\tinifile\tinifile.txt\t1000\t\t\t8192\t1\n";
1608
1609 static const CHAR riv_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1610 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1611 "Feature\tFeature\n"
1612 "inifile\t\t\tinifile feature\t1\t2\tMSITESTDIR\t\n";
1613
1614 static const CHAR riv_feature_comp_dat[] = "Feature_\tComponent_\n"
1615 "s38\ts72\n"
1616 "FeatureComponents\tFeature_\tComponent_\n"
1617 "inifile\tinifile\n";
1618
1619 static const CHAR riv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1620 "s72\tS38\ts72\ti2\tS255\tS72\n"
1621 "Component\tComponent\n"
1622 "inifile\t{A0F15705-4F57-4437-88C4-6C8B37ACC6DE}\tMSITESTDIR\t\t\tinifile.txt\n";
1623
1624 static const CHAR riv_ini_file_dat[] = "IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"
1625 "s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n"
1626 "IniFile\tIniFile\n"
1627 "inifile1\ttest.ini\tMSITESTDIR\tsection1\tkey1\tvalue1\t\tinifile\n";
1628
1629 static const CHAR riv_remove_ini_file_dat[] = "RemoveIniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"
1630 "s72\tl255\tS72\tl96\tl128\tL255\ti2\ts72\n"
1631 "RemoveIniFile\tRemoveIniFile\n"
1632 "inifile1\ttest.ini\tMSITESTDIR\tsectionA\tkeyA\tvalueA\t2\tinifile\n";
1633
1634 static const CHAR riv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1635 "s72\tS255\tI2\n"
1636 "InstallExecuteSequence\tAction\n"
1637 "LaunchConditions\t\t100\n"
1638 "CostInitialize\t\t800\n"
1639 "FileCost\t\t900\n"
1640 "CostFinalize\t\t1000\n"
1641 "InstallValidate\t\t1400\n"
1642 "InstallInitialize\t\t1500\n"
1643 "ProcessComponents\t\t1600\n"
1644 "RemoveFiles\t\t1700\n"
1645 "InstallFiles\t\t2000\n"
1646 "RemoveIniValues\t\t3000\n"
1647 "RegisterProduct\t\t5000\n"
1648 "PublishFeatures\t\t5100\n"
1649 "PublishProduct\t\t5200\n"
1650 "InstallFinalize\t\t6000\n";
1651
1652 static const CHAR res_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1653 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1654 "File\tFile\n"
1655 "envvar.txt\tenvvar\tenvvar.txt\t1000\t\t\t8192\t1\n";
1656
1657 static const CHAR res_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1658 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1659 "Feature\tFeature\n"
1660 "envvar\t\t\tenvvar feature\t1\t2\tMSITESTDIR\t\n";
1661
1662 static const CHAR res_feature_comp_dat[] = "Feature_\tComponent_\n"
1663 "s38\ts72\n"
1664 "FeatureComponents\tFeature_\tComponent_\n"
1665 "envvar\tenvvar\n";
1666
1667 static const CHAR res_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1668 "s72\tS38\ts72\ti2\tS255\tS72\n"
1669 "Component\tComponent\n"
1670 "envvar\t{45EE9AF4-E5D1-445F-8BB7-B22D4EEBD29E}\tMSITESTDIR\t\t\tenvvar.txt\n";
1671
1672 static const CHAR res_environment_dat[] = "Environment\tName\tValue\tComponent_\n"
1673 "s72\tl255\tL255\ts72\n"
1674 "Environment\tEnvironment\n"
1675 "var1\t=-MSITESTVAR1\t1\tenvvar\n"
1676 "var2\t=+-MSITESTVAR2\t1\tenvvar\n"
1677 "var3\t=MSITESTVAR3\t1\tenvvar\n"
1678 "var4\t=-MSITESTVAR4\t\tenvvar\n"
1679 "var5\t=MSITESTVAR5\t\tenvvar\n";
1680
1681 static const CHAR res_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1682 "s72\tS255\tI2\n"
1683 "InstallExecuteSequence\tAction\n"
1684 "LaunchConditions\t\t100\n"
1685 "CostInitialize\t\t800\n"
1686 "FileCost\t\t900\n"
1687 "CostFinalize\t\t1000\n"
1688 "InstallValidate\t\t1400\n"
1689 "InstallInitialize\t\t1500\n"
1690 "ProcessComponents\t\t1600\n"
1691 "RemoveFiles\t\t1700\n"
1692 "InstallFiles\t\t2000\n"
1693 "RemoveEnvironmentStrings\t\t3000\n"
1694 "RegisterProduct\t\t5000\n"
1695 "PublishFeatures\t\t5100\n"
1696 "PublishProduct\t\t5200\n"
1697 "InstallFinalize\t\t6000\n";
1698
1699 typedef struct _msi_table
1700 {
1701 const CHAR *filename;
1702 const CHAR *data;
1703 int size;
1704 } msi_table;
1705
1706 #define ADD_TABLE(x) {#x".idt", x##_dat, sizeof(x##_dat)}
1707
1708 static const msi_table tables[] =
1709 {
1710 ADD_TABLE(component),
1711 ADD_TABLE(directory),
1712 ADD_TABLE(feature),
1713 ADD_TABLE(feature_comp),
1714 ADD_TABLE(file),
1715 ADD_TABLE(install_exec_seq),
1716 ADD_TABLE(media),
1717 ADD_TABLE(property),
1718 ADD_TABLE(registry),
1719 ADD_TABLE(service_install),
1720 ADD_TABLE(service_control)
1721 };
1722
1723 static const msi_table sc_tables[] =
1724 {
1725 ADD_TABLE(component),
1726 ADD_TABLE(directory),
1727 ADD_TABLE(feature),
1728 ADD_TABLE(feature_comp),
1729 ADD_TABLE(file),
1730 ADD_TABLE(install_exec_seq),
1731 ADD_TABLE(media),
1732 ADD_TABLE(property),
1733 ADD_TABLE(shortcut)
1734 };
1735
1736 static const msi_table ps_tables[] =
1737 {
1738 ADD_TABLE(component),
1739 ADD_TABLE(directory),
1740 ADD_TABLE(feature),
1741 ADD_TABLE(feature_comp),
1742 ADD_TABLE(file),
1743 ADD_TABLE(install_exec_seq),
1744 ADD_TABLE(media),
1745 ADD_TABLE(property),
1746 ADD_TABLE(condition)
1747 };
1748
1749 static const msi_table env_tables[] =
1750 {
1751 ADD_TABLE(component),
1752 ADD_TABLE(directory),
1753 ADD_TABLE(feature),
1754 ADD_TABLE(feature_comp),
1755 ADD_TABLE(file),
1756 ADD_TABLE(install_exec_seq),
1757 ADD_TABLE(media),
1758 ADD_TABLE(property),
1759 ADD_TABLE(environment)
1760 };
1761
1762 static const msi_table up_tables[] =
1763 {
1764 ADD_TABLE(component),
1765 ADD_TABLE(directory),
1766 ADD_TABLE(feature),
1767 ADD_TABLE(feature_comp),
1768 ADD_TABLE(file),
1769 ADD_TABLE(install_exec_seq),
1770 ADD_TABLE(media),
1771 ADD_TABLE(up_property),
1772 ADD_TABLE(registry),
1773 ADD_TABLE(service_install),
1774 ADD_TABLE(service_control)
1775 };
1776
1777 static const msi_table up2_tables[] =
1778 {
1779 ADD_TABLE(component),
1780 ADD_TABLE(directory),
1781 ADD_TABLE(feature),
1782 ADD_TABLE(feature_comp),
1783 ADD_TABLE(file),
1784 ADD_TABLE(install_exec_seq),
1785 ADD_TABLE(media),
1786 ADD_TABLE(up2_property),
1787 ADD_TABLE(registry),
1788 ADD_TABLE(service_install),
1789 ADD_TABLE(service_control)
1790 };
1791
1792 static const msi_table up3_tables[] =
1793 {
1794 ADD_TABLE(component),
1795 ADD_TABLE(directory),
1796 ADD_TABLE(feature),
1797 ADD_TABLE(feature_comp),
1798 ADD_TABLE(file),
1799 ADD_TABLE(install_exec_seq),
1800 ADD_TABLE(media),
1801 ADD_TABLE(up3_property),
1802 ADD_TABLE(registry),
1803 ADD_TABLE(service_install),
1804 ADD_TABLE(service_control)
1805 };
1806
1807 static const msi_table up4_tables[] =
1808 {
1809 ADD_TABLE(component),
1810 ADD_TABLE(directory),
1811 ADD_TABLE(feature),
1812 ADD_TABLE(feature_comp),
1813 ADD_TABLE(file),
1814 ADD_TABLE(pp_install_exec_seq),
1815 ADD_TABLE(media),
1816 ADD_TABLE(property),
1817 ADD_TABLE(registry),
1818 ADD_TABLE(service_install),
1819 ADD_TABLE(service_control)
1820 };
1821
1822 static const msi_table up5_tables[] =
1823 {
1824 ADD_TABLE(component),
1825 ADD_TABLE(directory),
1826 ADD_TABLE(feature),
1827 ADD_TABLE(feature_comp),
1828 ADD_TABLE(file),
1829 ADD_TABLE(pp_install_exec_seq),
1830 ADD_TABLE(media),
1831 ADD_TABLE(up_property),
1832 ADD_TABLE(registry),
1833 ADD_TABLE(service_install),
1834 ADD_TABLE(service_control)
1835 };
1836
1837 static const msi_table up6_tables[] =
1838 {
1839 ADD_TABLE(component),
1840 ADD_TABLE(directory),
1841 ADD_TABLE(feature),
1842 ADD_TABLE(feature_comp),
1843 ADD_TABLE(file),
1844 ADD_TABLE(pp_install_exec_seq),
1845 ADD_TABLE(media),
1846 ADD_TABLE(up2_property),
1847 ADD_TABLE(registry),
1848 ADD_TABLE(service_install),
1849 ADD_TABLE(service_control)
1850 };
1851
1852 static const msi_table up7_tables[] =
1853 {
1854 ADD_TABLE(component),
1855 ADD_TABLE(directory),
1856 ADD_TABLE(feature),
1857 ADD_TABLE(feature_comp),
1858 ADD_TABLE(file),
1859 ADD_TABLE(pp_install_exec_seq),
1860 ADD_TABLE(media),
1861 ADD_TABLE(up3_property),
1862 ADD_TABLE(registry),
1863 ADD_TABLE(service_install),
1864 ADD_TABLE(service_control)
1865 };
1866
1867 static const msi_table cc_tables[] =
1868 {
1869 ADD_TABLE(cc_component),
1870 ADD_TABLE(directory),
1871 ADD_TABLE(cc_feature),
1872 ADD_TABLE(cc_feature_comp),
1873 ADD_TABLE(cc_file),
1874 ADD_TABLE(install_exec_seq),
1875 ADD_TABLE(cc_media),
1876 ADD_TABLE(property),
1877 };
1878
1879 static const msi_table cc2_tables[] =
1880 {
1881 ADD_TABLE(cc2_component),
1882 ADD_TABLE(directory),
1883 ADD_TABLE(cc_feature),
1884 ADD_TABLE(cc_feature_comp),
1885 ADD_TABLE(cc2_file),
1886 ADD_TABLE(install_exec_seq),
1887 ADD_TABLE(cc_media),
1888 ADD_TABLE(property),
1889 };
1890
1891 static const msi_table co_tables[] =
1892 {
1893 ADD_TABLE(cc_component),
1894 ADD_TABLE(directory),
1895 ADD_TABLE(cc_feature),
1896 ADD_TABLE(cc_feature_comp),
1897 ADD_TABLE(co_file),
1898 ADD_TABLE(install_exec_seq),
1899 ADD_TABLE(co_media),
1900 ADD_TABLE(property),
1901 };
1902
1903 static const msi_table co2_tables[] =
1904 {
1905 ADD_TABLE(cc_component),
1906 ADD_TABLE(directory),
1907 ADD_TABLE(cc_feature),
1908 ADD_TABLE(cc_feature_comp),
1909 ADD_TABLE(cc_file),
1910 ADD_TABLE(install_exec_seq),
1911 ADD_TABLE(co2_media),
1912 ADD_TABLE(property),
1913 };
1914
1915 static const msi_table mm_tables[] =
1916 {
1917 ADD_TABLE(cc_component),
1918 ADD_TABLE(directory),
1919 ADD_TABLE(cc_feature),
1920 ADD_TABLE(cc_feature_comp),
1921 ADD_TABLE(mm_file),
1922 ADD_TABLE(install_exec_seq),
1923 ADD_TABLE(mm_media),
1924 ADD_TABLE(property),
1925 };
1926
1927 static const msi_table ss_tables[] =
1928 {
1929 ADD_TABLE(cc_component),
1930 ADD_TABLE(directory),
1931 ADD_TABLE(cc_feature),
1932 ADD_TABLE(cc_feature_comp),
1933 ADD_TABLE(cc_file),
1934 ADD_TABLE(install_exec_seq),
1935 ADD_TABLE(ss_media),
1936 ADD_TABLE(property),
1937 };
1938
1939 static const msi_table ui_tables[] =
1940 {
1941 ADD_TABLE(ui_component),
1942 ADD_TABLE(directory),
1943 ADD_TABLE(cc_feature),
1944 ADD_TABLE(cc_feature_comp),
1945 ADD_TABLE(cc_file),
1946 ADD_TABLE(install_exec_seq),
1947 ADD_TABLE(ui_install_ui_seq),
1948 ADD_TABLE(ui_custom_action),
1949 ADD_TABLE(cc_media),
1950 ADD_TABLE(property),
1951 };
1952
1953 static const msi_table rof_tables[] =
1954 {
1955 ADD_TABLE(rof_component),
1956 ADD_TABLE(directory),
1957 ADD_TABLE(rof_feature),
1958 ADD_TABLE(rof_feature_comp),
1959 ADD_TABLE(rof_file),
1960 ADD_TABLE(install_exec_seq),
1961 ADD_TABLE(rof_media),
1962 ADD_TABLE(property),
1963 };
1964
1965 static const msi_table rofc_tables[] =
1966 {
1967 ADD_TABLE(rof_component),
1968 ADD_TABLE(directory),
1969 ADD_TABLE(rof_feature),
1970 ADD_TABLE(rof_feature_comp),
1971 ADD_TABLE(rofc_file),
1972 ADD_TABLE(install_exec_seq),
1973 ADD_TABLE(rofc_media),
1974 ADD_TABLE(property),
1975 };
1976
1977 static const msi_table sdp_tables[] =
1978 {
1979 ADD_TABLE(rof_component),
1980 ADD_TABLE(directory),
1981 ADD_TABLE(rof_feature),
1982 ADD_TABLE(rof_feature_comp),
1983 ADD_TABLE(rof_file),
1984 ADD_TABLE(sdp_install_exec_seq),
1985 ADD_TABLE(sdp_custom_action),
1986 ADD_TABLE(rof_media),
1987 ADD_TABLE(property),
1988 };
1989
1990 static const msi_table cie_tables[] =
1991 {
1992 ADD_TABLE(cie_component),
1993 ADD_TABLE(directory),
1994 ADD_TABLE(cc_feature),
1995 ADD_TABLE(cie_feature_comp),
1996 ADD_TABLE(cie_file),
1997 ADD_TABLE(install_exec_seq),
1998 ADD_TABLE(cie_media),
1999 ADD_TABLE(property),
2000 };
2001
2002 static const msi_table ci_tables[] =
2003 {
2004 ADD_TABLE(ci_component),
2005 ADD_TABLE(directory),
2006 ADD_TABLE(rof_feature),
2007 ADD_TABLE(rof_feature_comp),
2008 ADD_TABLE(rof_file),
2009 ADD_TABLE(ci_install_exec_seq),
2010 ADD_TABLE(rof_media),
2011 ADD_TABLE(property),
2012 ADD_TABLE(ci_custom_action),
2013 };
2014
2015 static const msi_table ci2_tables[] =
2016 {
2017 ADD_TABLE(ci2_component),
2018 ADD_TABLE(directory),
2019 ADD_TABLE(rof_feature),
2020 ADD_TABLE(ci2_feature_comp),
2021 ADD_TABLE(ci2_file),
2022 ADD_TABLE(install_exec_seq),
2023 ADD_TABLE(rof_media),
2024 ADD_TABLE(property),
2025 };
2026
2027 static const msi_table spf_tables[] =
2028 {
2029 ADD_TABLE(ci_component),
2030 ADD_TABLE(directory),
2031 ADD_TABLE(rof_feature),
2032 ADD_TABLE(rof_feature_comp),
2033 ADD_TABLE(rof_file),
2034 ADD_TABLE(spf_install_exec_seq),
2035 ADD_TABLE(rof_media),
2036 ADD_TABLE(property),
2037 ADD_TABLE(spf_custom_action),
2038 ADD_TABLE(spf_install_ui_seq),
2039 };
2040
2041 static const msi_table pp_tables[] =
2042 {
2043 ADD_TABLE(ci_component),
2044 ADD_TABLE(directory),
2045 ADD_TABLE(rof_feature),
2046 ADD_TABLE(rof_feature_comp),
2047 ADD_TABLE(rof_file),
2048 ADD_TABLE(pp_install_exec_seq),
2049 ADD_TABLE(rof_media),
2050 ADD_TABLE(property),
2051 };
2052
2053 static const msi_table ppc_tables[] =
2054 {
2055 ADD_TABLE(ppc_component),
2056 ADD_TABLE(directory),
2057 ADD_TABLE(rof_feature),
2058 ADD_TABLE(ppc_feature_comp),
2059 ADD_TABLE(ppc_file),
2060 ADD_TABLE(pp_install_exec_seq),
2061 ADD_TABLE(ppc_media),
2062 ADD_TABLE(property),
2063 };
2064
2065 static const msi_table lus0_tables[] =
2066 {
2067 ADD_TABLE(ci_component),
2068 ADD_TABLE(directory),
2069 ADD_TABLE(rof_feature),
2070 ADD_TABLE(rof_feature_comp),
2071 ADD_TABLE(rof_file),
2072 ADD_TABLE(pp_install_exec_seq),
2073 ADD_TABLE(rof_media),
2074 ADD_TABLE(property),
2075 };
2076
2077 static const msi_table lus1_tables[] =
2078 {
2079 ADD_TABLE(ci_component),
2080 ADD_TABLE(directory),
2081 ADD_TABLE(rof_feature),
2082 ADD_TABLE(rof_feature_comp),
2083 ADD_TABLE(rof_file),
2084 ADD_TABLE(pp_install_exec_seq),
2085 ADD_TABLE(rofc_media),
2086 ADD_TABLE(property),
2087 };
2088
2089 static const msi_table lus2_tables[] =
2090 {
2091 ADD_TABLE(ci_component),
2092 ADD_TABLE(directory),
2093 ADD_TABLE(rof_feature),
2094 ADD_TABLE(rof_feature_comp),
2095 ADD_TABLE(rof_file),
2096 ADD_TABLE(pp_install_exec_seq),
2097 ADD_TABLE(lus2_media),
2098 ADD_TABLE(property),
2099 };
2100
2101 static const msi_table tp_tables[] =
2102 {
2103 ADD_TABLE(tp_component),
2104 ADD_TABLE(directory),
2105 ADD_TABLE(rof_feature),
2106 ADD_TABLE(ci2_feature_comp),
2107 ADD_TABLE(ci2_file),
2108 ADD_TABLE(install_exec_seq),
2109 ADD_TABLE(rof_media),
2110 ADD_TABLE(property),
2111 };
2112
2113 static const msi_table cwd_tables[] =
2114 {
2115 ADD_TABLE(cwd_component),
2116 ADD_TABLE(directory),
2117 ADD_TABLE(rof_feature),
2118 ADD_TABLE(ci2_feature_comp),
2119 ADD_TABLE(ci2_file),
2120 ADD_TABLE(install_exec_seq),
2121 ADD_TABLE(rof_media),
2122 ADD_TABLE(property),
2123 };
2124
2125 static const msi_table adm_tables[] =
2126 {
2127 ADD_TABLE(adm_component),
2128 ADD_TABLE(directory),
2129 ADD_TABLE(rof_feature),
2130 ADD_TABLE(ci2_feature_comp),
2131 ADD_TABLE(ci2_file),
2132 ADD_TABLE(install_exec_seq),
2133 ADD_TABLE(rof_media),
2134 ADD_TABLE(property),
2135 ADD_TABLE(adm_custom_action),
2136 ADD_TABLE(adm_admin_exec_seq),
2137 };
2138
2139 static const msi_table amp_tables[] =
2140 {
2141 ADD_TABLE(amp_component),
2142 ADD_TABLE(directory),
2143 ADD_TABLE(rof_feature),
2144 ADD_TABLE(ci2_feature_comp),
2145 ADD_TABLE(ci2_file),
2146 ADD_TABLE(install_exec_seq),
2147 ADD_TABLE(rof_media),
2148 ADD_TABLE(property),
2149 };
2150
2151 static const msi_table rem_tables[] =
2152 {
2153 ADD_TABLE(rem_component),
2154 ADD_TABLE(directory),
2155 ADD_TABLE(rof_feature),
2156 ADD_TABLE(rem_feature_comp),
2157 ADD_TABLE(rem_file),
2158 ADD_TABLE(rem_install_exec_seq),
2159 ADD_TABLE(rof_media),
2160 ADD_TABLE(property),
2161 ADD_TABLE(rem_remove_files),
2162 };
2163
2164 static const msi_table mov_tables[] =
2165 {
2166 ADD_TABLE(cwd_component),
2167 ADD_TABLE(directory),
2168 ADD_TABLE(rof_feature),
2169 ADD_TABLE(ci2_feature_comp),
2170 ADD_TABLE(ci2_file),
2171 ADD_TABLE(install_exec_seq),
2172 ADD_TABLE(rof_media),
2173 ADD_TABLE(property),
2174 ADD_TABLE(mov_move_file),
2175 };
2176
2177 static const msi_table mc_tables[] =
2178 {
2179 ADD_TABLE(mc_component),
2180 ADD_TABLE(directory),
2181 ADD_TABLE(cc_feature),
2182 ADD_TABLE(cie_feature_comp),
2183 ADD_TABLE(mc_file),
2184 ADD_TABLE(install_exec_seq),
2185 ADD_TABLE(mc_media),
2186 ADD_TABLE(property),
2187 ADD_TABLE(mc_file_hash),
2188 };
2189
2190 static const msi_table df_tables[] =
2191 {
2192 ADD_TABLE(rof_component),
2193 ADD_TABLE(df_directory),
2194 ADD_TABLE(rof_feature),
2195 ADD_TABLE(rof_feature_comp),
2196 ADD_TABLE(rof_file),
2197 ADD_TABLE(install_exec_seq),
2198 ADD_TABLE(rof_media),
2199 ADD_TABLE(property),
2200 ADD_TABLE(df_duplicate_file),
2201 };
2202
2203 static const msi_table wrv_tables[] =
2204 {
2205 ADD_TABLE(wrv_component),
2206 ADD_TABLE(directory),
2207 ADD_TABLE(rof_feature),
2208 ADD_TABLE(ci2_feature_comp),
2209 ADD_TABLE(ci2_file),
2210 ADD_TABLE(install_exec_seq),
2211 ADD_TABLE(rof_media),
2212 ADD_TABLE(property),
2213 ADD_TABLE(wrv_registry),
2214 };
2215
2216 static const msi_table sf_tables[] =
2217 {
2218 ADD_TABLE(wrv_component),
2219 ADD_TABLE(directory),
2220 ADD_TABLE(rof_feature),
2221 ADD_TABLE(ci2_feature_comp),
2222 ADD_TABLE(ci2_file),
2223 ADD_TABLE(install_exec_seq),
2224 ADD_TABLE(rof_media),
2225 ADD_TABLE(property),
2226 };
2227
2228 static const msi_table ca51_tables[] =
2229 {
2230 ADD_TABLE(ca51_component),
2231 ADD_TABLE(directory),
2232 ADD_TABLE(rof_feature),
2233 ADD_TABLE(ci2_feature_comp),
2234 ADD_TABLE(ci2_file),
2235 ADD_TABLE(ca51_install_exec_seq),
2236 ADD_TABLE(rof_media),
2237 ADD_TABLE(property),
2238 ADD_TABLE(ca51_custom_action),
2239 };
2240
2241 static const msi_table is_tables[] =
2242 {
2243 ADD_TABLE(is_component),
2244 ADD_TABLE(directory),
2245 ADD_TABLE(is_feature),
2246 ADD_TABLE(is_feature_comp),
2247 ADD_TABLE(is_file),
2248 ADD_TABLE(install_exec_seq),
2249 ADD_TABLE(is_media),
2250 ADD_TABLE(property),
2251 };
2252
2253 static const msi_table sp_tables[] =
2254 {
2255 ADD_TABLE(sp_component),
2256 ADD_TABLE(sp_directory),
2257 ADD_TABLE(rof_feature),
2258 ADD_TABLE(ci2_feature_comp),
2259 ADD_TABLE(ci2_file),
2260 ADD_TABLE(install_exec_seq),
2261 ADD_TABLE(rof_media),
2262 ADD_TABLE(property),
2263 };
2264
2265 static const msi_table mcp_tables[] =
2266 {
2267 ADD_TABLE(mcp_component),
2268 ADD_TABLE(directory),
2269 ADD_TABLE(mcp_feature),
2270 ADD_TABLE(mcp_feature_comp),
2271 ADD_TABLE(rem_file),
2272 ADD_TABLE(rem_install_exec_seq),
2273 ADD_TABLE(rof_media),
2274 ADD_TABLE(property),
2275 };
2276
2277 static const msi_table mcomp_tables[] =
2278 {
2279 ADD_TABLE(mcp_component),
2280 ADD_TABLE(directory),
2281 ADD_TABLE(mcp_feature),
2282 ADD_TABLE(mcp_feature_comp),
2283 ADD_TABLE(mcomp_file),
2284 ADD_TABLE(rem_install_exec_seq),
2285 ADD_TABLE(rof_media),
2286 ADD_TABLE(property),
2287 };
2288
2289 static const msi_table ai_tables[] =
2290 {
2291 ADD_TABLE(component),
2292 ADD_TABLE(directory),
2293 ADD_TABLE(feature),
2294 ADD_TABLE(feature_comp),
2295 ADD_TABLE(ai_file),
2296 ADD_TABLE(install_exec_seq),
2297 ADD_TABLE(media),
2298 ADD_TABLE(property)
2299 };
2300
2301 static const msi_table pc_tables[] =
2302 {
2303 ADD_TABLE(ca51_component),
2304 ADD_TABLE(directory),
2305 ADD_TABLE(rof_feature),
2306 ADD_TABLE(ci2_feature_comp),
2307 ADD_TABLE(ci2_file),
2308 ADD_TABLE(install_exec_seq),
2309 ADD_TABLE(rof_media),
2310 ADD_TABLE(property)
2311 };
2312
2313 static const msi_table ip_tables[] =
2314 {
2315 ADD_TABLE(component),
2316 ADD_TABLE(directory),
2317 ADD_TABLE(feature),
2318 ADD_TABLE(feature_comp),
2319 ADD_TABLE(file),
2320 ADD_TABLE(ip_install_exec_seq),
2321 ADD_TABLE(ip_custom_action),
2322 ADD_TABLE(media),
2323 ADD_TABLE(property)
2324 };
2325
2326 static const msi_table aup_tables[] =
2327 {
2328 ADD_TABLE(component),
2329 ADD_TABLE(directory),
2330 ADD_TABLE(feature),
2331 ADD_TABLE(feature_comp),
2332 ADD_TABLE(file),
2333 ADD_TABLE(aup_install_exec_seq),
2334 ADD_TABLE(aup_custom_action),
2335 ADD_TABLE(media),
2336 ADD_TABLE(property)
2337 };
2338
2339 static const msi_table aup2_tables[] =
2340 {
2341 ADD_TABLE(component),
2342 ADD_TABLE(directory),
2343 ADD_TABLE(feature),
2344 ADD_TABLE(feature_comp),
2345 ADD_TABLE(file),
2346 ADD_TABLE(aup2_install_exec_seq),
2347 ADD_TABLE(aup_custom_action),
2348 ADD_TABLE(media),
2349 ADD_TABLE(aup_property)
2350 };
2351
2352 static const msi_table aup3_tables[] =
2353 {
2354 ADD_TABLE(component),
2355 ADD_TABLE(directory),
2356 ADD_TABLE(feature),
2357 ADD_TABLE(feature_comp),
2358 ADD_TABLE(file),
2359 ADD_TABLE(aup2_install_exec_seq),
2360 ADD_TABLE(aup_custom_action),
2361 ADD_TABLE(media),
2362 ADD_TABLE(aup2_property)
2363 };
2364
2365 static const msi_table aup4_tables[] =
2366 {
2367 ADD_TABLE(component),
2368 ADD_TABLE(directory),
2369 ADD_TABLE(feature),
2370 ADD_TABLE(feature_comp),
2371 ADD_TABLE(file),
2372 ADD_TABLE(aup3_install_exec_seq),
2373 ADD_TABLE(aup_custom_action),
2374 ADD_TABLE(media),
2375 ADD_TABLE(aup2_property)
2376 };
2377
2378 static const msi_table fiu_tables[] =
2379 {
2380 ADD_TABLE(rof_component),
2381 ADD_TABLE(directory),
2382 ADD_TABLE(rof_feature),
2383 ADD_TABLE(rof_feature_comp),
2384 ADD_TABLE(rof_file),
2385 ADD_TABLE(pp_install_exec_seq),
2386 ADD_TABLE(rof_media),
2387 ADD_TABLE(property),
2388 };
2389
2390 static const msi_table fiuc_tables[] =
2391 {
2392 ADD_TABLE(rof_component),
2393 ADD_TABLE(directory),
2394 ADD_TABLE(rof_feature),
2395 ADD_TABLE(rof_feature_comp),
2396 ADD_TABLE(rofc_file),
2397 ADD_TABLE(pp_install_exec_seq),
2398 ADD_TABLE(rofc_media),
2399 ADD_TABLE(property),
2400 };
2401
2402 static const msi_table cf_tables[] =
2403 {
2404 ADD_TABLE(component),
2405 ADD_TABLE(directory),
2406 ADD_TABLE(feature),
2407 ADD_TABLE(feature_comp),
2408 ADD_TABLE(file),
2409 ADD_TABLE(cf_create_folders),
2410 ADD_TABLE(cf_install_exec_seq),
2411 ADD_TABLE(cf_custom_action),
2412 ADD_TABLE(media),
2413 ADD_TABLE(property)
2414 };
2415
2416 static const msi_table rf_tables[] =
2417 {
2418 ADD_TABLE(component),
2419 ADD_TABLE(directory),
2420 ADD_TABLE(feature),
2421 ADD_TABLE(feature_comp),
2422 ADD_TABLE(file),
2423 ADD_TABLE(cf_create_folders),
2424 ADD_TABLE(rf_install_exec_seq),
2425 ADD_TABLE(cf_custom_action),
2426 ADD_TABLE(media),
2427 ADD_TABLE(property)
2428 };
2429
2430 static const msi_table sss_tables[] =
2431 {
2432 ADD_TABLE(component),
2433 ADD_TABLE(directory),
2434 ADD_TABLE(feature),
2435 ADD_TABLE(feature_comp),
2436 ADD_TABLE(file),
2437 ADD_TABLE(sss_install_exec_seq),
2438 ADD_TABLE(sss_service_control),
2439 ADD_TABLE(media),
2440 ADD_TABLE(property)
2441 };
2442
2443 static const msi_table sds_tables[] =
2444 {
2445 ADD_TABLE(component),
2446 ADD_TABLE(directory),
2447 ADD_TABLE(feature),
2448 ADD_TABLE(feature_comp),
2449 ADD_TABLE(file),
2450 ADD_TABLE(sss_install_exec_seq),
2451 ADD_TABLE(service_control),
2452 ADD_TABLE(media),
2453 ADD_TABLE(property)
2454 };
2455
2456 static const msi_table sr_tables[] =
2457 {
2458 ADD_TABLE(component),
2459 ADD_TABLE(directory),
2460 ADD_TABLE(feature),
2461 ADD_TABLE(feature_comp),
2462 ADD_TABLE(file),
2463 ADD_TABLE(sr_selfreg),
2464 ADD_TABLE(sr_install_exec_seq),
2465 ADD_TABLE(media),
2466 ADD_TABLE(property)
2467 };
2468
2469 static const msi_table font_tables[] =
2470 {
2471 ADD_TABLE(font_component),
2472 ADD_TABLE(directory),
2473 ADD_TABLE(font_feature),
2474 ADD_TABLE(font_feature_comp),
2475 ADD_TABLE(font_file),
2476 ADD_TABLE(font),
2477 ADD_TABLE(font_install_exec_seq),
2478 ADD_TABLE(font_media),
2479 ADD_TABLE(property)
2480 };
2481
2482 static const msi_table vp_tables[] =
2483 {
2484 ADD_TABLE(component),
2485 ADD_TABLE(directory),
2486 ADD_TABLE(feature),
2487 ADD_TABLE(feature_comp),
2488 ADD_TABLE(file),
2489 ADD_TABLE(vp_custom_action),
2490 ADD_TABLE(vp_install_exec_seq),
2491 ADD_TABLE(media),
2492 ADD_TABLE(vp_property)
2493 };
2494
2495 static const msi_table odbc_tables[] =
2496 {
2497 ADD_TABLE(odbc_component),
2498 ADD_TABLE(directory),
2499 ADD_TABLE(odbc_feature),
2500 ADD_TABLE(odbc_feature_comp),
2501 ADD_TABLE(odbc_file),
2502 ADD_TABLE(odbc_driver),
2503 ADD_TABLE(odbc_translator),
2504 ADD_TABLE(odbc_datasource),
2505 ADD_TABLE(odbc_install_exec_seq),
2506 ADD_TABLE(odbc_media),
2507 ADD_TABLE(property)
2508 };
2509
2510 static const msi_table tl_tables[] =
2511 {
2512 ADD_TABLE(tl_component),
2513 ADD_TABLE(directory),
2514 ADD_TABLE(tl_feature),
2515 ADD_TABLE(tl_feature_comp),
2516 ADD_TABLE(tl_file),
2517 ADD_TABLE(tl_typelib),
2518 ADD_TABLE(tl_install_exec_seq),
2519 ADD_TABLE(media),
2520 ADD_TABLE(property)
2521 };
2522
2523 static const msi_table crs_tables[] =
2524 {
2525 ADD_TABLE(crs_component),
2526 ADD_TABLE(directory),
2527 ADD_TABLE(crs_feature),
2528 ADD_TABLE(crs_feature_comp),
2529 ADD_TABLE(crs_file),
2530 ADD_TABLE(crs_shortcut),
2531 ADD_TABLE(crs_install_exec_seq),
2532 ADD_TABLE(media),
2533 ADD_TABLE(property)
2534 };
2535
2536 static const msi_table pub_tables[] =
2537 {
2538 ADD_TABLE(directory),
2539 ADD_TABLE(pub_component),
2540 ADD_TABLE(pub_feature),
2541 ADD_TABLE(pub_feature_comp),
2542 ADD_TABLE(pub_file),
2543 ADD_TABLE(pub_publish_component),
2544 ADD_TABLE(pub_install_exec_seq),
2545 ADD_TABLE(media),
2546 ADD_TABLE(property)
2547 };
2548
2549 static const msi_table rd_tables[] =
2550 {
2551 ADD_TABLE(directory),
2552 ADD_TABLE(rd_component),
2553 ADD_TABLE(rd_feature),
2554 ADD_TABLE(rd_feature_comp),
2555 ADD_TABLE(rd_file),
2556 ADD_TABLE(rd_duplicate_file),
2557 ADD_TABLE(rd_install_exec_seq),
2558 ADD_TABLE(media),
2559 ADD_TABLE(property)
2560 };
2561
2562 static const msi_table rrv_tables[] =
2563 {
2564 ADD_TABLE(directory),
2565 ADD_TABLE(rrv_component),
2566 ADD_TABLE(rrv_feature),
2567 ADD_TABLE(rrv_feature_comp),
2568 ADD_TABLE(rrv_file),
2569 ADD_TABLE(rrv_registry),
2570 ADD_TABLE(rrv_remove_registry),
2571 ADD_TABLE(rrv_install_exec_seq),
2572 ADD_TABLE(media),
2573 ADD_TABLE(property)
2574 };
2575
2576 static const msi_table frp_tables[] =
2577 {
2578 ADD_TABLE(directory),
2579 ADD_TABLE(frp_component),
2580 ADD_TABLE(frp_feature),
2581 ADD_TABLE(frp_feature_comp),
2582 ADD_TABLE(frp_file),
2583 ADD_TABLE(frp_upgrade),
2584 ADD_TABLE(frp_custom_action),
2585 ADD_TABLE(frp_install_exec_seq),
2586 ADD_TABLE(media),
2587 ADD_TABLE(property)
2588 };
2589
2590 static const msi_table riv_tables[] =
2591 {
2592 ADD_TABLE(directory),
2593 ADD_TABLE(riv_component),
2594 ADD_TABLE(riv_feature),
2595 ADD_TABLE(riv_feature_comp),
2596 ADD_TABLE(riv_file),
2597 ADD_TABLE(riv_ini_file),
2598 ADD_TABLE(riv_remove_ini_file),
2599 ADD_TABLE(riv_install_exec_seq),
2600 ADD_TABLE(media),
2601 ADD_TABLE(property)
2602 };
2603
2604 static const msi_table res_tables[] =
2605 {
2606 ADD_TABLE(directory),
2607 ADD_TABLE(res_component),
2608 ADD_TABLE(res_feature),
2609 ADD_TABLE(res_feature_comp),
2610 ADD_TABLE(res_file),
2611 ADD_TABLE(res_environment),
2612 ADD_TABLE(res_install_exec_seq),
2613 ADD_TABLE(media),
2614 ADD_TABLE(property)
2615 };
2616
2617 /* cabinet definitions */
2618
2619 /* make the max size large so there is only one cab file */
2620 #define MEDIA_SIZE 0x7FFFFFFF
2621 #define FOLDER_THRESHOLD 900000
2622
2623 /* the FCI callbacks */
2624
2625 static void * CDECL mem_alloc(ULONG cb)
2626 {
2627 return HeapAlloc(GetProcessHeap(), 0, cb);
2628 }
2629
2630 static void CDECL mem_free(void *memory)
2631 {
2632 HeapFree(GetProcessHeap(), 0, memory);
2633 }
2634
2635 static BOOL CDECL get_next_cabinet(PCCAB pccab, ULONG cbPrevCab, void *pv)
2636 {
2637 sprintf(pccab->szCab, pv, pccab->iCab);
2638 return TRUE;
2639 }
2640
2641 static LONG CDECL progress(UINT typeStatus, ULONG cb1, ULONG cb2, void *pv)
2642 {
2643 return 0;
2644 }
2645
2646 static int CDECL file_placed(PCCAB pccab, char *pszFile, LONG cbFile,
2647 BOOL fContinuation, void *pv)
2648 {
2649 return 0;
2650 }
2651
2652 static INT_PTR CDECL fci_open(char *pszFile, int oflag, int pmode, int *err, void *pv)
2653 {
2654 HANDLE handle;
2655 DWORD dwAccess = 0;
2656 DWORD dwShareMode = 0;
2657 DWORD dwCreateDisposition = OPEN_EXISTING;
2658
2659 dwAccess = GENERIC_READ | GENERIC_WRITE;
2660 /* FILE_SHARE_DELETE is not supported by Windows Me/98/95 */
2661 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
2662
2663 if (GetFileAttributesA(pszFile) != INVALID_FILE_ATTRIBUTES)
2664 dwCreateDisposition = OPEN_EXISTING;
2665 else
2666 dwCreateDisposition = CREATE_NEW;
2667
2668 handle = CreateFileA(pszFile, dwAccess, dwShareMode, NULL,
2669 dwCreateDisposition, 0, NULL);
2670
2671 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszFile);
2672
2673 return (INT_PTR)handle;
2674 }
2675
2676 static UINT CDECL fci_read(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
2677 {
2678 HANDLE handle = (HANDLE)hf;
2679 DWORD dwRead;
2680 BOOL res;
2681
2682 res = ReadFile(handle, memory, cb, &dwRead, NULL);
2683 ok(res, "Failed to ReadFile\n");
2684
2685 return dwRead;
2686 }
2687
2688 static UINT CDECL fci_write(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
2689 {
2690 HANDLE handle = (HANDLE)hf;
2691 DWORD dwWritten;
2692 BOOL res;
2693
2694 res = WriteFile(handle, memory, cb, &dwWritten, NULL);
2695 ok(res, "Failed to WriteFile\n");
2696
2697 return dwWritten;
2698 }
2699
2700 static int CDECL fci_close(INT_PTR hf, int *err, void *pv)
2701 {
2702 HANDLE handle = (HANDLE)hf;
2703 ok(CloseHandle(handle), "Failed to CloseHandle\n");
2704
2705 return 0;
2706 }
2707
2708 static LONG CDECL fci_seek(INT_PTR hf, LONG dist, int seektype, int *err, void *pv)
2709 {
2710 HANDLE handle = (HANDLE)hf;
2711 DWORD ret;
2712
2713 ret = SetFilePointer(handle, dist, NULL, seektype);
2714 ok(ret != INVALID_SET_FILE_POINTER, "Failed to SetFilePointer\n");
2715
2716 return ret;
2717 }
2718
2719 static int CDECL fci_delete(char *pszFile, int *err, void *pv)
2720 {
2721 BOOL ret = DeleteFileA(pszFile);
2722 ok(ret, "Failed to DeleteFile %s\n", pszFile);
2723
2724 return 0;
2725 }
2726
2727 static void init_functionpointers(void)
2728 {
2729 HMODULE hmsi = GetModuleHandleA("msi.dll");
2730 HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
2731
2732 #define GET_PROC(mod, func) \
2733 p ## func = (void*)GetProcAddress(mod, #func); \
2734 if(!p ## func) \
2735 trace("GetProcAddress(%s) failed\n", #func);
2736
2737 GET_PROC(hmsi, MsiQueryComponentStateA);
2738 GET_PROC(hmsi, MsiSetExternalUIRecord);
2739 GET_PROC(hmsi, MsiSourceListEnumSourcesA);
2740 GET_PROC(hmsi, MsiSourceListGetInfoA);
2741
2742 GET_PROC(hadvapi32, ConvertSidToStringSidA);
2743
2744 hsrclient = LoadLibraryA("srclient.dll");
2745 GET_PROC(hsrclient, SRRemoveRestorePoint);
2746 GET_PROC(hsrclient, SRSetRestorePointA);
2747
2748 #undef GET_PROC
2749 }
2750
2751 static BOOL check_win9x(void)
2752 {
2753 SC_HANDLE scm;
2754
2755 scm = OpenSCManager(NULL, NULL, GENERIC_ALL);
2756 if (!scm && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED))
2757 return TRUE;
2758
2759 CloseServiceHandle(scm);
2760
2761 return FALSE;
2762 }
2763
2764 static LPSTR get_user_sid(LPSTR *usersid)
2765 {
2766 HANDLE token;
2767 BYTE buf[1024];
2768 DWORD size;
2769 PTOKEN_USER user;
2770
2771 if (!pConvertSidToStringSidA)
2772 {
2773 win_skip("ConvertSidToStringSidA is not available\n");
2774 return NULL;
2775 }
2776
2777 *usersid = NULL;
2778 OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
2779 size = sizeof(buf);
2780 GetTokenInformation(token, TokenUser, buf, size, &size);
2781 user = (PTOKEN_USER)buf;
2782 pConvertSidToStringSidA(user->User.Sid, usersid);
2783 ok(*usersid != NULL, "pConvertSidToStringSidA failed lre=%d\n", GetLastError());
2784 CloseHandle(token);
2785 return *usersid;
2786 }
2787
2788 static BOOL check_record(MSIHANDLE rec, UINT field, LPCSTR val)
2789 {
2790 CHAR buffer[0x20];
2791 UINT r;
2792 DWORD sz;
2793
2794 sz = sizeof buffer;
2795 r = MsiRecordGetString(rec, field, buffer, &sz);
2796 return (r == ERROR_SUCCESS ) && !strcmp(val, buffer);
2797 }
2798
2799 static BOOL CDECL get_temp_file(char *pszTempName, int cbTempName, void *pv)
2800 {
2801 LPSTR tempname;
2802
2803 tempname = HeapAlloc(GetProcessHeap(), 0, MAX_PATH);
2804 GetTempFileNameA(".", "xx", 0, tempname);
2805
2806 if (tempname && (strlen(tempname) < (unsigned)cbTempName))
2807 {
2808 lstrcpyA(pszTempName, tempname);
2809 HeapFree(GetProcessHeap(), 0, tempname);
2810 return TRUE;
2811 }
2812
2813 HeapFree(GetProcessHeap(), 0, tempname);
2814
2815 return FALSE;
2816 }
2817
2818 static INT_PTR CDECL get_open_info(char *pszName, USHORT *pdate, USHORT *ptime,
2819 USHORT *pattribs, int *err, void *pv)
2820 {
2821 BY_HANDLE_FILE_INFORMATION finfo;
2822 FILETIME filetime;
2823 HANDLE handle;
2824 DWORD attrs;
2825 BOOL res;
2826
2827 handle = CreateFile(pszName, GENERIC_READ, FILE_SHARE_READ, NULL,
2828 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
2829
2830 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszName);
2831
2832 res = GetFileInformationByHandle(handle, &finfo);
2833 ok(res, "Expected GetFileInformationByHandle to succeed\n");
2834
2835 FileTimeToLocalFileTime(&finfo.ftLastWriteTime, &filetime);
2836 FileTimeToDosDateTime(&filetime, pdate, ptime);
2837
2838 attrs = GetFileAttributes(pszName);
2839 ok(attrs != INVALID_FILE_ATTRIBUTES, "Failed to GetFileAttributes\n");
2840
2841 return (INT_PTR)handle;
2842 }
2843
2844 static BOOL add_file(HFCI hfci, const char *file, TCOMP compress)
2845 {
2846 char path[MAX_PATH];
2847 char filename[MAX_PATH];
2848
2849 lstrcpyA(path, CURR_DIR);
2850 lstrcatA(path, "\\");
2851 lstrcatA(path, file);
2852
2853 lstrcpyA(filename, file);
2854
2855 return FCIAddFile(hfci, path, filename, FALSE, get_next_cabinet,
2856 progress, get_open_info, compress);
2857 }
2858
2859 static void set_cab_parameters(PCCAB pCabParams, const CHAR *name, DWORD max_size)
2860 {
2861 ZeroMemory(pCabParams, sizeof(CCAB));
2862
2863 pCabParams->cb = max_size;
2864 pCabParams->cbFolderThresh = FOLDER_THRESHOLD;
2865 pCabParams->setID = 0xbeef;
2866 pCabParams->iCab = 1;
2867 lstrcpyA(pCabParams->szCabPath, CURR_DIR);
2868 lstrcatA(pCabParams->szCabPath, "\\");
2869 lstrcpyA(pCabParams->szCab, name);
2870 }
2871
2872 static void create_cab_file(const CHAR *name, DWORD max_size, const CHAR *files)
2873 {
2874 CCAB cabParams;
2875 LPCSTR ptr;
2876 HFCI hfci;
2877 ERF erf;
2878 BOOL res;
2879
2880 set_cab_parameters(&cabParams, name, max_size);
2881
2882 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open,
2883 fci_read, fci_write, fci_close, fci_seek, fci_delete,
2884 get_temp_file, &cabParams, NULL);
2885
2886 ok(hfci != NULL, "Failed to create an FCI context\n");
2887
2888 ptr = files;
2889 while (*ptr)
2890 {
2891 res = add_file(hfci, ptr, tcompTYPE_MSZIP);
2892 ok(res, "Failed to add file: %s\n", ptr);
2893 ptr += lstrlen(ptr) + 1;
2894 }
2895
2896 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress);
2897 ok(res, "Failed to flush the cabinet\n");
2898
2899 res = FCIDestroy(hfci);
2900 ok(res, "Failed to destroy the cabinet\n");
2901 }
2902
2903 static BOOL get_program_files_dir(LPSTR buf, LPSTR buf2)
2904 {
2905 HKEY hkey;
2906 DWORD type, size;
2907
2908 if (RegOpenKey(HKEY_LOCAL_MACHINE,
2909 "Software\\Microsoft\\Windows\\CurrentVersion", &hkey))
2910 return FALSE;
2911
2912 size = MAX_PATH;
2913 if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)buf, &size)) {
2914 RegCloseKey(hkey);
2915 return FALSE;
2916 }
2917
2918 size = MAX_PATH;
2919 if (RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)buf2, &size)) {
2920 RegCloseKey(hkey);
2921 return FALSE;
2922 }
2923
2924 RegCloseKey(hkey);
2925 return TRUE;
2926 }
2927
2928 static void create_file_data(LPCSTR name, LPCSTR data, DWORD size)
2929 {
2930 HANDLE file;
2931 DWORD written;
2932
2933 file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
2934 if (file == INVALID_HANDLE_VALUE)
2935 return;
2936
2937 WriteFile(file, data, strlen(data), &written, NULL);
2938
2939 if (size)
2940 {
2941 SetFilePointer(file, size, NULL, FILE_BEGIN);
2942 SetEndOfFile(file);
2943 }
2944
2945 CloseHandle(file);
2946 }
2947
2948 #define create_file(name, size) create_file_data(name, name, size)
2949
2950 static void create_test_files(void)
2951 {
2952 CreateDirectoryA("msitest", NULL);
2953 create_file("msitest\\one.txt", 100);
2954 CreateDirectoryA("msitest\\first", NULL);
2955 create_file("msitest\\first\\two.txt", 100);
2956 CreateDirectoryA("msitest\\second", NULL);
2957 create_file("msitest\\second\\three.txt", 100);
2958
2959 create_file("four.txt", 100);
2960 create_file("five.txt", 100);
2961 create_cab_file("msitest.cab", MEDIA_SIZE, "four.txt\0five.txt\0");
2962
2963 create_file("msitest\\filename", 100);
2964 create_file("msitest\\service.exe", 100);
2965
2966 DeleteFileA("four.txt");
2967 DeleteFileA("five.txt");
2968 }
2969
2970 static BOOL delete_pf(const CHAR *rel_path, BOOL is_file)
2971 {
2972 CHAR path[MAX_PATH];
2973
2974 lstrcpyA(path, PROG_FILES_DIR);
2975 lstrcatA(path, "\\");
2976 lstrcatA(path, rel_path);
2977
2978 if (is_file)
2979 return DeleteFileA(path);
2980 else
2981 return RemoveDirectoryA(path);
2982 }
2983
2984 static BOOL delete_cf(const CHAR *rel_path, BOOL is_file)
2985 {
2986 CHAR path[MAX_PATH];
2987
2988 lstrcpyA(path, COMMON_FILES_DIR);
2989 lstrcatA(path, "\\");
2990 lstrcatA(path, rel_path);
2991
2992 if (is_file)
2993 return DeleteFileA(path);
2994 else
2995 return RemoveDirectoryA(path);
2996 }
2997
2998 static void delete_test_files(void)
2999 {
3000 DeleteFileA("msitest.msi");
3001 DeleteFileA("msitest.cab");
3002 DeleteFileA("msitest\\second\\three.txt");
3003 DeleteFileA("msitest\\first\\two.txt");
3004 DeleteFileA("msitest\\one.txt");
3005 DeleteFileA("msitest\\service.exe");
3006 DeleteFileA("msitest\\filename");
3007 RemoveDirectoryA("msitest\\second");
3008 RemoveDirectoryA("msitest\\first");
3009 RemoveDirectoryA("msitest");
3010 }
3011
3012 static void write_file(const CHAR *filename, const char *data, int data_size)
3013 {
3014 DWORD size;
3015
3016 HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL,
3017 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
3018
3019 WriteFile(hf, data, data_size, &size, NULL);
3020 CloseHandle(hf);
3021 }
3022
3023 static void write_msi_summary_info(MSIHANDLE db, INT wordcount)
3024 {
3025 MSIHANDLE summary;
3026 UINT r;
3027
3028 r = MsiGetSummaryInformationA(db, NULL, 5, &summary);
3029 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3030
3031 r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, ";1033");
3032 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3033
3034 r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL,
3035 "{004757CA-5092-49c2-AD20-28E1CE0DF5F2}");
3036 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3037
3038 r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, 100, NULL, NULL);
3039 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3040
3041 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, wordcount, NULL, NULL);
3042 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3043
3044 r = MsiSummaryInfoSetPropertyA(summary, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
3045 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3046
3047 /* write the summary changes back to the stream */
3048 r = MsiSummaryInfoPersist(summary);
3049 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3050
3051 MsiCloseHandle(summary);
3052 }
3053
3054 #define create_database(name, tables, num_tables) \
3055 create_database_wordcount(name, tables, num_tables, 0);
3056
3057 static void create_database_wordcount(const CHAR *name, const msi_table *tables,
3058 int num_tables, INT wordcount)
3059 {
3060 MSIHANDLE db;
3061 UINT r;
3062 int j;
3063
3064 r = MsiOpenDatabaseA(name, MSIDBOPEN_CREATE, &db);
3065 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3066
3067 /* import the tables into the database */
3068 for (j = 0; j < num_tables; j++)
3069 {
3070 const msi_table *table = &tables[j];
3071
3072 write_file(table->filename, table->data, (table->size - 1) * sizeof(char));
3073
3074 r = MsiDatabaseImportA(db, CURR_DIR, table->filename);
3075 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3076
3077 DeleteFileA(table->filename);
3078 }
3079
3080 write_msi_summary_info(db, wordcount);
3081
3082 r = MsiDatabaseCommit(db);
3083 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3084
3085 MsiCloseHandle(db);
3086 }
3087
3088 static void check_service_is_installed(void)
3089 {
3090 SC_HANDLE scm, service;
3091 BOOL res;
3092
3093 scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
3094 ok(scm != NULL, "Failed to open the SC Manager\n");
3095
3096 service = OpenService(scm, "TestService", SC_MANAGER_ALL_ACCESS);
3097 ok(service != NULL, "Failed to open TestService\n");
3098
3099 res = DeleteService(service);
3100 ok(res, "Failed to delete TestService\n");
3101
3102 CloseServiceHandle(service);
3103 CloseServiceHandle(scm);
3104 }
3105
3106 static BOOL notify_system_change(DWORD event_type, STATEMGRSTATUS *status)
3107 {
3108 RESTOREPOINTINFOA spec;
3109
3110 spec.dwEventType = event_type;
3111 spec.dwRestorePtType = APPLICATION_INSTALL;
3112 spec.llSequenceNumber = status->llSequenceNumber;
3113 lstrcpyA(spec.szDescription, "msitest restore point");
3114
3115 return pSRSetRestorePointA(&spec, status);
3116 }
3117
3118 static void remove_restore_point(DWORD seq_number)
3119 {
3120 DWORD res;
3121
3122 res = pSRRemoveRestorePoint(seq_number);
3123 if (res != ERROR_SUCCESS)
3124 trace("Failed to remove the restore point : %08x\n", res);
3125 }
3126
3127 static void test_MsiInstallProduct(void)
3128 {
3129 UINT r;
3130 CHAR path[MAX_PATH];
3131 LONG res;
3132 HKEY hkey;
3133 DWORD num, size, type;
3134
3135 if (on_win9x)
3136 {
3137 win_skip("Services are not implemented on Win9x and WinMe\n");
3138 return;
3139 }
3140
3141 /* szPackagePath is NULL */
3142 r = MsiInstallProductA(NULL, "INSTALL=ALL");
3143 ok(r == ERROR_INVALID_PARAMETER,
3144 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
3145
3146 /* both szPackagePath and szCommandLine are NULL */
3147 r = MsiInstallProductA(NULL, NULL);
3148 ok(r == ERROR_INVALID_PARAMETER,
3149 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
3150
3151 /* szPackagePath is empty */
3152 r = MsiInstallProductA("", "INSTALL=ALL");
3153 ok(r == ERROR_PATH_NOT_FOUND,
3154 "Expected ERROR_PATH_NOT_FOUND, got %d\n", r);
3155
3156 create_test_files();
3157 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
3158
3159 /* install, don't publish */
3160 r = MsiInstallProductA(msifile, NULL);
3161 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3162
3163 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
3164 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
3165 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
3166 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
3167 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
3168 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
3169 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
3170 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
3171 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
3172 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
3173 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
3174 ok(delete_pf("msitest", FALSE), "File not installed\n");
3175
3176 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
3177 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3178
3179 size = MAX_PATH;
3180 type = REG_SZ;
3181 res = RegQueryValueExA(hkey, "Name", NULL, &type, (LPBYTE)path, &size);
3182 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3183 ok(!lstrcmpA(path, "imaname"), "Expected imaname, got %s\n", path);
3184
3185 size = MAX_PATH;
3186 type = REG_SZ;
3187 res = RegQueryValueExA(hkey, "blah", NULL, &type, (LPBYTE)path, &size);
3188 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3189
3190 size = sizeof(num);
3191 type = REG_DWORD;
3192 res = RegQueryValueExA(hkey, "number", NULL, &type, (LPBYTE)&num, &size);
3193 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3194 ok(num == 314, "Expected 314, got %d\n", num);
3195
3196 size = MAX_PATH;
3197 type = REG_SZ;
3198 res = RegQueryValueExA(hkey, "OrderTestName", NULL, &type, (LPBYTE)path, &size);
3199 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3200 ok(!lstrcmpA(path, "OrderTestValue"), "Expected OrderTestValue, got %s\n", path);
3201
3202 check_service_is_installed();
3203
3204 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
3205
3206 /* not published, reinstall */
3207 r = MsiInstallProductA(msifile, NULL);
3208 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3209
3210 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
3211 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
3212 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
3213 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
3214 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
3215 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
3216 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
3217 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
3218 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
3219 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
3220 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
3221 ok(delete_pf("msitest", FALSE), "File not installed\n");
3222
3223 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
3224 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3225 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
3226
3227 create_database(msifile, up_tables, sizeof(up_tables) / sizeof(msi_table));
3228
3229 /* not published, RemovePreviousVersions set */
3230 r = MsiInstallProductA(msifile, NULL);
3231 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3232
3233 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
3234 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
3235 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
3236 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
3237 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
3238 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
3239 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
3240 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
3241 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
3242 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
3243 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
3244 ok(delete_pf("msitest", FALSE), "File not installed\n");
3245
3246 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
3247 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3248 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
3249
3250 create_database(msifile, up2_tables, sizeof(up2_tables) / sizeof(msi_table));
3251
3252 /* not published, version number bumped */
3253 r = MsiInstallProductA(msifile, NULL);
3254 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3255
3256 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
3257 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
3258 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
3259 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
3260 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
3261 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
3262 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
3263 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
3264 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
3265 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
3266 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
3267 ok(delete_pf("msitest", FALSE), "File not installed\n");
3268
3269 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
3270 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3271 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
3272
3273 create_database(msifile, up3_tables, sizeof(up3_tables) / sizeof(msi_table));
3274
3275 /* not published, RemovePreviousVersions set and version number bumped */
3276 r = MsiInstallProductA(msifile, NULL);
3277 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3278
3279 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
3280 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
3281 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
3282 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
3283 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
3284 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
3285 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
3286 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
3287 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
3288 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
3289 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
3290 ok(delete_pf("msitest", FALSE), "File not installed\n");
3291
3292 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
3293 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3294 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
3295
3296 create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table));
3297
3298 /* install, publish product */
3299 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
3300 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3301
3302 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
3303 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
3304 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
3305 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
3306 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
3307 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
3308 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
3309 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
3310 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
3311 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
3312 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
3313 ok(delete_pf("msitest", FALSE), "File not installed\n");
3314
3315 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
3316 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3317
3318 create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table));
3319
3320 /* published, reinstall */
3321 r = MsiInstallProductA(msifile, NULL);
3322 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3323
3324 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
3325 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
3326 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
3327 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
3328 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
3329 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
3330 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
3331 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
3332 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
3333 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
3334 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
3335 ok(delete_pf("msitest", FALSE), "File not installed\n");
3336
3337 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
3338 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3339
3340 create_database(msifile, up5_tables, sizeof(up5_tables) / sizeof(msi_table));
3341
3342 /* published product, RemovePreviousVersions set */
3343 r = MsiInstallProductA(msifile, NULL);
3344 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3345
3346 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
3347 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
3348 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
3349 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
3350 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
3351 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
3352 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
3353 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
3354 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
3355 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
3356 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
3357 ok(delete_pf("msitest", FALSE), "File not installed\n");
3358
3359 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
3360 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3361
3362 create_database(msifile, up6_tables, sizeof(up6_tables) / sizeof(msi_table));
3363
3364 /* published product, version number bumped */
3365 r = MsiInstallProductA(msifile, NULL);
3366 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3367
3368 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
3369 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
3370 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
3371 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
3372 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
3373 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
3374 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
3375 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
3376 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
3377 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
3378 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
3379 ok(delete_pf("msitest", FALSE), "File not installed\n");
3380
3381 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
3382 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3383
3384 create_database(msifile, up7_tables, sizeof(up7_tables) / sizeof(msi_table));
3385
3386 /* published product, RemovePreviousVersions set and version number bumped */
3387 r = MsiInstallProductA(msifile, NULL);
3388 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3389
3390 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
3391 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
3392 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
3393 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
3394 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
3395 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
3396 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
3397 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
3398 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
3399 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
3400 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
3401 ok(delete_pf("msitest", FALSE), "File not installed\n");
3402
3403 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
3404 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3405
3406 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3407 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3408
3409 delete_test_files();
3410 }
3411
3412 static void test_MsiSetComponentState(void)
3413 {
3414 INSTALLSTATE installed, action;
3415 MSIHANDLE package;
3416 char path[MAX_PATH];
3417 UINT r;
3418
3419 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
3420
3421 CoInitialize(NULL);
3422
3423 lstrcpy(path, CURR_DIR);
3424 lstrcat(path, "\\");
3425 lstrcat(path, msifile);
3426
3427 r = MsiOpenPackage(path, &package);
3428 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3429
3430 r = MsiDoAction(package, "CostInitialize");
3431 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3432
3433 r = MsiDoAction(package, "FileCost");
3434 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3435
3436 r = MsiDoAction(package, "CostFinalize");
3437 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3438
3439 r = MsiGetComponentState(package, "dangler", &installed, &action);
3440 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3441 ok(installed == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", installed);
3442 ok(action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3443
3444 r = MsiSetComponentState(package, "dangler", INSTALLSTATE_SOURCE);
3445 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3446
3447 MsiCloseHandle(package);
3448 CoUninitialize();
3449
3450 DeleteFileA(msifile);
3451 }
3452
3453 static void test_packagecoltypes(void)
3454 {
3455 MSIHANDLE hdb, view, rec;
3456 char path[MAX_PATH];
3457 LPCSTR query;
3458 UINT r, count;
3459
3460 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
3461
3462 CoInitialize(NULL);
3463
3464 lstrcpy(path, CURR_DIR);
3465 lstrcat(path, "\\");
3466 lstrcat(path, msifile);
3467
3468 r = MsiOpenDatabase(path, MSIDBOPEN_READONLY, &hdb);
3469 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3470
3471 query = "SELECT * FROM `Media`";
3472 r = MsiDatabaseOpenView( hdb, query, &view );
3473 ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
3474
3475 r = MsiViewGetColumnInfo( view, MSICOLINFO_NAMES, &rec );
3476 count = MsiRecordGetFieldCount( rec );
3477 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n");
3478 ok(count == 6, "Expected 6, got %d\n", count);
3479 ok(check_record(rec, 1, "DiskId"), "wrong column label\n");
3480 ok(check_record(rec, 2, "LastSequence"), "wrong column label\n");
3481 ok(check_record(rec, 3, "DiskPrompt"), "wrong column label\n");
3482 ok(check_record(rec, 4, "Cabinet"), "wrong column label\n");
3483 ok(check_record(rec, 5, "VolumeLabel"), "wrong column label\n");
3484 ok(check_record(rec, 6, "Source"), "wrong column label\n");
3485 MsiCloseHandle(rec);
3486
3487 r = MsiViewGetColumnInfo( view, MSICOLINFO_TYPES, &rec );
3488 count = MsiRecordGetFieldCount( rec );
3489 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n");
3490 ok(count == 6, "Expected 6, got %d\n", count);
3491 ok(check_record(rec, 1, "i2"), "wrong column label\n");
3492 ok(check_record(rec, 2, "i4"), "wrong column label\n");
3493 ok(check_record(rec, 3, "L64"), "wrong column label\n");
3494 ok(check_record(rec, 4, "S255"), "wrong column label\n");
3495 ok(check_record(rec, 5, "S32"), "wrong column label\n");
3496 ok(check_record(rec, 6, "S72"), "wrong column label\n");
3497
3498 MsiCloseHandle(rec);
3499 MsiCloseHandle(view);
3500 MsiCloseHandle(hdb);
3501 CoUninitialize();
3502
3503 DeleteFile(msifile);
3504 }
3505
3506 static void create_cc_test_files(void)
3507 {
3508 CCAB cabParams;
3509 HFCI hfci;
3510 ERF erf;
3511 static CHAR cab_context[] = "test%d.cab";
3512 BOOL res;
3513
3514 create_file("maximus", 500);
3515 create_file("augustus", 50000);
3516 create_file("tiberius", 500);
3517 create_file("caesar", 500);
3518
3519 set_cab_parameters(&cabParams, "test1.cab", 40000);
3520
3521 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open,
3522 fci_read, fci_write, fci_close, fci_seek, fci_delete,
3523 get_temp_file, &cabParams, cab_context);
3524 ok(hfci != NULL, "Failed to create an FCI context\n");
3525
3526 res = add_file(hfci, "maximus", tcompTYPE_NONE);
3527 ok(res, "Failed to add file maximus\n");
3528
3529 res = add_file(hfci, "augustus", tcompTYPE_NONE);
3530 ok(res, "Failed to add file augustus\n");
3531
3532 res = add_file(hfci, "tiberius", tcompTYPE_NONE);
3533 ok(res, "Failed to add file tiberius\n");
3534
3535 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress);
3536 ok(res, "Failed to flush the cabinet\n");
3537
3538 res = FCIDestroy(hfci);
3539 ok(res, "Failed to destroy the cabinet\n");
3540
3541 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
3542
3543 DeleteFile("maximus");
3544 DeleteFile("augustus");
3545 DeleteFile("tiberius");
3546 DeleteFile("caesar");
3547 }
3548
3549 static void delete_cab_files(void)
3550 {
3551 SHFILEOPSTRUCT shfl;
3552 CHAR path[MAX_PATH+10];
3553
3554 lstrcpyA(path, CURR_DIR);
3555 lstrcatA(path, "\\*.cab");
3556 path[strlen(path) + 1] = '\0';
3557
3558 shfl.hwnd = NULL;
3559 shfl.wFunc = FO_DELETE;
3560 shfl.pFrom = path;
3561 shfl.pTo = NULL;
3562 shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT;
3563
3564 SHFileOperation(&shfl);
3565 }
3566
3567 static void test_continuouscabs(void)
3568 {
3569 UINT r;
3570
3571 create_cc_test_files();
3572 create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table));
3573
3574 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3575
3576 r = MsiInstallProductA(msifile, NULL);
3577 if (r == ERROR_SUCCESS) /* win9x has a problem with this */
3578 {
3579 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3580 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3581 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3582 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3583 ok(delete_pf("msitest", FALSE), "File not installed\n");
3584 }
3585
3586 delete_cab_files();
3587 DeleteFile(msifile);
3588
3589 create_cc_test_files();
3590 create_database(msifile, cc2_tables, sizeof(cc2_tables) / sizeof(msi_table));
3591
3592 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3593
3594 r = MsiInstallProductA(msifile, NULL);
3595 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3596 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3597 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3598 ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n");
3599 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3600 ok(delete_pf("msitest", FALSE), "File not installed\n");
3601
3602 delete_cab_files();
3603 DeleteFile(msifile);
3604 }
3605
3606 static void test_caborder(void)
3607 {
3608 UINT r;
3609
3610 create_file("imperator", 100);
3611 create_file("maximus", 500);
3612 create_file("augustus", 50000);
3613 create_file("caesar", 500);
3614
3615 create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table));
3616
3617 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3618
3619 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
3620 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0");
3621 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
3622