ReactOS 0.4.16-dev-522-gb68104a
install.c
Go to the documentation of this file.
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 <shlobj.h>
33#include <winsvc.h>
34#include <shellapi.h>
35
36#include "wine/test.h"
37#include "utils.h"
38
40static const BOOL is_64bit = sizeof(void *) > sizeof(int);
41
42static const char *msifile = "msitest.msi";
43static const char *msifile2 = "winetest2.msi";
44static const char *mstfile = "winetest.mst";
45
46static const WCHAR msifileW[] = L"msitest.msi";
47static const WCHAR msifile2W[] = L"msitest2.msi";
48
55
56static const char *customdll;
57
58/* msi database data */
59
60static const CHAR component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
61 "s72\tS38\ts72\ti2\tS255\tS72\n"
62 "Component\tComponent\n"
63 "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n"
64 "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n"
65 "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\tNOT REINSTALL\tone.txt\n"
66 "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n"
67 "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n"
68 "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n"
69 "component\t\tMSITESTDIR\t0\t1\tfile\n";
70
71static const CHAR directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n"
72 "s72\tS72\tl255\n"
73 "Directory\tDirectory\n"
74 "CABOUTDIR\tMSITESTDIR\tcabout\n"
75 "CHANGEDDIR\tMSITESTDIR\tchanged:second\n"
76 "FIRSTDIR\tMSITESTDIR\tfirst\n"
77 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
78 "NEWDIR\tCABOUTDIR\tnew\n"
79 "ProgramFilesFolder\tTARGETDIR\t.\n"
80 "TARGETDIR\t\tSourceDir";
81
82static const CHAR feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
83 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
84 "Feature\tFeature\n"
85 "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n"
86 "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n"
87 "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n"
88 "Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n"
89 "Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n"
90 "feature\t\t\t\t2\t1\tTARGETDIR\t0\n";
91
92static const CHAR feature_comp_dat[] = "Feature_\tComponent_\n"
93 "s38\ts72\n"
94 "FeatureComponents\tFeature_\tComponent_\n"
95 "Five\tFive\n"
96 "Four\tFour\n"
97 "One\tOne\n"
98 "Three\tThree\n"
99 "Two\tTwo\n"
100 "feature\tcomponent\n";
101
102static const CHAR file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
103 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
104 "File\tFile\n"
105 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
106 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
107 "one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n"
108 "three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n"
109 "two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n"
110 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n";
111
112static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
113 "s72\tS255\tI2\n"
114 "InstallExecuteSequence\tAction\n"
115 "AllocateRegistrySpace\tNOT Installed\t1550\n"
116 "CostFinalize\t\t1000\n"
117 "CostInitialize\t\t800\n"
118 "FileCost\t\t900\n"
119 "ResolveSource\t\t950\n"
120 "MoveFiles\t\t1700\n"
121 "InstallFiles\t\t4000\n"
122 "BindImage\t\t4100\n"
123 "DuplicateFiles\t\t4500\n"
124 "WriteEnvironmentStrings\t\t4550\n"
125 "CreateShortcuts\t\t4600\n"
126 "InstallFinalize\t\t6600\n"
127 "InstallInitialize\t\t1500\n"
128 "InstallValidate\t\t1400\n"
129 "LaunchConditions\t\t100\n"
130 "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000";
131
132static const CHAR media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
133 "i2\ti4\tL64\tS255\tS32\tS72\n"
134 "Media\tDiskId\n"
135 "1\t3\t\t\tDISK1\t\n"
136 "2\t5\t\tmsitest.cab\tDISK2\t\n";
137
138static const CHAR property_dat[] = "Property\tValue\n"
139 "s72\tl0\n"
140 "Property\tProperty\n"
141 "DefaultUIFont\tDlgFont8\n"
142 "HASUIRUN\t0\n"
143 "INSTALLLEVEL\t3\n"
144 "InstallMode\tTypical\n"
145 "Manufacturer\tWine\n"
146 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
147 "PRIMARYFOLDER\tTARGETDIR\n"
148 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
149 "ProductID\tnone\n"
150 "ProductLanguage\t1033\n"
151 "ProductName\tMSITEST\n"
152 "ProductVersion\t1.1.1\n"
153 "PROMPTROLLBACKCOST\tP\n"
154 "Setup\tSetup\n"
155 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
156 "AdminProperties\tPOSTADMIN\n"
157 "ROOTDRIVE\tC:\\\n"
158 "MSIFASTINSTALL\t1\n";
159
160static const CHAR aup_property_dat[] = "Property\tValue\n"
161 "s72\tl0\n"
162 "Property\tProperty\n"
163 "DefaultUIFont\tDlgFont8\n"
164 "HASUIRUN\t0\n"
165 "ALLUSERS\t1\n"
166 "INSTALLLEVEL\t3\n"
167 "InstallMode\tTypical\n"
168 "Manufacturer\tWine\n"
169 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
170 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
171 "ProductID\tnone\n"
172 "ProductLanguage\t1033\n"
173 "ProductName\tMSITEST\n"
174 "ProductVersion\t1.1.1\n"
175 "PROMPTROLLBACKCOST\tP\n"
176 "Setup\tSetup\n"
177 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
178 "AdminProperties\tPOSTADMIN\n"
179 "ROOTDRIVE\tC:\\\n"
180 "MSIFASTINSTALL\t1\n";
181
182static const CHAR aup2_property_dat[] = "Property\tValue\n"
183 "s72\tl0\n"
184 "Property\tProperty\n"
185 "DefaultUIFont\tDlgFont8\n"
186 "HASUIRUN\t0\n"
187 "ALLUSERS\t2\n"
188 "INSTALLLEVEL\t3\n"
189 "InstallMode\tTypical\n"
190 "Manufacturer\tWine\n"
191 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
192 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
193 "ProductID\tnone\n"
194 "ProductLanguage\t1033\n"
195 "ProductName\tMSITEST\n"
196 "ProductVersion\t1.1.1\n"
197 "PROMPTROLLBACKCOST\tP\n"
198 "Setup\tSetup\n"
199 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
200 "AdminProperties\tPOSTADMIN\n"
201 "ROOTDRIVE\tC:\\\n"
202 "MSIFASTINSTALL\t1\n";
203
204static const CHAR icon_property_dat[] = "Property\tValue\n"
205 "s72\tl0\n"
206 "Property\tProperty\n"
207 "DefaultUIFont\tDlgFont8\n"
208 "HASUIRUN\t0\n"
209 "INSTALLLEVEL\t3\n"
210 "InstallMode\tTypical\n"
211 "Manufacturer\tWine\n"
212 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
213 "ProductCode\t{7DF88A49-996F-4EC8-A022-BF956F9B2CBB}\n"
214 "ProductID\tnone\n"
215 "ProductLanguage\t1033\n"
216 "ProductName\tMSITEST\n"
217 "ProductVersion\t1.1.1\n"
218 "PROMPTROLLBACKCOST\tP\n"
219 "Setup\tSetup\n"
220 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
221 "AdminProperties\tPOSTADMIN\n"
222 "ROOTDRIVE\tC:\\\n"
223 "MSIFASTINSTALL\t1\n";
224
225static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"
226 "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n"
227 "Shortcut\tShortcut\n"
228 "Shortcut\tMSITESTDIR\tShortcut\tcomponent\tShortcut\t\tShortcut\t\t\t\t\t\n";
229
230static const CHAR condition_dat[] = "Feature_\tLevel\tCondition\n"
231 "s38\ti2\tS255\n"
232 "Condition\tFeature_\tLevel\n"
233 "One\t4\t1\n";
234
235static const CHAR up_property_dat[] = "Property\tValue\n"
236 "s72\tl0\n"
237 "Property\tProperty\n"
238 "DefaultUIFont\tDlgFont8\n"
239 "HASUIRUN\t0\n"
240 "INSTALLLEVEL\t3\n"
241 "InstallMode\tTypical\n"
242 "Manufacturer\tWine\n"
243 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
244 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
245 "ProductID\tnone\n"
246 "ProductLanguage\t1033\n"
247 "ProductName\tMSITEST\n"
248 "ProductVersion\t1.1.1\n"
249 "PROMPTROLLBACKCOST\tP\n"
250 "Setup\tSetup\n"
251 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
252 "AdminProperties\tPOSTADMIN\n"
253 "ROOTDRIVE\tC:\\\n"
254 "RemovePreviousVersions\t1\n"
255 "MSIFASTINSTALL\t1\n";
256
257static const CHAR up2_property_dat[] = "Property\tValue\n"
258 "s72\tl0\n"
259 "Property\tProperty\n"
260 "DefaultUIFont\tDlgFont8\n"
261 "HASUIRUN\t0\n"
262 "INSTALLLEVEL\t3\n"
263 "InstallMode\tTypical\n"
264 "Manufacturer\tWine\n"
265 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
266 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
267 "ProductID\tnone\n"
268 "ProductLanguage\t1033\n"
269 "ProductName\tMSITEST\n"
270 "ProductVersion\t1.1.2\n"
271 "PROMPTROLLBACKCOST\tP\n"
272 "Setup\tSetup\n"
273 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
274 "AdminProperties\tPOSTADMIN\n"
275 "ROOTDRIVE\tC:\\\n"
276 "MSIFASTINSTALL\t1\n";
277
278static const CHAR up3_property_dat[] = "Property\tValue\n"
279 "s72\tl0\n"
280 "Property\tProperty\n"
281 "DefaultUIFont\tDlgFont8\n"
282 "HASUIRUN\t0\n"
283 "INSTALLLEVEL\t3\n"
284 "InstallMode\tTypical\n"
285 "Manufacturer\tWine\n"
286 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
287 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
288 "ProductID\tnone\n"
289 "ProductLanguage\t1033\n"
290 "ProductName\tMSITEST\n"
291 "ProductVersion\t1.1.2\n"
292 "PROMPTROLLBACKCOST\tP\n"
293 "Setup\tSetup\n"
294 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
295 "AdminProperties\tPOSTADMIN\n"
296 "ROOTDRIVE\tC:\\\n"
297 "RemovePreviousVersions\t1\n"
298 "MSIFASTINSTALL\t1\n";
299
300static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
301 "s72\ti2\tl255\tL255\tL0\ts72\n"
302 "Registry\tRegistry\n"
303 "Apples\t1\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n"
304 "Oranges\t1\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n"
305 "regdata\t1\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n"
306 "OrderTest\t1\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent";
307
308/* tables for test_continuouscabs */
309static const CHAR cc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
310 "s72\tS38\ts72\ti2\tS255\tS72\n"
311 "Component\tComponent\n"
312 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
313 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
314 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
315
316static const CHAR cc2_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
317 "s72\tS38\ts72\ti2\tS255\tS72\n"
318 "Component\tComponent\n"
319 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
320 "augustus\t\tMSITESTDIR\t0\t0\taugustus\n"
321 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
322
323static const CHAR cc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
324 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
325 "Feature\tFeature\n"
326 "feature\t\t\t\t2\t1\tTARGETDIR\t0";
327
328static const CHAR cc_feature_comp_dat[] = "Feature_\tComponent_\n"
329 "s38\ts72\n"
330 "FeatureComponents\tFeature_\tComponent_\n"
331 "feature\tmaximus\n"
332 "feature\taugustus\n"
333 "feature\tcaesar";
334
335static const CHAR cc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
336 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
337 "File\tFile\n"
338 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
339 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
340 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
341
342static const CHAR cc2_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
343 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
344 "File\tFile\n"
345 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
346 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
347 "tiberius\tmaximus\ttiberius\t500\t\t\t16384\t3\n"
348 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
349
350static const CHAR cc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
351 "i2\ti4\tL64\tS255\tS32\tS72\n"
352 "Media\tDiskId\n"
353 "1\t10\t\ttest1.cab\tDISK1\t\n"
354 "2\t2\t\ttest2.cab\tDISK2\t\n"
355 "3\t12\t\ttest3.cab\tDISK3\t\n";
356
357static const CHAR cc3_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
358 "i2\ti4\tL64\tS255\tS32\tS72\n"
359 "Media\tDiskId\n"
360 "1\t10\t\ttest1.cab\tDISK1\t\n"
361 "2\t2\t\ttest2_.cab\tDISK2\t\n"
362 "3\t12\t\ttest3.cab\tDISK3\t\n";
363
364static const CHAR co_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
365 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
366 "File\tFile\n"
367 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
368 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
369 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
370
371static const CHAR co_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
372 "i2\ti4\tL64\tS255\tS32\tS72\n"
373 "Media\tDiskId\n"
374 "1\t10\t\ttest1.cab\tDISK1\t\n"
375 "2\t2\t\ttest2.cab\tDISK2\t\n"
376 "3\t3\t\ttest3.cab\tDISK3\t\n";
377
378static const CHAR co2_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
379 "i2\ti4\tL64\tS255\tS32\tS72\n"
380 "Media\tDiskId\n"
381 "1\t10\t\ttest1.cab\tDISK1\t\n"
382 "2\t12\t\ttest3.cab\tDISK3\t\n"
383 "3\t2\t\ttest2.cab\tDISK2\t\n";
384
385static const CHAR mm_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
386 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
387 "File\tFile\n"
388 "maximus\tmaximus\tmaximus\t500\t\t\t512\t1\n"
389 "augustus\taugustus\taugustus\t500\t\t\t512\t2\n"
390 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
391
392static const CHAR mm_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
393 "i2\ti4\tL64\tS255\tS32\tS72\n"
394 "Media\tDiskId\n"
395 "1\t3\t\ttest1.cab\tDISK1\t\n";
396
397static const CHAR ss_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
398 "i2\ti4\tL64\tS255\tS32\tS72\n"
399 "Media\tDiskId\n"
400 "1\t2\t\ttest1.cab\tDISK1\t\n"
401 "2\t2\t\ttest2.cab\tDISK2\t\n"
402 "3\t12\t\ttest3.cab\tDISK3\t\n";
403
404/* tables for test_uiLevelFlags */
405static const CHAR ui_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
406 "s72\tS38\ts72\ti2\tS255\tS72\n"
407 "Component\tComponent\n"
408 "maximus\t\tMSITESTDIR\t0\tHASUIRUN=1\tmaximus\n"
409 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
410 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
411
412static const CHAR ui_install_ui_seq_dat[] = "Action\tCondition\tSequence\n"
413 "s72\tS255\tI2\n"
414 "InstallUISequence\tAction\n"
415 "SetUIProperty\t\t5\n"
416 "ExecuteAction\t\t1100\n";
417
418static const CHAR ui_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
419 "s72\ti2\tS64\tS0\tS255\n"
420 "CustomAction\tAction\n"
421 "SetUIProperty\t51\tHASUIRUN\t1\t\n";
422
423static const CHAR rof_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
424 "s72\tS38\ts72\ti2\tS255\tS72\n"
425 "Component\tComponent\n"
426 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n";
427
428static const CHAR rof_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
429 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
430 "Feature\tFeature\n"
431 "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n"
432 "montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0";
433
434static const CHAR rof_feature_comp_dat[] = "Feature_\tComponent_\n"
435 "s38\ts72\n"
436 "FeatureComponents\tFeature_\tComponent_\n"
437 "feature\tmaximus\n"
438 "montecristo\tmaximus";
439
440static const CHAR rof_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
441 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
442 "File\tFile\n"
443 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1";
444
445static const CHAR rof_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
446 "i2\ti4\tL64\tS255\tS32\tS72\n"
447 "Media\tDiskId\n"
448 "1\t1\t\t\tDISK1\t\n";
449
450static const CHAR rofc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
451 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
452 "File\tFile\n"
453 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1";
454
455static const CHAR rofc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
456 "i2\ti4\tL64\tS255\tS32\tS72\n"
457 "Media\tDiskId\n"
458 "1\t1\t\ttest1.cab\tDISK1\t\n";
459
460static const CHAR sdp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
461 "s72\tS255\tI2\n"
462 "InstallExecuteSequence\tAction\n"
463 "AllocateRegistrySpace\tNOT Installed\t1550\n"
464 "CostFinalize\t\t1000\n"
465 "CostInitialize\t\t800\n"
466 "FileCost\t\t900\n"
467 "InstallFiles\t\t4000\n"
468 "InstallFinalize\t\t6600\n"
469 "InstallInitialize\t\t1500\n"
470 "InstallValidate\t\t1400\n"
471 "LaunchConditions\t\t100\n"
472 "SetDirProperty\t\t950";
473
474static const CHAR sdp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
475 "s72\ti2\tS64\tS0\tS255\n"
476 "CustomAction\tAction\n"
477 "SetDirProperty\t51\tMSITESTDIR\t[CommonFilesFolder]msitest\\\t\n";
478
479static const CHAR pv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
480 "s72\tS255\tI2\n"
481 "InstallExecuteSequence\tAction\n"
482 "LaunchConditions\t\t100\n"
483 "CostInitialize\t\t800\n"
484 "FileCost\t\t900\n"
485 "CostFinalize\t\t1000\n"
486 "InstallValidate\t\t1400\n"
487 "InstallInitialize\t\t1500\n"
488 "InstallFiles\t\t4000\n"
489 "InstallFinalize\t\t6600\n";
490
491static const CHAR cie_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
492 "s72\tS38\ts72\ti2\tS255\tS72\n"
493 "Component\tComponent\n"
494 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
495 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
496 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
497 "gaius\t\tMSITESTDIR\t0\t1\tgaius\n";
498
499static const CHAR cie_feature_comp_dat[] = "Feature_\tComponent_\n"
500 "s38\ts72\n"
501 "FeatureComponents\tFeature_\tComponent_\n"
502 "feature\tmaximus\n"
503 "feature\taugustus\n"
504 "feature\tcaesar\n"
505 "feature\tgaius";
506
507static const CHAR cie_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
508 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
509 "File\tFile\n"
510 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
511 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
512 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12\n"
513 "gaius\tgaius\tgaius\t500\t\t\t8192\t11";
514
515static const CHAR cie_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
516 "i2\ti4\tL64\tS255\tS32\tS72\n"
517 "Media\tDiskId\n"
518 "1\t1\t\ttest1.cab\tDISK1\t\n"
519 "2\t2\t\ttest2.cab\tDISK2\t\n"
520 "3\t12\t\ttest3.cab\tDISK3\t\n";
521
522static const CHAR ci_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
523 "s72\tS38\ts72\ti2\tS255\tS72\n"
524 "Component\tComponent\n"
525 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n";
526
527static const CHAR ci2_feature_comp_dat[] = "Feature_\tComponent_\n"
528 "s38\ts72\n"
529 "FeatureComponents\tFeature_\tComponent_\n"
530 "feature\taugustus";
531
532static const CHAR ci2_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
533 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
534 "File\tFile\n"
535 "augustus\taugustus\taugustus\t500\t\t\t8192\t1";
536
537static const CHAR pp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
538 "s72\tS255\tI2\n"
539 "InstallExecuteSequence\tAction\n"
540 "ValidateProductID\t\t700\n"
541 "CostInitialize\t\t800\n"
542 "FileCost\t\t900\n"
543 "CostFinalize\t\t1000\n"
544 "InstallValidate\t\t1400\n"
545 "InstallInitialize\t\t1500\n"
546 "ProcessComponents\tPROCESS_COMPONENTS=1 Or FULL=1\t1600\n"
547 "UnpublishFeatures\tUNPUBLISH_FEATURES=1 Or FULL=1\t1800\n"
548 "RemoveFiles\t\t3500\n"
549 "InstallFiles\t\t4000\n"
550 "RegisterUser\tREGISTER_USER=1 Or FULL=1\t6000\n"
551 "RegisterProduct\tREGISTER_PRODUCT=1 Or FULL=1\t6100\n"
552 "PublishFeatures\tPUBLISH_FEATURES=1 Or FULL=1\t6300\n"
553 "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n"
554 "InstallFinalize\t\t6600";
555
556static const CHAR tp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
557 "s72\tS38\ts72\ti2\tS255\tS72\n"
558 "Component\tComponent\n"
559 "augustus\t\tMSITESTDIR\t0\tprop=\"val\"\taugustus\n";
560
561static const CHAR cwd_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
562 "s72\tS38\ts72\ti2\tS255\tS72\n"
563 "Component\tComponent\n"
564 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
565
566static const CHAR adm_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
567 "s72\tS38\ts72\ti2\tS255\tS72\n"
568 "Component\tComponent\n"
569 "augustus\t\tMSITESTDIR\t0\tPOSTADMIN=1\taugustus";
570
571static const CHAR adm_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
572 "s72\ti2\tS64\tS0\tS255\n"
573 "CustomAction\tAction\n"
574 "SetPOSTADMIN\t51\tPOSTADMIN\t1\t\n";
575
576static const CHAR adm_admin_exec_seq_dat[] = "Action\tCondition\tSequence\n"
577 "s72\tS255\tI2\n"
578 "AdminExecuteSequence\tAction\n"
579 "CostFinalize\t\t1000\n"
580 "CostInitialize\t\t800\n"
581 "FileCost\t\t900\n"
582 "SetPOSTADMIN\t\t950\n"
583 "InstallFiles\t\t4000\n"
584 "InstallFinalize\t\t6600\n"
585 "InstallInitialize\t\t1500\n"
586 "InstallValidate\t\t1400\n"
587 "LaunchConditions\t\t100";
588
589static const CHAR amp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
590 "s72\tS38\ts72\ti2\tS255\tS72\n"
591 "Component\tComponent\n"
592 "augustus\t\tMSITESTDIR\t0\tMYPROP=2718 and MyProp=42\taugustus\n";
593
594static const CHAR rem_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
595 "s72\tS255\tI2\n"
596 "InstallExecuteSequence\tAction\n"
597 "ValidateProductID\t\t700\n"
598 "CostInitialize\t\t800\n"
599 "FileCost\t\t900\n"
600 "CostFinalize\t\t1000\n"
601 "InstallValidate\t\t1400\n"
602 "InstallInitialize\t\t1500\n"
603 "ProcessComponents\t\t1600\n"
604 "UnpublishFeatures\t\t1800\n"
605 "RemoveFiles\t\t3500\n"
606 "InstallFiles\t\t4000\n"
607 "RegisterProduct\t\t6100\n"
608 "PublishFeatures\t\t6300\n"
609 "PublishProduct\t\t6400\n"
610 "InstallFinalize\t\t6600";
611
612static const CHAR mc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
613 "s72\tS38\ts72\ti2\tS255\tS72\n"
614 "Component\tComponent\n"
615 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
616 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
617 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
618 "gaius\t\tMSITESTDIR\t0\tGAIUS=1\tgaius\n"
619 "tiberius\t\tMSITESTDIR\t0\t\ttiberius\n";
620
621static const CHAR mc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
622 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
623 "File\tFile\n"
624 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
625 "augustus\taugustus\taugustus\t500\t\t\t0\t2\n"
626 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3\n"
627 "gaius\tgaius\tgaius\t500\t\t\t16384\t4\n"
628 "tiberius\ttiberius\ttiberius\t500\t\t\t0\t5\n";
629
630static const CHAR mc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
631 "i2\ti4\tL64\tS255\tS32\tS72\n"
632 "Media\tDiskId\n"
633 "1\t1\t\ttest1.cab\tDISK1\t\n"
634 "2\t2\t\ttest2.cab\tDISK2\t\n"
635 "3\t3\t\ttest3.cab\tDISK3\t\n"
636 "4\t4\t\ttest3.cab\tDISK3\t\n"
637 "5\t5\t\ttest4.cab\tDISK4\t\n";
638
639static const CHAR mc_file_hash_dat[] = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"
640 "s72\ti2\ti4\ti4\ti4\ti4\n"
641 "MsiFileHash\tFile_\n"
642 "caesar\t0\t850433704\t-241429251\t675791761\t-1221108824";
643
644static const CHAR wrv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
645 "s72\tS38\ts72\ti2\tS255\tS72\n"
646 "Component\tComponent\n"
647 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
648
649static const CHAR ca1_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
650 "s72\tS255\tI2\n"
651 "InstallExecuteSequence\tAction\n"
652 "CostInitialize\t\t100\n"
653 "FileCost\t\t200\n"
654 "CostFinalize\t\t300\n"
655 "InstallValidate\t\t400\n"
656 "InstallInitialize\t\t500\n"
657 "embednull\t\t600\n"
658 "maintest\tMAIN_TEST\t700\n"
659 "testretval\tTEST_RETVAL\t710\n"
660 "process1\tTEST_PROCESS\t720\n"
661 "process2\tTEST_PROCESS\t721\n"
662 "process_deferred\tTEST_PROCESS\t722\n"
663 "async1\tTEST_ASYNC\t730\n"
664 "async2\tTEST_ASYNC\t731\n"
665 "InstallFinalize\t\t800\n";
666
667static const CHAR ca1_custom_action_dat[] = "Action\tType\tSource\tTarget\n"
668 "s72\ti2\tS64\tS0\n"
669 "CustomAction\tAction\n"
670 "embednull\t51\tembednullprop\ta[~]b\n"
671 "nested51\t51\tnested\t1\n"
672 "nested1\t1\tcustom.dll\tnested\n"
673 "maintest\t1\tcustom.dll\tmain_test\n"
674 "process1\t1\tcustom.dll\tprocess1\n"
675 "process2\t1\tcustom.dll\tprocess2\n"
676 "process_deferred\t1025\tcustom.dll\tprocess2\n"
677 "async1\t129\tcustom.dll\tasync1\n"
678 "async2\t1\tcustom.dll\tasync2\n"
679 "testretval\t1\tcustom.dll\ttest_retval\n";
680
681static const CHAR ca1_test_seq_dat[] = "Action\tCondition\tSequence\n"
682 "s72\tS255\tI2\n"
683 "TestSequence\tAction\n"
684 "nested1\t\t1\n"
685 "nested51\t\t2\n";
686
687static const CHAR ca1_test2_dat[] =
688 "A\tB\n"
689 "i2\ti2\n"
690 "test2\tA\n"
691 "1\t2\n";
692
693static const CHAR ca1__validation_dat[] =
694 "Table\tColumn\tNullable\tMinValue\tMaxValue\tKeyTable\tKeyColumn\tCategory\tSet\tDescription\n"
695 "s32\ts32\ts4\tI4\tI4\tS255\tI2\tS32\tS255\tS255\n"
696 "_Validation\tTable\tColumn\n"
697 "test2\tA\tN\t\t\t\t\t\t\t\n"
698 "test2\tB\tN\t\t\t\t\t\t\t\n";
699
700static const CHAR ca51_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
701 "s72\tS38\ts72\ti2\tS255\tS72\n"
702 "Component\tComponent\n"
703 "augustus\t\tMSITESTDIR\t0\tMYPROP=42\taugustus\n";
704
705static const CHAR ca51_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
706 "s72\tS255\tI2\n"
707 "InstallExecuteSequence\tAction\n"
708 "ValidateProductID\t\t700\n"
709 "GoodSetProperty\t\t725\n"
710 "BadSetProperty\t\t750\n"
711 "CostInitialize\t\t800\n"
712 "ResolveSource\t\t810\n"
713 "FileCost\t\t900\n"
714 "SetSourceDir\tSRCDIR\t910\n"
715 "CostFinalize\t\t1000\n"
716 "InstallValidate\t\t1400\n"
717 "InstallInitialize\t\t1500\n"
718 "InstallFiles\t\t4000\n"
719 "InstallFinalize\t\t6600";
720
721static const CHAR ca51_custom_action_dat[] = "Action\tType\tSource\tTarget\n"
722 "s72\ti2\tS64\tS0\n"
723 "CustomAction\tAction\n"
724 "GoodSetProperty\t51\tMYPROP\t42\n"
725 "BadSetProperty\t51\t\tMYPROP\n"
726 "SetSourceDir\t51\tSourceDir\t[SRCDIR]\n";
727
728static const CHAR is_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
729 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
730 "Feature\tFeature\n"
731 "one\t\t\t\t2\t1\t\t0\n" /* favorLocal */
732 "two\t\t\t\t2\t1\t\t1\n" /* favorSource */
733 "three\t\t\t\t2\t1\t\t4\n" /* favorAdvertise */
734 "four\t\t\t\t2\t0\t\t0"; /* disabled */
735
736static const CHAR is_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
737 "s72\tS38\ts72\ti2\tS255\tS72\n"
738 "Component\tComponent\n"
739 "alpha\t\tMSITESTDIR\t0\t\talpha_file\n" /* favorLocal:Local */
740 "beta\t\tMSITESTDIR\t1\t\tbeta_file\n" /* favorLocal:Source */
741 "gamma\t\tMSITESTDIR\t2\t\tgamma_file\n" /* favorLocal:Optional */
742 "theta\t\tMSITESTDIR\t0\t\ttheta_file\n" /* favorSource:Local */
743 "delta\t\tMSITESTDIR\t1\t\tdelta_file\n" /* favorSource:Source */
744 "epsilon\t\tMSITESTDIR\t2\t\tepsilon_file\n" /* favorSource:Optional */
745 "zeta\t\tMSITESTDIR\t0\t\tzeta_file\n" /* favorAdvertise:Local */
746 "iota\t\tMSITESTDIR\t1\t\tiota_file\n" /* favorAdvertise:Source */
747 "eta\t\tMSITESTDIR\t2\t\teta_file\n" /* favorAdvertise:Optional */
748 "kappa\t\tMSITESTDIR\t0\t\tkappa_file\n" /* disabled:Local */
749 "lambda\t\tMSITESTDIR\t1\t\tlambda_file\n" /* disabled:Source */
750 "mu\t\tMSITESTDIR\t2\t\tmu_file\n"; /* disabled:Optional */
751
752static const CHAR is_feature_comp_dat[] = "Feature_\tComponent_\n"
753 "s38\ts72\n"
754 "FeatureComponents\tFeature_\tComponent_\n"
755 "one\talpha\n"
756 "one\tbeta\n"
757 "one\tgamma\n"
758 "two\ttheta\n"
759 "two\tdelta\n"
760 "two\tepsilon\n"
761 "three\tzeta\n"
762 "three\tiota\n"
763 "three\teta\n"
764 "four\tkappa\n"
765 "four\tlambda\n"
766 "four\tmu";
767
768static const CHAR is_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
769 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
770 "File\tFile\n"
771 "alpha_file\talpha\talpha\t500\t\t\t8192\t1\n"
772 "beta_file\tbeta\tbeta\t500\t\t\t8291\t2\n"
773 "gamma_file\tgamma\tgamma\t500\t\t\t8192\t3\n"
774 "theta_file\ttheta\ttheta\t500\t\t\t8192\t4\n"
775 "delta_file\tdelta\tdelta\t500\t\t\t8192\t5\n"
776 "epsilon_file\tepsilon\tepsilon\t500\t\t\t8192\t6\n"
777 "zeta_file\tzeta\tzeta\t500\t\t\t8192\t7\n"
778 "iota_file\tiota\tiota\t500\t\t\t8192\t8\n"
779 "eta_file\teta\teta\t500\t\t\t8192\t9\n"
780 "kappa_file\tkappa\tkappa\t500\t\t\t8192\t10\n"
781 "lambda_file\tlambda\tlambda\t500\t\t\t8192\t11\n"
782 "mu_file\tmu\tmu\t500\t\t\t8192\t12";
783
784static const CHAR is_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
785 "i2\ti4\tL64\tS255\tS32\tS72\n"
786 "Media\tDiskId\n"
787 "1\t12\t\t\tDISK1\t\n";
788
789static const CHAR sp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
790 "s72\tS38\ts72\ti2\tS255\tS72\n"
791 "Component\tComponent\n"
792 "augustus\t\tTWODIR\t0\t\taugustus\n";
793
794static const CHAR sp_directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n"
795 "s72\tS72\tl255\n"
796 "Directory\tDirectory\n"
797 "TARGETDIR\t\tSourceDir\n"
798 "ProgramFilesFolder\tTARGETDIR\t.\n"
799 "MSITESTDIR\tProgramFilesFolder\tmsitest:.\n"
800 "ONEDIR\tMSITESTDIR\t.:shortone|longone\n"
801 "TWODIR\tONEDIR\t.:shorttwo|longtwo";
802
803static const CHAR mcp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
804 "s72\tS38\ts72\ti2\tS255\tS72\n"
805 "Component\tComponent\n"
806 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t2\t\thydrogen\n"
807 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t2\t\thelium\n"
808 "lithium\t{4AF28FFC-71C7-4307-BDE4-B77C5338F56F}\tMSITESTDIR\t2\tPROPVAR=42\tlithium\n";
809
810static const CHAR mcp_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
811 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
812 "Feature\tFeature\n"
813 "hydroxyl\t\thydroxyl\thydroxyl\t2\t1\tTARGETDIR\t0\n"
814 "heliox\t\theliox\theliox\t2\t5\tTARGETDIR\t0\n"
815 "lithia\t\tlithia\tlithia\t2\t10\tTARGETDIR\t0";
816
817static const CHAR mcp_feature_comp_dat[] = "Feature_\tComponent_\n"
818 "s38\ts72\n"
819 "FeatureComponents\tFeature_\tComponent_\n"
820 "hydroxyl\thydrogen\n"
821 "heliox\thelium\n"
822 "lithia\tlithium";
823
824static const CHAR mcp_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
825 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
826 "File\tFile\n"
827 "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n"
828 "helium\thelium\thelium\t0\t\t\t8192\t1\n"
829 "lithium\tlithium\tlithium\t0\t\t\t8192\t1\n"
830 "beryllium\tmissingcomp\tberyllium\t0\t\t\t8192\t1";
831
832static const CHAR ai_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
833 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
834 "File\tFile\n"
835 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
836 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
837 "one.txt\tOne\tone.txt\t1000\t\t\t16384\t1\n"
838 "three.txt\tThree\tthree.txt\t1000\t\t\t16384\t3\n"
839 "two.txt\tTwo\ttwo.txt\t1000\t\t\t16384\t2\n"
840 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n";
841
842static const CHAR ip_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
843 "s72\tS255\tI2\n"
844 "InstallExecuteSequence\tAction\n"
845 "CostFinalize\t\t1000\n"
846 "ValidateProductID\t\t700\n"
847 "CostInitialize\t\t800\n"
848 "FileCost\t\t900\n"
849 "RemoveFiles\t\t3500\n"
850 "InstallFiles\t\t4000\n"
851 "RegisterUser\t\t6000\n"
852 "RegisterProduct\t\t6100\n"
853 "PublishFeatures\t\t6300\n"
854 "PublishProduct\t\t6400\n"
855 "InstallFinalize\t\t6600\n"
856 "InstallInitialize\t\t1500\n"
857 "ProcessComponents\t\t1600\n"
858 "UnpublishFeatures\t\t1800\n"
859 "InstallValidate\t\t1400\n"
860 "LaunchConditions\t\t100\n"
861 "TestInstalledProp\tInstalled AND NOT REMOVE\t950\n";
862
863static const CHAR ip_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
864 "s72\ti2\tS64\tS0\tS255\n"
865 "CustomAction\tAction\n"
866 "TestInstalledProp\t19\t\tTest failed\t\n";
867
868static const CHAR aup_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
869 "s72\tS255\tI2\n"
870 "InstallExecuteSequence\tAction\n"
871 "CostFinalize\t\t1000\n"
872 "ValidateProductID\t\t700\n"
873 "CostInitialize\t\t800\n"
874 "FileCost\t\t900\n"
875 "RemoveFiles\t\t3500\n"
876 "InstallFiles\t\t4000\n"
877 "RegisterUser\t\t6000\n"
878 "RegisterProduct\t\t6100\n"
879 "PublishFeatures\t\t6300\n"
880 "PublishProduct\t\t6400\n"
881 "InstallFinalize\t\t6600\n"
882 "InstallInitialize\t\t1500\n"
883 "ProcessComponents\t\t1600\n"
884 "UnpublishFeatures\t\t1800\n"
885 "InstallValidate\t\t1400\n"
886 "LaunchConditions\t\t100\n"
887 "TestAllUsersProp\tALLUSERS AND NOT REMOVE\t50\n";
888
889static const CHAR aup2_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
890 "s72\tS255\tI2\n"
891 "InstallExecuteSequence\tAction\n"
892 "CostFinalize\t\t1000\n"
893 "ValidateProductID\t\t700\n"
894 "CostInitialize\t\t800\n"
895 "FileCost\t\t900\n"
896 "RemoveFiles\t\t3500\n"
897 "InstallFiles\t\t4000\n"
898 "RegisterUser\t\t6000\n"
899 "RegisterProduct\t\t6100\n"
900 "PublishFeatures\t\t6300\n"
901 "PublishProduct\t\t6400\n"
902 "InstallFinalize\t\t6600\n"
903 "InstallInitialize\t\t1500\n"
904 "ProcessComponents\t\t1600\n"
905 "UnpublishFeatures\t\t1800\n"
906 "InstallValidate\t\t1400\n"
907 "LaunchConditions\t\t100\n"
908 "TestAllUsersProp\tALLUSERS=2 AND NOT REMOVE\t50\n";
909
910static const CHAR aup3_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
911 "s72\tS255\tI2\n"
912 "InstallExecuteSequence\tAction\n"
913 "CostFinalize\t\t1000\n"
914 "ValidateProductID\t\t700\n"
915 "CostInitialize\t\t800\n"
916 "FileCost\t\t900\n"
917 "RemoveFiles\t\t3500\n"
918 "InstallFiles\t\t4000\n"
919 "RegisterUser\t\t6000\n"
920 "RegisterProduct\t\t6100\n"
921 "PublishFeatures\t\t6300\n"
922 "PublishProduct\t\t6400\n"
923 "InstallFinalize\t\t6600\n"
924 "InstallInitialize\t\t1500\n"
925 "ProcessComponents\t\t1600\n"
926 "UnpublishFeatures\t\t1800\n"
927 "InstallValidate\t\t1400\n"
928 "LaunchConditions\t\t100\n"
929 "TestAllUsersProp\tALLUSERS=1 AND NOT REMOVE\t50\n";
930
931static const CHAR aup_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
932 "s72\ti2\tS64\tS0\tS255\n"
933 "CustomAction\tAction\n"
934 "TestAllUsersProp\t19\t\tTest failed\t\n";
935
936static const CHAR fo_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
937 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
938 "File\tFile\n"
939 "override.txt\toverride\toverride.txt\t1000\t\t\t8192\t1\n"
940 "preselected.txt\tpreselected\tpreselected.txt\t1000\t\t\t8192\t2\n"
941 "notpreselected.txt\tnotpreselected\tnotpreselected.txt\t1000\t\t\t8192\t3\n";
942
943static const CHAR fo_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
944 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
945 "Feature\tFeature\n"
946 "override\t\t\toverride feature\t1\t1\tMSITESTDIR\t0\n"
947 "preselected\t\t\tpreselected feature\t1\t1\tMSITESTDIR\t0\n"
948 "notpreselected\t\t\tnotpreselected feature\t1\t1\tMSITESTDIR\t0\n";
949
950static const CHAR fo_condition_dat[] = "Feature_\tLevel\tCondition\n"
951 "s38\ti2\tS255\n"
952 "Condition\tFeature_\tLevel\n"
953 "preselected\t0\tPreselected AND NOT REMOVE\n"
954 "notpreselected\t0\tNOT Preselected AND NOT REMOVE\n";
955
956static const CHAR fo_feature_comp_dat[] = "Feature_\tComponent_\n"
957 "s38\ts72\n"
958 "FeatureComponents\tFeature_\tComponent_\n"
959 "override\toverride\n"
960 "preselected\tpreselected\n"
961 "notpreselected\tnotpreselected\n";
962
963static const CHAR fo_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
964 "s72\tS38\ts72\ti2\tS255\tS72\n"
965 "Component\tComponent\n"
966 "override\t{0A00FB1D-97B0-4B42-ADF0-BB8913416623}\tMSITESTDIR\t0\t\toverride.txt\n"
967 "preselected\t{44E1DB75-605A-43DD-8CF5-CAB17F1BBD60}\tMSITESTDIR\t0\t\tpreselected.txt\n"
968 "notpreselected\t{E1647733-5E75-400A-A92E-5E60B4D4EF9F}\tMSITESTDIR\t0\t\tnotpreselected.txt\n";
969
970static const CHAR fo_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
971 "s72\ti2\tS64\tS0\tS255\n"
972 "CustomAction\tAction\n"
973 "SetPreselected\t51\tPreselected\t1\t\n";
974
975static const CHAR fo_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
976 "s72\tS255\tI2\n"
977 "InstallExecuteSequence\tAction\n"
978 "LaunchConditions\t\t100\n"
979 "SetPreselected\tpreselect=1\t200\n"
980 "CostInitialize\t\t800\n"
981 "FileCost\t\t900\n"
982 "CostFinalize\t\t1000\n"
983 "InstallValidate\t\t1400\n"
984 "InstallInitialize\t\t1500\n"
985 "ProcessComponents\t\t1600\n"
986 "RemoveFiles\t\t1700\n"
987 "InstallFiles\t\t2000\n"
988 "RegisterProduct\t\t5000\n"
989 "PublishFeatures\t\t5100\n"
990 "PublishProduct\t\t5200\n"
991 "UnpublishFeatures\t\t5300\n"
992 "InstallFinalize\t\t6000\n";
993
994static const CHAR uc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
995 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
996 "File\tFile\n"
997 "upgradecode.txt\tupgradecode\tupgradecode.txt\t1000\t\t\t8192\t1\n";
998
999static const CHAR uc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1000 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1001 "Feature\tFeature\n"
1002 "upgradecode\t\t\tupgradecode feature\t1\t2\tMSITESTDIR\t0\n";
1003
1004static const CHAR uc_feature_comp_dat[] = "Feature_\tComponent_\n"
1005 "s38\ts72\n"
1006 "FeatureComponents\tFeature_\tComponent_\n"
1007 "upgradecode\tupgradecode\n";
1008
1009static const CHAR uc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1010 "s72\tS38\ts72\ti2\tS255\tS72\n"
1011 "Component\tComponent\n"
1012 "upgradecode\t{6952B732-2FCB-4E47-976F-989FCBD7EDFB}\tMSITESTDIR\t0\t\tupgradecode.txt\n";
1013
1014static const CHAR uc_property_dat[] = "Property\tValue\n"
1015 "s72\tl0\n"
1016 "Property\tProperty\n"
1017 "INSTALLLEVEL\t3\n"
1018 "ProductCode\t{E5FB1241-F547-4BA7-A60E-8E75797268D4}\n"
1019 "ProductName\tMSITEST\n"
1020 "ProductVersion\t1.1.1\n"
1021 "UpgradeCode\t#UPGEADECODE#\n"
1022 "MSIFASTINSTALL\t1\n";
1023
1024static const CHAR uc_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1025 "s72\tS255\tI2\n"
1026 "InstallExecuteSequence\tAction\n"
1027 "LaunchConditions\t\t100\n"
1028 "CostInitialize\t\t200\n"
1029 "FileCost\t\t300\n"
1030 "CostFinalize\t\t400\n"
1031 "InstallInitialize\t\t500\n"
1032 "ProcessComponents\t\t600\n"
1033 "InstallValidate\t\t700\n"
1034 "RemoveFiles\t\t800\n"
1035 "InstallFiles\t\t900\n"
1036 "RegisterProduct\t\t1000\n"
1037 "PublishFeatures\t\t1100\n"
1038 "PublishProduct\t\t1200\n"
1039 "UnpublishFeatures\t\t1250\n"
1040 "InstallFinalize\t\t1300\n";
1041
1042static const char mixed_feature_dat[] =
1043 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1044 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1045 "Feature\tFeature\n"
1046 "feature1\t\t\t\t1\t2\tMSITESTDIR\t0\n"
1047 "feature2\t\t\t\t1\t2\tMSITESTDIR\t0\n";
1048
1049static const char mixed_feature_comp_dat[] =
1050 "Feature_\tComponent_\n"
1051 "s38\ts72\n"
1052 "FeatureComponents\tFeature_\tComponent_\n"
1053 "feature1\tcomp1\n"
1054 "feature2\tcomp2\n";
1055
1056static const char mixed_component_dat[] =
1057 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1058 "s72\tS38\ts72\ti2\tS255\tS72\n"
1059 "Component\tComponent\n"
1060 "comp1\t{DE9F0EF4-0ED3-495A-8105-060C0EA457B8}\tTARGETDIR\t4\t\tregdata1\n"
1061 "comp2\t{4912DBE7-FC3A-4F91-BB5C-88F5C15C19A5}\tTARGETDIR\t260\t\tregdata2\n";
1062
1063static const char mixed_registry_dat[] =
1064 "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
1065 "s72\ti2\tl255\tL255\tL0\ts72\n"
1066 "Registry\tRegistry\n"
1067 "regdata1\t2\tSOFTWARE\\Wine\\msitest\ttest1\t\tcomp1\n"
1068 "regdata2\t2\tSOFTWARE\\Wine\\msitest\ttest2\t\tcomp2\n"
1069 "regdata3\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\t\tCLSID_Winetest32\tcomp1\n"
1070 "regdata4\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32\t\twinetest32.dll\tcomp1\n"
1071 "regdata5\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\t\tCLSID_Winetest64\tcomp2\n"
1072 "regdata6\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32\t\twinetest64.dll\tcomp2\n";
1073
1074static const char mixed_install_exec_seq_dat[] =
1075 "Action\tCondition\tSequence\n"
1076 "s72\tS255\tI2\n"
1077 "InstallExecuteSequence\tAction\n"
1078 "LaunchConditions\t\t100\n"
1079 "CostInitialize\t\t200\n"
1080 "FileCost\t\t300\n"
1081 "CostFinalize\t\t400\n"
1082 "InstallValidate\t\t500\n"
1083 "InstallInitialize\t\t600\n"
1084 "ProcessComponents\t\t700\n"
1085 "UnpublishFeatures\t\t800\n"
1086 "RemoveRegistryValues\t\t900\n"
1087 "WriteRegistryValues\t\t1000\n"
1088 "RegisterProduct\t\t1100\n"
1089 "PublishFeatures\t\t1200\n"
1090 "PublishProduct\t\t1300\n"
1091 "InstallFinalize\t\t1400\n";
1092
1093static const char vp_file_dat[] =
1094 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1095 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1096 "File\tFile\n"
1097 "volumeprop\tcomp\tvolumeprop.txt\t1000\t\t\t8192\t1\n";
1098
1099static const char vp_feature_dat[] =
1100 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1101 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1102 "Feature\tFeature\n"
1103 "feature\t\t\t\t1\t2\tMSITESTDIR\t0\n";
1104
1105static const char vp_feature_comp_dat[] =
1106 "Feature_\tComponent_\n"
1107 "s38\ts72\n"
1108 "FeatureComponents\tFeature_\tComponent_\n"
1109 "feature\tcomp\n";
1110
1111static const char vp_component_dat[] =
1112 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1113 "s72\tS38\ts72\ti2\tS255\tS72\n"
1114 "Component\tComponent\n"
1115 "comp\t{24364AE7-5B7F-496C-AF5A-54893639C567}\tMSITESTDIR\t0\t\tvolumeprop\n";
1116
1117static const char vp_custom_action_dat[] =
1118 "Action\tType\tSource\tTarget\tISComments\n"
1119 "s72\ti2\tS64\tS0\tS255\n"
1120 "CustomAction\tAction\n"
1121 "TestPrimaryVolumePath0\t19\t\tPrimaryVolumePath set before CostFinalize\t\n"
1122 "TestPrimaryVolumeSpaceAvailable0\t19\t\tPrimaryVolumeSpaceAvailable set before CostFinalize\t\n"
1123 "TestPrimaryVolumeSpaceRequired0\t19\t\tPrimaryVolumeSpaceRequired set before CostFinalize\t\n"
1124 "TestPrimaryVolumeSpaceRemaining0\t19\t\tPrimaryVolumeSpaceRemaining set before CostFinalize\t\n"
1125 "TestPrimaryVolumePath1\t19\t\tPrimaryVolumePath set before InstallValidate\t\n"
1126 "TestPrimaryVolumeSpaceAvailable1\t19\t\tPrimaryVolumeSpaceAvailable not set before InstallValidate\t\n"
1127 "TestPrimaryVolumeSpaceRequired1\t19\t\tPrimaryVolumeSpaceRequired not set before InstallValidate\t\n"
1128 "TestPrimaryVolumeSpaceRemaining1\t19\t\tPrimaryVolumeSpaceRemaining not set before InstallValidate\t\n"
1129 "TestPrimaryVolumePath2\t19\t\tPrimaryVolumePath not set after InstallValidate\t\n"
1130 "TestPrimaryVolumeSpaceAvailable2\t19\t\tPrimaryVolumeSpaceAvailable not set after InstallValidate\t\n"
1131 "TestPrimaryVolumeSpaceRequired2\t19\t\tPrimaryVolumeSpaceRequired not set after InstallValidate\t\n"
1132 "TestPrimaryVolumeSpaceRemaining2\t19\t\tPrimaryVolumeSpaceRemaining not set after InstallValidate\t\n";
1133
1134static const char vp_install_exec_seq_dat[] =
1135 "Action\tCondition\tSequence\n"
1136 "s72\tS255\tI2\n"
1137 "InstallExecuteSequence\tAction\n"
1138 "LaunchConditions\t\t100\n"
1139 "CostInitialize\t\t200\n"
1140 "FileCost\t\t300\n"
1141 "TestPrimaryVolumePath0\tPrimaryVolumePath AND NOT REMOVE\t400\n"
1142 "TestPrimaryVolumeSpaceAvailable0\tPrimaryVolumeSpaceAvailable AND NOT REMOVE\t500\n"
1143 "TestPrimaryVolumeSpaceRequired0\tPrimaryVolumeSpaceRequired AND NOT REMOVE\t510\n"
1144 "TestPrimaryVolumeSpaceRemaining0\tPrimaryVolumeSpaceRemaining AND NOT REMOVE\t520\n"
1145 "CostFinalize\t\t600\n"
1146 "TestPrimaryVolumePath1\tPrimaryVolumePath AND NOT REMOVE\t600\n"
1147 "TestPrimaryVolumeSpaceAvailable1\tNOT PrimaryVolumeSpaceAvailable AND NOT REMOVE\t800\n"
1148 "TestPrimaryVolumeSpaceRequired1\tNOT PrimaryVolumeSpaceRequired AND NOT REMOVE\t810\n"
1149 "TestPrimaryVolumeSpaceRemaining1\tNOT PrimaryVolumeSpaceRemaining AND NOT REMOVE\t820\n"
1150 "InstallValidate\t\t900\n"
1151 "TestPrimaryVolumePath2\tNOT PrimaryVolumePath AND NOT REMOVE\t1000\n"
1152 "TestPrimaryVolumeSpaceAvailable2\tNOT PrimaryVolumeSpaceAvailable AND NOT REMOVE\t1100\n"
1153 "TestPrimaryVolumeSpaceRequired2\tNOT PrimaryVolumeSpaceRequired AND NOT REMOVE\t1110\n"
1154 "TestPrimaryVolumeSpaceRemaining2\tNOT PrimaryVolumeSpaceRemaining AND NOT REMOVE\t1120\n"
1155 "InstallInitialize\t\t1200\n"
1156 "ProcessComponents\t\t1300\n"
1157 "RemoveFiles\t\t1400\n"
1158 "InstallFiles\t\t1500\n"
1159 "RegisterProduct\t\t1600\n"
1160 "PublishFeatures\t\t1700\n"
1161 "PublishProduct\t\t1800\n"
1162 "UnpublishFeatures\t\t1850\n"
1163 "InstallFinalize\t\t1900\n";
1164
1165static const char shc_property_dat[] =
1166 "Property\tValue\n"
1167 "s72\tl0\n"
1168 "Property\tProperty\n"
1169 "INSTALLLEVEL\t3\n"
1170 "ProductCode\t{5CD99CD0-69C7-409B-9905-82DD743CC840}\n"
1171 "ProductName\tMSITEST\n"
1172 "ProductVersion\t1.1.1\n"
1173 "MSIFASTINSTALL\t1\n";
1174
1175static const char shc2_property_dat[] =
1176 "Property\tValue\n"
1177 "s72\tl0\n"
1178 "Property\tProperty\n"
1179 "INSTALLLEVEL\t3\n"
1180 "ProductCode\t{4CEFADE5-DAFB-4C21-8EF2-4ED4F139F340}\n"
1181 "ProductName\tMSITEST2\n"
1182 "ProductVersion\t1.1.1\n"
1183 "MSIFASTINSTALL\t1\n";
1184
1185static const char shc_file_dat[] =
1186 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1187 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1188 "File\tFile\n"
1189 "sharedcomponent\tsharedcomponent\tsharedcomponent.txt\t1000\t\t\t8192\t1\n";
1190
1191static const char shc_feature_dat[] =
1192 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1193 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1194 "Feature\tFeature\n"
1195 "feature\t\t\t\t1\t2\tMSITESTDIR\t0\n";
1196
1197static const char shc_feature_comp_dat[] =
1198 "Feature_\tComponent_\n"
1199 "s38\ts72\n"
1200 "FeatureComponents\tFeature_\tComponent_\n"
1201 "feature\tsharedcomponent\n";
1202
1203static const char shc_component_dat[] =
1204 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1205 "s72\tS38\ts72\ti2\tS255\tS72\n"
1206 "Component\tComponent\n"
1207 "sharedcomponent\t{900A4ACB-DC6F-4795-A04B-81B530183D41}\tMSITESTDIR\t0\t\tsharedcomponent\n";
1208
1209static const char shc_custom_action_dat[] =
1210 "Action\tType\tSource\tTarget\tISComments\n"
1211 "s72\ti2\tS64\tS0\tS255\n"
1212 "CustomAction\tAction\n"
1213 "TestComponentAction\t19\t\twrong component action on install\t\n"
1214 "TestDisallowedAction\t19\t\twrong component action on disallowed remove\t\n"
1215 "TestRemoveAction\t19\t\twrong component action on remove\t\n";
1216
1217static const char shc_install_exec_seq_dat[] =
1218 "Action\tCondition\tSequence\n"
1219 "s72\tS255\tI2\n"
1220 "InstallExecuteSequence\tAction\n"
1221 "LaunchConditions\t\t100\n"
1222 "CostInitialize\t\t200\n"
1223 "FileCost\t\t300\n"
1224 "CostFinalize\t\t600\n"
1225 "TestDisallowedAction\tREMOVE AND ($sharedcomponent <> -1)\t700\n"
1226 "InstallValidate\t\t900\n"
1227 "InstallInitialize\t\t1200\n"
1228 "ProcessComponents\t\t1300\n"
1229 "RemoveFiles\t\t1400\n"
1230 "InstallFiles\t\t1500\n"
1231 "TestComponentAction\tNOT REMOVE AND ($sharedcomponent <> 3)\t1600\n"
1232 "RegisterProduct\t\t1700\n"
1233 "PublishFeatures\t\t1800\n"
1234 "PublishProduct\t\t1900\n"
1235 "UnpublishFeatures\t\t1950\n"
1236 "InstallFinalize\t\t2000\n";
1237
1238static const char shc2_install_exec_seq_dat[] =
1239 "Action\tCondition\tSequence\n"
1240 "s72\tS255\tI2\n"
1241 "InstallExecuteSequence\tAction\n"
1242 "LaunchConditions\t\t100\n"
1243 "CostInitialize\t\t200\n"
1244 "FileCost\t\t300\n"
1245 "CostFinalize\t\t600\n"
1246 "TestRemoveAction\tREMOVE AND ($sharedcomponent <> 2)\t700\n"
1247 "InstallValidate\t\t900\n"
1248 "InstallInitialize\t\t1200\n"
1249 "ProcessComponents\t\t1300\n"
1250 "RemoveFiles\t\t1400\n"
1251 "InstallFiles\t\t1500\n"
1252 "TestComponentAction\tNOT REMOVE AND ($sharedcomponent <> 3)\t1600\n"
1253 "RegisterProduct\t\t1700\n"
1254 "PublishFeatures\t\t1800\n"
1255 "PublishProduct\t\t1900\n"
1256 "UnpublishFeatures\t\t1950\n"
1257 "InstallFinalize\t\t2000\n";
1258
1259static const char ft_file_dat[] =
1260 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1261 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1262 "File\tFile\n"
1263 "featuretree\tcomp\tfeaturetree.txt\t1000\t\t\t8192\t1\n";
1264
1265static const char ft_comp_dat[] =
1266 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1267 "s72\tS38\ts72\ti2\tS255\tS72\n"
1268 "Component\tComponent\n"
1269 "comp\t{12345678-1234-1234-1234-222222222222}\tTARGETDIR\t0\t\t\n"
1270 "comp2\t{12345678-1234-1234-1234-333333333333}\tTARGETDIR\t0\t\tfeaturetree\n";
1271
1272static const char ft_feature_dat[] =
1273 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1274 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1275 "Feature\tFeature\n"
1276 "A\t\t\t\t2\t1\t\t0\n"
1277 "C\tB\t\t\t2\t1\t\t0\n"
1278 "B\tA\t\t\t4\t1\t\t0\n"
1279 "D\t\t\t\t2\t1\t\t0\n";
1280
1281static const char ft_feature_comp_dat[] =
1282 "Feature_\tComponent_\n"
1283 "s38\ts72\n"
1284 "FeatureComponents\tFeature_\tComponent_\n"
1285 "C\tcomp\n"
1286 "D\tcomp2\n";
1287
1288static const char ft_condition_dat[] =
1289 "Feature_\tLevel\tCondition\n"
1290 "s38\ti2\tS255\n"
1291 "Condition\tFeature_\tLevel\n"
1292 "A\t0\t\"0\"<>INSTALLTYPE\n";
1293
1294static const char ft_custom_action_dat[] =
1295 "Action\tType\tSource\tTarget\tISComments\n"
1296 "s72\ti2\tS64\tS0\tS255\n"
1297 "CustomAction\tAction\n"
1298 "Run A\t19\t\tA\t\n"
1299 "Run B\t19\t\tB\t\n"
1300 "Run C\t19\t\tC\t\n";
1301
1302static const char ft_install_exec_seq_dat[] =
1303 "Action\tCondition\tSequence\n"
1304 "s72\tS255\tI2\n"
1305 "InstallExecuteSequence\tAction\n"
1306 "CostInitialize\t\t100\n"
1307 "FileCost\t\t200\n"
1308 "CostFinalize\t\t300\n"
1309 "InstallValidate\t\t400\n"
1310 "InstallInitialize\t\t500\n"
1311 "Run C\t3 = &C AND NOT Installed\t600\n"
1312 "Run B\t3 = &B AND NOT Installed\t700\n"
1313 "Run A\t3 = &A AND NOT Installed\t800\n"
1314 "ProcessComponents\t\t900\n"
1315 "RemoveFiles\t\t1000\n"
1316 "InstallFiles\t\t1100\n"
1317 "RegisterProduct\t\t1200\n"
1318 "PublishFeatures\t\t1300\n"
1319 "PublishProduct\t\t1400\n"
1320 "UnpublishFeatures\t\t1450\n"
1321 "InstallFinalize\t\t1500\n";
1322
1323static const char da_custom_action_dat[] =
1324 "Action\tType\tSource\tTarget\n"
1325 "s72\ti2\tS64\tS0\n"
1326 "CustomAction\tAction\n"
1327 "setprop\t51\tdeferred\t[TESTPATH]\n"
1328 "immediate\t1\tcustom.dll\tda_immediate\n"
1329 "deferred\t1025\tcustom.dll\tda_deferred\n";
1330
1331static const char da_install_exec_seq_dat[] =
1332 "Action\tCondition\tSequence\n"
1333 "s72\tS255\tI2\n"
1334 "InstallExecuteSequence\tAction\n"
1335 "CostInitialize\t\t200\n"
1336 "FileCost\t\t300\n"
1337 "CostFinalize\t\t400\n"
1338 "InstallInitialize\t\t500\n"
1339 "setprop\t\t600\n"
1340 "deferred\t\t700\n"
1341 "immediate\t\t800\n"
1342 "InstallFinalize\t\t1100\n";
1343
1344static const CHAR x64_directory_dat[] =
1345 "Directory\tDirectory_Parent\tDefaultDir\n"
1346 "s72\tS72\tl255\n"
1347 "Directory\tDirectory\n"
1348 "CABOUTDIR\tMSITESTDIR\tcabout\n"
1349 "CHANGEDDIR\tMSITESTDIR\tchanged:second\n"
1350 "FIRSTDIR\tMSITESTDIR\tfirst\n"
1351 "MSITESTDIR\tProgramFiles64Folder\tmsitest\n"
1352 "NEWDIR\tCABOUTDIR\tnew\n"
1353 "ProgramFiles64Folder\tTARGETDIR\t.\n"
1354 "TARGETDIR\t\tSourceDir";
1355
1357 "Action\tCondition\tSequence\n"
1358 "s72\tS255\tI2\n"
1359 "InstallExecuteSequence\tAction\n"
1360 "CostInitialize\t\t200\n"
1361 "FileCost\t\t300\n"
1362 "CostFinalize\t\t400\n"
1363 "InstallValidate\t\t500\n"
1364 "InstallInitialize\t\t600\n"
1365 "sourcedir_unset\tSourceDir\t700\n"
1366 "ResolveSource\tRESOLVE_SOURCE\t800\n"
1367 "ProcessComponents\tPROCESS_COMPONENTS\t800\n"
1368 "InstallFiles\tINSTALL_FILES\t800\n"
1369 "sourcedir_set\tNOT SourceDir\t900\n"
1370 "InstallFinalize\t\t1000\n";
1371
1373 "Action\tType\tSource\tTarget\n"
1374 "s72\ti2\tS64\tS0\n"
1375 "CustomAction\tAction\n"
1376 "sourcedir_unset\t19\t\tSourceDir should not be set\n"
1377 "sourcedir_set\t19\t\tSourceDir should be set\n";
1378
1379static const CHAR ai2_file_dat[] =
1380 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1381 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1382 "File\tFile\n"
1383 "five.txt\tFive\tfive.txt\t1000\t\t\t0\t5\n"
1384 "four.txt\tFour\tfour.txt\t1000\t\t\t0\t4\n";
1385
1386static const CHAR ai2_component_dat[] =
1387 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1388 "s72\tS38\ts72\ti2\tS255\tS72\n"
1389 "Component\tComponent\n"
1390 "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n"
1391 "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n";
1392
1393static const CHAR ai2_feature_dat[] =
1394 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1395 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1396 "Feature\tFeature\n"
1397 "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n"
1398 "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n";
1399
1401 "Feature_\tComponent_\n"
1402 "s38\ts72\n"
1403 "FeatureComponents\tFeature_\tComponent_\n"
1404 "Five\tFive\n"
1405 "Four\tFour\n";
1406
1407static const msi_table tables[] =
1408{
1409 ADD_TABLE(component),
1412 ADD_TABLE(feature_comp),
1413 ADD_TABLE(file),
1414 ADD_TABLE(install_exec_seq),
1418};
1419
1420static const msi_table sc_tables[] =
1421{
1422 ADD_TABLE(component),
1425 ADD_TABLE(feature_comp),
1426 ADD_TABLE(file),
1427 ADD_TABLE(install_exec_seq),
1430 ADD_TABLE(shortcut)
1431};
1432
1433static const msi_table ps_tables[] =
1434{
1435 ADD_TABLE(component),
1438 ADD_TABLE(feature_comp),
1439 ADD_TABLE(file),
1440 ADD_TABLE(install_exec_seq),
1444};
1445
1446static const msi_table up_tables[] =
1447{
1448 ADD_TABLE(component),
1451 ADD_TABLE(feature_comp),
1452 ADD_TABLE(file),
1453 ADD_TABLE(install_exec_seq),
1455 ADD_TABLE(up_property),
1457};
1458
1459static const msi_table up2_tables[] =
1460{
1461 ADD_TABLE(component),
1464 ADD_TABLE(feature_comp),
1465 ADD_TABLE(file),
1466 ADD_TABLE(install_exec_seq),
1468 ADD_TABLE(up2_property),
1470};
1471
1472static const msi_table up3_tables[] =
1473{
1474 ADD_TABLE(component),
1477 ADD_TABLE(feature_comp),
1478 ADD_TABLE(file),
1479 ADD_TABLE(install_exec_seq),
1481 ADD_TABLE(up3_property),
1483};
1484
1485static const msi_table up4_tables[] =
1486{
1487 ADD_TABLE(component),
1490 ADD_TABLE(feature_comp),
1491 ADD_TABLE(file),
1492 ADD_TABLE(pp_install_exec_seq),
1496};
1497
1498static const msi_table up5_tables[] =
1499{
1500 ADD_TABLE(component),
1503 ADD_TABLE(feature_comp),
1504 ADD_TABLE(file),
1505 ADD_TABLE(pp_install_exec_seq),
1507 ADD_TABLE(up_property),
1509};
1510
1511static const msi_table up6_tables[] =
1512{
1513 ADD_TABLE(component),
1516 ADD_TABLE(feature_comp),
1517 ADD_TABLE(file),
1518 ADD_TABLE(pp_install_exec_seq),
1520 ADD_TABLE(up2_property),
1522};
1523
1524static const msi_table up7_tables[] =
1525{
1526 ADD_TABLE(component),
1529 ADD_TABLE(feature_comp),
1530 ADD_TABLE(file),
1531 ADD_TABLE(pp_install_exec_seq),
1533 ADD_TABLE(up3_property),
1535};
1536
1537static const msi_table cc_tables[] =
1538{
1539 ADD_TABLE(cc_component),
1541 ADD_TABLE(cc_feature),
1542 ADD_TABLE(cc_feature_comp),
1543 ADD_TABLE(cc_file),
1544 ADD_TABLE(install_exec_seq),
1545 ADD_TABLE(cc_media),
1547};
1548
1549static const msi_table cc2_tables[] =
1550{
1551 ADD_TABLE(cc2_component),
1553 ADD_TABLE(cc_feature),
1554 ADD_TABLE(cc_feature_comp),
1555 ADD_TABLE(cc2_file),
1556 ADD_TABLE(install_exec_seq),
1557 ADD_TABLE(cc_media),
1559};
1560
1561static const msi_table cc3_tables[] =
1562{
1563 ADD_TABLE(cc_component),
1565 ADD_TABLE(cc_feature),
1566 ADD_TABLE(cc_feature_comp),
1567 ADD_TABLE(cc_file),
1568 ADD_TABLE(install_exec_seq),
1569 ADD_TABLE(cc3_media),
1571};
1572
1573static const msi_table co_tables[] =
1574{
1575 ADD_TABLE(cc_component),
1577 ADD_TABLE(cc_feature),
1578 ADD_TABLE(cc_feature_comp),
1579 ADD_TABLE(co_file),
1580 ADD_TABLE(install_exec_seq),
1581 ADD_TABLE(co_media),
1583};
1584
1585static const msi_table co2_tables[] =
1586{
1587 ADD_TABLE(cc_component),
1589 ADD_TABLE(cc_feature),
1590 ADD_TABLE(cc_feature_comp),
1591 ADD_TABLE(cc_file),
1592 ADD_TABLE(install_exec_seq),
1593 ADD_TABLE(co2_media),
1595};
1596
1597static const msi_table mm_tables[] =
1598{
1599 ADD_TABLE(cc_component),
1601 ADD_TABLE(cc_feature),
1602 ADD_TABLE(cc_feature_comp),
1603 ADD_TABLE(mm_file),
1604 ADD_TABLE(install_exec_seq),
1605 ADD_TABLE(mm_media),
1607};
1608
1609static const msi_table ss_tables[] =
1610{
1611 ADD_TABLE(cc_component),
1613 ADD_TABLE(cc_feature),
1614 ADD_TABLE(cc_feature_comp),
1615 ADD_TABLE(cc_file),
1616 ADD_TABLE(install_exec_seq),
1617 ADD_TABLE(ss_media),
1619};
1620
1621static const msi_table ui_tables[] =
1622{
1623 ADD_TABLE(ui_component),
1625 ADD_TABLE(cc_feature),
1626 ADD_TABLE(cc_feature_comp),
1627 ADD_TABLE(cc_file),
1628 ADD_TABLE(install_exec_seq),
1629 ADD_TABLE(ui_install_ui_seq),
1630 ADD_TABLE(ui_custom_action),
1631 ADD_TABLE(cc_media),
1633};
1634
1635static const msi_table rof_tables[] =
1636{
1637 ADD_TABLE(rof_component),
1639 ADD_TABLE(rof_feature),
1640 ADD_TABLE(rof_feature_comp),
1641 ADD_TABLE(rof_file),
1642 ADD_TABLE(install_exec_seq),
1643 ADD_TABLE(rof_media),
1645};
1646
1647static const msi_table rofc_tables[] =
1648{
1649 ADD_TABLE(rof_component),
1651 ADD_TABLE(rof_feature),
1652 ADD_TABLE(rof_feature_comp),
1653 ADD_TABLE(rofc_file),
1654 ADD_TABLE(install_exec_seq),
1655 ADD_TABLE(rofc_media),
1657};
1658
1659static const msi_table sdp_tables[] =
1660{
1661 ADD_TABLE(rof_component),
1663 ADD_TABLE(rof_feature),
1664 ADD_TABLE(rof_feature_comp),
1665 ADD_TABLE(rof_file),
1666 ADD_TABLE(sdp_install_exec_seq),
1667 ADD_TABLE(sdp_custom_action),
1668 ADD_TABLE(rof_media),
1670};
1671
1672static const msi_table cie_tables[] =
1673{
1674 ADD_TABLE(cie_component),
1676 ADD_TABLE(cc_feature),
1677 ADD_TABLE(cie_feature_comp),
1678 ADD_TABLE(cie_file),
1679 ADD_TABLE(install_exec_seq),
1680 ADD_TABLE(cie_media),
1682};
1683
1684static const msi_table tp_tables[] =
1685{
1686 ADD_TABLE(tp_component),
1688 ADD_TABLE(rof_feature),
1689 ADD_TABLE(ci2_feature_comp),
1690 ADD_TABLE(ci2_file),
1691 ADD_TABLE(install_exec_seq),
1692 ADD_TABLE(rof_media),
1694};
1695
1696static const msi_table cwd_tables[] =
1697{
1698 ADD_TABLE(cwd_component),
1700 ADD_TABLE(rof_feature),
1701 ADD_TABLE(ci2_feature_comp),
1702 ADD_TABLE(ci2_file),
1703 ADD_TABLE(install_exec_seq),
1704 ADD_TABLE(rof_media),
1706};
1707
1708static const msi_table adm_tables[] =
1709{
1710 ADD_TABLE(adm_component),
1712 ADD_TABLE(rof_feature),
1713 ADD_TABLE(ci2_feature_comp),
1714 ADD_TABLE(ci2_file),
1715 ADD_TABLE(install_exec_seq),
1716 ADD_TABLE(rof_media),
1718 ADD_TABLE(adm_custom_action),
1719 ADD_TABLE(adm_admin_exec_seq),
1720};
1721
1722static const msi_table amp_tables[] =
1723{
1724 ADD_TABLE(amp_component),
1726 ADD_TABLE(rof_feature),
1727 ADD_TABLE(ci2_feature_comp),
1728 ADD_TABLE(ci2_file),
1729 ADD_TABLE(install_exec_seq),
1730 ADD_TABLE(rof_media),
1732};
1733
1734static const msi_table mc_tables[] =
1735{
1736 ADD_TABLE(mc_component),
1738 ADD_TABLE(cc_feature),
1739 ADD_TABLE(cie_feature_comp),
1740 ADD_TABLE(mc_file),
1741 ADD_TABLE(install_exec_seq),
1742 ADD_TABLE(mc_media),
1744 ADD_TABLE(mc_file_hash),
1745};
1746
1747static const msi_table sf_tables[] =
1748{
1749 ADD_TABLE(wrv_component),
1751 ADD_TABLE(rof_feature),
1752 ADD_TABLE(ci2_feature_comp),
1753 ADD_TABLE(ci2_file),
1754 ADD_TABLE(install_exec_seq),
1755 ADD_TABLE(rof_media),
1757};
1758
1759static const msi_table ca1_tables[] =
1760{
1761 ADD_TABLE(component),
1764 ADD_TABLE(feature_comp),
1765 ADD_TABLE(file),
1768 ADD_TABLE(ca1_install_exec_seq),
1769 ADD_TABLE(ca1_custom_action),
1770 ADD_TABLE(ca1_test_seq),
1771 ADD_TABLE(ca1_test2),
1772 ADD_TABLE(ca1__validation),
1773};
1774
1775static const msi_table ca51_tables[] =
1776{
1777 ADD_TABLE(ca51_component),
1779 ADD_TABLE(rof_feature),
1780 ADD_TABLE(ci2_feature_comp),
1781 ADD_TABLE(ci2_file),
1782 ADD_TABLE(ca51_install_exec_seq),
1783 ADD_TABLE(rof_media),
1785 ADD_TABLE(ca51_custom_action),
1786};
1787
1788static const msi_table is_tables[] =
1789{
1790 ADD_TABLE(is_component),
1792 ADD_TABLE(is_feature),
1793 ADD_TABLE(is_feature_comp),
1794 ADD_TABLE(is_file),
1795 ADD_TABLE(install_exec_seq),
1796 ADD_TABLE(is_media),
1798};
1799
1800static const msi_table sp_tables[] =
1801{
1802 ADD_TABLE(sp_component),
1803 ADD_TABLE(sp_directory),
1804 ADD_TABLE(rof_feature),
1805 ADD_TABLE(ci2_feature_comp),
1806 ADD_TABLE(ci2_file),
1807 ADD_TABLE(install_exec_seq),
1808 ADD_TABLE(rof_media),
1810};
1811
1812static const msi_table mcp_tables[] =
1813{
1814 ADD_TABLE(mcp_component),
1816 ADD_TABLE(mcp_feature),
1817 ADD_TABLE(mcp_feature_comp),
1818 ADD_TABLE(mcp_file),
1819 ADD_TABLE(rem_install_exec_seq),
1820 ADD_TABLE(rof_media),
1822};
1823
1824static const msi_table ai_tables[] =
1825{
1826 ADD_TABLE(component),
1829 ADD_TABLE(feature_comp),
1830 ADD_TABLE(ai_file),
1831 ADD_TABLE(install_exec_seq),
1834};
1835
1836static const msi_table ai2_tables[] =
1837{
1838 ADD_TABLE(ai2_component),
1840 ADD_TABLE(ai2_feature),
1841 ADD_TABLE(ai2_feature_comp),
1842 ADD_TABLE(ai2_file),
1843 ADD_TABLE(install_exec_seq),
1846};
1847
1848static const msi_table pc_tables[] =
1849{
1850 ADD_TABLE(ca51_component),
1852 ADD_TABLE(rof_feature),
1853 ADD_TABLE(ci2_feature_comp),
1854 ADD_TABLE(ci2_file),
1855 ADD_TABLE(install_exec_seq),
1856 ADD_TABLE(rof_media),
1858};
1859
1860static const msi_table ip_tables[] =
1861{
1862 ADD_TABLE(component),
1865 ADD_TABLE(feature_comp),
1866 ADD_TABLE(file),
1867 ADD_TABLE(ip_install_exec_seq),
1868 ADD_TABLE(ip_custom_action),
1871};
1872
1873static const msi_table aup_tables[] =
1874{
1875 ADD_TABLE(component),
1878 ADD_TABLE(feature_comp),
1879 ADD_TABLE(file),
1880 ADD_TABLE(aup_install_exec_seq),
1881 ADD_TABLE(aup_custom_action),
1884};
1885
1886static const msi_table aup2_tables[] =
1887{
1888 ADD_TABLE(component),
1891 ADD_TABLE(feature_comp),
1892 ADD_TABLE(file),
1893 ADD_TABLE(aup2_install_exec_seq),
1894 ADD_TABLE(aup_custom_action),
1896 ADD_TABLE(aup_property)
1897};
1898
1899static const msi_table aup3_tables[] =
1900{
1901 ADD_TABLE(component),
1904 ADD_TABLE(feature_comp),
1905 ADD_TABLE(file),
1906 ADD_TABLE(aup2_install_exec_seq),
1907 ADD_TABLE(aup_custom_action),
1909 ADD_TABLE(aup2_property)
1910};
1911
1912static const msi_table aup4_tables[] =
1913{
1914 ADD_TABLE(component),
1917 ADD_TABLE(feature_comp),
1918 ADD_TABLE(file),
1919 ADD_TABLE(aup3_install_exec_seq),
1920 ADD_TABLE(aup_custom_action),
1922 ADD_TABLE(aup2_property)
1923};
1924
1925static const msi_table fiu_tables[] =
1926{
1927 ADD_TABLE(rof_component),
1929 ADD_TABLE(rof_feature),
1930 ADD_TABLE(rof_feature_comp),
1931 ADD_TABLE(rof_file),
1932 ADD_TABLE(pp_install_exec_seq),
1933 ADD_TABLE(rof_media),
1935};
1936
1937static const msi_table fiuc_tables[] =
1938{
1939 ADD_TABLE(rof_component),
1941 ADD_TABLE(rof_feature),
1942 ADD_TABLE(rof_feature_comp),
1943 ADD_TABLE(rofc_file),
1944 ADD_TABLE(pp_install_exec_seq),
1945 ADD_TABLE(rofc_media),
1947};
1948
1949static const msi_table fo_tables[] =
1950{
1952 ADD_TABLE(fo_file),
1953 ADD_TABLE(fo_component),
1954 ADD_TABLE(fo_feature),
1955 ADD_TABLE(fo_condition),
1956 ADD_TABLE(fo_feature_comp),
1957 ADD_TABLE(fo_custom_action),
1958 ADD_TABLE(fo_install_exec_seq),
1961};
1962
1964{
1965 ADD_TABLE(ci_component),
1967 ADD_TABLE(rof_feature),
1968 ADD_TABLE(rof_feature_comp),
1969 ADD_TABLE(rof_file),
1970 ADD_TABLE(pp_install_exec_seq),
1971 ADD_TABLE(rof_media),
1972 ADD_TABLE(icon_property),
1973};
1974
1975static const msi_table pv_tables[] =
1976{
1977 ADD_TABLE(rof_component),
1979 ADD_TABLE(rof_feature),
1980 ADD_TABLE(rof_feature_comp),
1981 ADD_TABLE(rof_file),
1982 ADD_TABLE(pv_install_exec_seq),
1983 ADD_TABLE(rof_media),
1985};
1986
1987static const msi_table uc_tables[] =
1988{
1990 ADD_TABLE(uc_component),
1991 ADD_TABLE(uc_feature),
1992 ADD_TABLE(uc_feature_comp),
1993 ADD_TABLE(uc_file),
1994 ADD_TABLE(uc_install_exec_seq),
1996 ADD_TABLE(uc_property)
1997};
1998
1999static const msi_table mixed_tables[] =
2000{
2002 ADD_TABLE(mixed_component),
2003 ADD_TABLE(mixed_feature),
2004 ADD_TABLE(mixed_feature_comp),
2005 ADD_TABLE(mixed_install_exec_seq),
2006 ADD_TABLE(mixed_registry),
2009};
2010
2011static const msi_table vp_tables[] =
2012{
2014 ADD_TABLE(vp_file),
2015 ADD_TABLE(vp_component),
2016 ADD_TABLE(vp_feature),
2017 ADD_TABLE(vp_feature_comp),
2018 ADD_TABLE(vp_custom_action),
2019 ADD_TABLE(vp_install_exec_seq),
2022};
2023
2024static const msi_table shc_tables[] =
2025{
2028 ADD_TABLE(shc_file),
2029 ADD_TABLE(shc_component),
2030 ADD_TABLE(shc_feature),
2031 ADD_TABLE(shc_feature_comp),
2032 ADD_TABLE(shc_custom_action),
2033 ADD_TABLE(shc_install_exec_seq),
2034 ADD_TABLE(shc_property)
2035};
2036
2037static const msi_table shc2_tables[] =
2038{
2041 ADD_TABLE(shc_file),
2042 ADD_TABLE(shc_component),
2043 ADD_TABLE(shc_feature),
2044 ADD_TABLE(shc_feature_comp),
2045 ADD_TABLE(shc_custom_action),
2046 ADD_TABLE(shc2_install_exec_seq),
2047 ADD_TABLE(shc2_property)
2048};
2049
2050static const msi_table ft_tables[] =
2051{
2054 ADD_TABLE(ft_file),
2055 ADD_TABLE(ft_comp),
2056 ADD_TABLE(ft_feature),
2057 ADD_TABLE(ft_feature_comp),
2058 ADD_TABLE(ft_condition),
2059 ADD_TABLE(ft_custom_action),
2060 ADD_TABLE(ft_install_exec_seq),
2062};
2063
2064static const msi_table da_tables[] =
2065{
2068 ADD_TABLE(file),
2069 ADD_TABLE(component),
2071 ADD_TABLE(feature_comp),
2073 ADD_TABLE(da_install_exec_seq),
2074 ADD_TABLE(da_custom_action),
2075};
2076
2077static const msi_table x64_tables[] =
2078{
2080 ADD_TABLE(x64_directory),
2081 ADD_TABLE(file),
2082 ADD_TABLE(component),
2084 ADD_TABLE(feature_comp),
2086 ADD_TABLE(install_exec_seq),
2087};
2088
2089static const msi_table sr_tables[] =
2090{
2093 ADD_TABLE(file),
2094 ADD_TABLE(component),
2096 ADD_TABLE(feature_comp),
2098 ADD_TABLE(sr_install_exec_seq),
2099 ADD_TABLE(sr_custom_action),
2100};
2101
2102/* cabinet definitions */
2103
2104/* make the max size large so there is only one cab file */
2105#define MEDIA_SIZE 0x7FFFFFFF
2106#define FOLDER_THRESHOLD 900000
2107
2108/* the FCI callbacks */
2109
2110static void * CDECL mem_alloc(ULONG cb)
2111{
2112 return malloc(cb);
2113}
2114
2115static void CDECL mem_free(void *memory)
2116{
2117 free(memory);
2118}
2119
2120static BOOL CDECL get_next_cabinet(PCCAB pccab, ULONG cbPrevCab, void *pv)
2121{
2122 sprintf(pccab->szCab, pv, pccab->iCab);
2123 return TRUE;
2124}
2125
2126static LONG CDECL progress(UINT typeStatus, ULONG cb1, ULONG cb2, void *pv)
2127{
2128 return 0;
2129}
2130
2131static int CDECL file_placed(PCCAB pccab, char *pszFile, LONG cbFile,
2132 BOOL fContinuation, void *pv)
2133{
2134 return 0;
2135}
2136
2137static INT_PTR CDECL fci_open(char *pszFile, int oflag, int pmode, int *err, void *pv)
2138{
2139 HANDLE handle;
2140 DWORD dwAccess = 0;
2141 DWORD dwShareMode = 0;
2142 DWORD dwCreateDisposition = OPEN_EXISTING;
2143
2144 dwAccess = GENERIC_READ | GENERIC_WRITE;
2146
2148 dwCreateDisposition = OPEN_EXISTING;
2149 else
2150 dwCreateDisposition = CREATE_NEW;
2151
2152 handle = CreateFileA(pszFile, dwAccess, dwShareMode, NULL,
2153 dwCreateDisposition, 0, NULL);
2154
2155 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszFile);
2156
2157 return (INT_PTR)handle;
2158}
2159
2160static UINT CDECL fci_read(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
2161{
2162 HANDLE handle = (HANDLE)hf;
2163 DWORD dwRead;
2164 BOOL res;
2165
2166 res = ReadFile(handle, memory, cb, &dwRead, NULL);
2167 ok(res, "Failed to ReadFile\n");
2168
2169 return dwRead;
2170}
2171
2172static UINT CDECL fci_write(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
2173{
2174 HANDLE handle = (HANDLE)hf;
2175 DWORD dwWritten;
2176 BOOL res;
2177
2178 res = WriteFile(handle, memory, cb, &dwWritten, NULL);
2179 ok(res, "Failed to WriteFile\n");
2180
2181 return dwWritten;
2182}
2183
2184static int CDECL fci_close(INT_PTR hf, int *err, void *pv)
2185{
2186 HANDLE handle = (HANDLE)hf;
2187 ok(CloseHandle(handle), "Failed to CloseHandle\n");
2188
2189 return 0;
2190}
2191
2192static LONG CDECL fci_seek(INT_PTR hf, LONG dist, int seektype, int *err, void *pv)
2193{
2194 HANDLE handle = (HANDLE)hf;
2195 DWORD ret;
2196
2197 ret = SetFilePointer(handle, dist, NULL, seektype);
2198 ok(ret != INVALID_SET_FILE_POINTER, "Failed to SetFilePointer\n");
2199
2200 return ret;
2201}
2202
2203static int CDECL fci_delete(char *pszFile, int *err, void *pv)
2204{
2205 BOOL ret = DeleteFileA(pszFile);
2206 ok(ret, "Failed to DeleteFile %s\n", pszFile);
2207
2208 return 0;
2209}
2210
2212{
2213 HANDLE token;
2215 DWORD size;
2216 BOOL ret;
2217
2221 return (ret && type == TokenElevationTypeFull);
2222}
2223
2225{
2226 CHAR buffer[0x20];
2227 UINT r;
2228 DWORD sz;
2229
2230 sz = sizeof buffer;
2231 r = MsiRecordGetStringA(rec, field, buffer, &sz);
2232 return (r == ERROR_SUCCESS ) && !strcmp(val, buffer);
2233}
2234
2235static BOOL CDECL get_temp_file(char *pszTempName, int cbTempName, void *pv)
2236{
2237 LPSTR tempname;
2238
2239 tempname = malloc(MAX_PATH);
2240 GetTempFileNameA(".", "xx", 0, tempname);
2241
2242 if (tempname && (strlen(tempname) < (unsigned)cbTempName))
2243 {
2244 lstrcpyA(pszTempName, tempname);
2245 free(tempname);
2246 return TRUE;
2247 }
2248
2249 free(tempname);
2250 return FALSE;
2251}
2252
2253static INT_PTR CDECL get_open_info(char *pszName, USHORT *pdate, USHORT *ptime,
2254 USHORT *pattribs, int *err, void *pv)
2255{
2258 HANDLE handle;
2259 DWORD attrs;
2260 BOOL res;
2261
2264
2265 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszName);
2266
2268 ok(res, "Expected GetFileInformationByHandle to succeed\n");
2269
2271 FileTimeToDosDateTime(&filetime, pdate, ptime);
2272
2273 attrs = GetFileAttributesA(pszName);
2274 ok(attrs != INVALID_FILE_ATTRIBUTES, "Failed to GetFileAttributes\n");
2275
2276 return (INT_PTR)handle;
2277}
2278
2279static BOOL add_file(HFCI hfci, const char *file, TCOMP compress)
2280{
2281 char path[MAX_PATH];
2282 char filename[MAX_PATH];
2283
2285 lstrcatA(path, "\\");
2286 lstrcatA(path, file);
2287
2289
2292}
2293
2294static void set_cab_parameters(PCCAB pCabParams, const CHAR *name, DWORD max_size)
2295{
2296 ZeroMemory(pCabParams, sizeof(CCAB));
2297
2298 pCabParams->cb = max_size;
2299 pCabParams->cbFolderThresh = FOLDER_THRESHOLD;
2300 pCabParams->setID = 0xbeef;
2301 pCabParams->iCab = 1;
2302 lstrcpyA(pCabParams->szCabPath, CURR_DIR);
2303 lstrcatA(pCabParams->szCabPath, "\\");
2304 lstrcpyA(pCabParams->szCab, name);
2305}
2306
2307void create_cab_file(const CHAR *name, DWORD max_size, const CHAR *files)
2308{
2309 CCAB cabParams;
2310 LPCSTR ptr;
2311 HFCI hfci;
2312 ERF erf;
2313 BOOL res;
2314
2315 set_cab_parameters(&cabParams, name, max_size);
2316
2319 get_temp_file, &cabParams, NULL);
2320
2321 ok(hfci != NULL, "Failed to create an FCI context\n");
2322
2323 ptr = files;
2324 while (*ptr)
2325 {
2326 res = add_file(hfci, ptr, tcompTYPE_MSZIP);
2327 ok(res, "Failed to add file: %s\n", ptr);
2328 ptr += lstrlenA(ptr) + 1;
2329 }
2330
2332 ok(res, "Failed to flush the cabinet\n");
2333
2334 res = FCIDestroy(hfci);
2335 ok(res, "Failed to destroy the cabinet\n");
2336}
2337
2339{
2340 HKEY hkey;
2341 DWORD type, size;
2342
2344 "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", &hkey))
2345 return FALSE;
2346
2347 size = MAX_PATH;
2348 if(RegQueryValueExA(hkey, "AppData", 0, &type, (LPBYTE)APP_DATA_DIR, &size)){
2349 RegCloseKey(hkey);
2350 return FALSE;
2351 }
2352
2353 RegCloseKey(hkey);
2354 return TRUE;
2355}
2356
2358{
2359 HKEY hkey;
2360 DWORD type, size;
2361
2362 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion",
2363 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hkey))
2364 return FALSE;
2365
2366 size = MAX_PATH;
2367 if (RegQueryValueExA(hkey, "ProgramFilesDir (x86)", 0, &type, (LPBYTE)PROG_FILES_DIR, &size) &&
2368 RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR, &size)) {
2369 RegCloseKey(hkey);
2370 return FALSE;
2371 }
2372
2373 size = MAX_PATH;
2374 if (RegQueryValueExA(hkey, "CommonFilesDir (x86)", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size) &&
2375 RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size)) {
2376 RegCloseKey(hkey);
2377 return FALSE;
2378 }
2379
2380 size = MAX_PATH;
2381 if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR_NATIVE, &size)) {
2382 RegCloseKey(hkey);
2383 return FALSE;
2384 }
2385
2386 RegCloseKey(hkey);
2387
2389 return FALSE;
2390
2391 return TRUE;
2392}
2393
2395{
2396 HANDLE file;
2397 DWORD written;
2398
2401 return;
2402
2403 WriteFile(file, data, strlen(data), &written, NULL);
2404
2405 if (size)
2406 {
2409 }
2410
2412}
2413
2414static void create_test_files(void)
2415{
2416 CreateDirectoryA("msitest", NULL);
2417 create_file("msitest\\one.txt", 100);
2418 CreateDirectoryA("msitest\\first", NULL);
2419 create_file("msitest\\first\\two.txt", 100);
2420 CreateDirectoryA("msitest\\second", NULL);
2421 create_file("msitest\\second\\three.txt", 100);
2422
2423 create_file("four.txt", 100);
2424 create_file("five.txt", 100);
2425 create_cab_file("msitest.cab", MEDIA_SIZE, "four.txt\0five.txt\0");
2426
2427 create_file("msitest\\filename", 100);
2428
2429 DeleteFileA("four.txt");
2430 DeleteFileA("five.txt");
2431}
2432
2433BOOL delete_pf(const CHAR *rel_path, BOOL is_file)
2434{
2436
2438 lstrcatA(path, "\\");
2439 lstrcatA(path, rel_path);
2440
2441 if (is_file)
2442 return DeleteFileA(path);
2443 else
2444 return RemoveDirectoryA(path);
2445}
2446
2447static BOOL delete_pf_native(const CHAR *rel_path, BOOL is_file)
2448{
2450
2452 lstrcatA(path, "\\");
2453 lstrcatA(path, rel_path);
2454
2455 if (is_file)
2456 return DeleteFileA(path);
2457 else
2458 return RemoveDirectoryA(path);
2459}
2460
2461static BOOL delete_cf(const CHAR *rel_path, BOOL is_file)
2462{
2464
2466 lstrcatA(path, "\\");
2467 lstrcatA(path, rel_path);
2468
2469 if (is_file)
2470 return DeleteFileA(path);
2471 else
2472 return RemoveDirectoryA(path);
2473}
2474
2475static BOOL compare_pf_data(const char *filename, const char *data, DWORD size)
2476{
2477 DWORD read;
2478 HANDLE handle;
2479 BOOL ret = FALSE;
2480 char *buffer, path[MAX_PATH];
2481
2483 lstrcatA(path, "\\");
2485
2487 if ((buffer = malloc(size)))
2488 {
2490 if (read == size && !memcmp(data, buffer, size)) ret = TRUE;
2491 free(buffer);
2492 }
2494 return ret;
2495}
2496
2497static void delete_test_files(void)
2498{
2499 DeleteFileA("msitest.msi");
2500 DeleteFileA("msitest.cab");
2501 DeleteFileA("msitest\\second\\three.txt");
2502 DeleteFileA("msitest\\first\\two.txt");
2503 DeleteFileA("msitest\\one.txt");
2504 DeleteFileA("msitest\\filename");
2505 RemoveDirectoryA("msitest\\second");
2506 RemoveDirectoryA("msitest\\first");
2507 RemoveDirectoryA("msitest");
2508}
2509
2510static void delete_pf_files(void)
2511{
2512 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2513 ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n");
2514 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2515 ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n");
2516 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2517 ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n");
2518 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2519 ok(delete_pf("msitest\\first", FALSE), "Directory not created\n");
2520 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2521 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2522 ok(delete_pf("msitest", FALSE), "Directory not created\n");
2523}
2524
2525static void write_file(const CHAR *filename, const char *data, int data_size)
2526{
2527 DWORD size;
2528
2531 WriteFile(hf, data, data_size, &size, NULL);
2532 CloseHandle(hf);
2533}
2534
2536 const char *template, const char *packagecode)
2537{
2538 MSIHANDLE summary;
2539 UINT r;
2540
2541 r = MsiGetSummaryInformationA(db, NULL, 5, &summary);
2542 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2543
2544 r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, template);
2545 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2546
2547 r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL, packagecode);
2548 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2549
2551 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2552
2553 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, wordcount, NULL, NULL);
2554 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2555
2556 r = MsiSummaryInfoSetPropertyA(summary, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
2557 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2558
2559 /* write the summary changes back to the stream */
2560 r = MsiSummaryInfoPersist(summary);
2561 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2562
2563 MsiCloseHandle(summary);
2564}
2565
2566static char *load_resource(const char *name)
2567{
2568 static char path[MAX_PATH];
2569 DWORD written;
2570 HANDLE file;
2571 HRSRC res;
2572 void *ptr;
2573
2574 GetTempFileNameA(".", name, 0, path);
2575
2577 ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %lu\n", path, GetLastError());
2578
2579 res = FindResourceA(NULL, name, "TESTDLL");
2580 ok( res != 0, "couldn't find resource\n" );
2583 ok( written == SizeofResource( GetModuleHandleA(NULL), res ), "couldn't write resource\n" );
2584 CloseHandle( file );
2585
2586 return path;
2587}
2588
2590{
2591 if (message_type == INSTALLMESSAGE_USER)
2592 {
2593 char file[200];
2594 char msg[2000];
2595 DWORD len;
2596
2597 len = sizeof(file);
2599 len = sizeof(msg);
2601
2604
2605 return 1;
2606 }
2607 return 0;
2608}
2609
2611{
2613 UINT res;
2614
2615 if (!customdll)
2616 customdll = load_resource("custom.dll");
2617
2619
2620 res = run_query(hdb, 0, "CREATE TABLE `Binary` (`Name` CHAR(72) NOT NULL, `Data` OBJECT NOT NULL PRIMARY KEY `Name`)");
2621 ok(res == ERROR_SUCCESS, "failed to create Binary table: %u\n", res);
2622
2625 ok(res == ERROR_SUCCESS, "failed to add %s to stream: %u\n", customdll, res);
2626
2627 res = run_query(hdb, record, "INSERT INTO `Binary` (`Name`, `Data`) VALUES ('custom.dll', ?)");
2628 ok(res == ERROR_SUCCESS, "failed to insert into Binary table: %u\n", res);
2629
2631}
2632
2633void create_database_wordcount(const CHAR *name, const msi_table *tables, int num_tables,
2634 INT version, INT wordcount, const char *template, const char *packagecode)
2635{
2636 MSIHANDLE db;
2637 UINT r;
2638 WCHAR *nameW;
2639 int j, len;
2640
2641 len = MultiByteToWideChar( CP_ACP, 0, name, -1, NULL, 0 );
2642 if (!(nameW = malloc( len * sizeof(WCHAR) ))) return;
2644
2646 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2647
2648 /* import the tables into the database */
2649 for (j = 0; j < num_tables; j++)
2650 {
2651 const msi_table *table = &tables[j];
2652
2653 write_file(table->filename, table->data, (table->size - 1) * sizeof(char));
2654
2655 r = MsiDatabaseImportA(db, CURR_DIR, table->filename);
2656 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2657
2658 DeleteFileA(table->filename);
2659 }
2660
2661 write_msi_summary_info(db, version, wordcount, template, packagecode);
2662 add_custom_dll(db);
2663
2664 r = MsiDatabaseCommit(db);
2665 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2666
2667 MsiCloseHandle(db);
2668 free( nameW );
2669}
2670
2671static void test_MsiInstallProduct(void)
2672{
2673 UINT r;
2675 LONG res;
2676 HKEY hkey;
2677 DWORD num, size, type;
2679
2680 if (!is_process_elevated())
2681 {
2682 skip("process is limited\n");
2683 return;
2684 }
2685
2686 if (is_wow64)
2688
2690
2691 if (0) /* crashes on Win10 1709 */
2692 {
2693 r = MsiInstallProductA(NULL, "INSTALL=ALL");
2694 ok(r == ERROR_INVALID_PARAMETER, "got %u\n", r);
2695
2697 ok(r == ERROR_INVALID_PARAMETER, "got %u\n", r);
2698 }
2699
2700 /* szPackagePath is empty */
2701 r = MsiInstallProductA("", "INSTALL=ALL");
2703 "Expected ERROR_PATH_NOT_FOUND, got %d\n", r);
2704
2707
2708 /* install, don't publish */
2711 {
2712 skip("Not enough rights to perform tests\n");
2713 goto error;
2714 }
2715 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2716
2718
2719 res = RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", 0, access, &hkey);
2720 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2721
2722 size = MAX_PATH;
2723 type = REG_SZ;
2724 res = RegQueryValueExA(hkey, "Name", NULL, &type, (LPBYTE)path, &size);
2725 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2726 ok(!lstrcmpA(path, "imaname"), "Expected imaname, got %s\n", path);
2727
2728 size = MAX_PATH;
2729 type = REG_SZ;
2730 res = RegQueryValueExA(hkey, "blah", NULL, &type, (LPBYTE)path, &size);
2731 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2732
2733 size = sizeof(num);
2734 type = REG_DWORD;
2735 res = RegQueryValueExA(hkey, "number", NULL, &type, (LPBYTE)&num, &size);
2736 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2737 ok(num == 314, "Expected 314, got %lu\n", num);
2738
2739 size = MAX_PATH;
2740 type = REG_SZ;
2741 res = RegQueryValueExA(hkey, "OrderTestName", NULL, &type, (LPBYTE)path, &size);
2742 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2743 ok(!lstrcmpA(path, "OrderTestValue"), "Expected OrderTestValue, got %s\n", path);
2744
2745 RegDeleteKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", access, 0);
2746
2747 /* not published, reinstall */
2749 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2750
2752
2753 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2754 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2755 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
2756
2758
2759 /* not published, RemovePreviousVersions set */
2761 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2762
2764
2765 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2766 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2767 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
2768
2770
2771 /* not published, version number bumped */
2773 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2774
2776
2777 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2778 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2779 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
2780
2782
2783 /* not published, RemovePreviousVersions set and version number bumped */
2785 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2786
2788
2789 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2790 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2791 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
2792
2794
2795 /* install, publish product */
2796 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
2797 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2798
2800
2801 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2802 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2803
2805
2806 /* published, reinstall */
2808 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2809
2811
2812 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2813 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2814
2816
2817 /* published product, RemovePreviousVersions set */
2819 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2820
2822
2823 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2824 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2825
2827
2828 /* published product, version number bumped */
2830 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2831
2833
2834 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2835 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2836
2838
2839 /* published product, RemovePreviousVersions set and version number bumped */
2841 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2842
2844
2845 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2846 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2847
2848 r = MsiInstallProductA(msifile, "REMOVE=ALL FULL=1");
2849 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2850
2851error:
2854}
2855
2857{
2858 INSTALLSTATE installed, action;
2859 MSIHANDLE package;
2860 char path[MAX_PATH];
2861 UINT r;
2862
2864
2866
2868 lstrcatA(path, "\\");
2870
2872
2873 r = MsiOpenPackageA(path, &package);
2875 {
2876 skip("Not enough rights to perform tests\n");
2877 goto error;
2878 }
2879 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2880
2881 r = MsiDoActionA(package, "CostInitialize");
2882 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2883
2884 r = MsiDoActionA(package, "FileCost");
2885 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2886
2887 r = MsiDoActionA(package, "CostFinalize");
2888 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2889
2890 r = MsiGetComponentStateA(package, "dangler", &installed, &action);
2891 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2892 ok(installed == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", installed);
2893 ok(action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2894
2895 r = MsiSetComponentStateA(package, "dangler", INSTALLSTATE_SOURCE);
2896 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2897
2898 MsiCloseHandle(package);
2899
2900error:
2903}
2904
2905static void test_packagecoltypes(void)
2906{
2907 MSIHANDLE hdb, view, rec;
2908 char path[MAX_PATH];
2909 WCHAR pathW[MAX_PATH];
2910 LPCSTR query;
2911 UINT r, count;
2912
2914
2916
2918 lstrcatA(path, "\\");
2920 MultiByteToWideChar( CP_ACP, 0, path, -1, pathW, MAX_PATH );
2921
2922 r = MsiOpenDatabaseW(pathW, MSIDBOPEN_READONLY, &hdb);
2923 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2924
2925 query = "SELECT * FROM `Media`";
2926 r = MsiDatabaseOpenViewA( hdb, query, &view );
2927 ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
2928
2931 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n");
2932 ok(count == 6, "Expected 6, got %d\n", count);
2933 ok(check_record(rec, 1, "DiskId"), "wrong column label\n");
2934 ok(check_record(rec, 2, "LastSequence"), "wrong column label\n");
2935 ok(check_record(rec, 3, "DiskPrompt"), "wrong column label\n");
2936 ok(check_record(rec, 4, "Cabinet"), "wrong column label\n");
2937 ok(check_record(rec, 5, "VolumeLabel"), "wrong column label\n");
2938 ok(check_record(rec, 6, "Source"), "wrong column label\n");
2939 MsiCloseHandle(rec);
2940
2943 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n");
2944 ok(count == 6, "Expected 6, got %d\n", count);
2945 ok(check_record(rec, 1, "i2"), "wrong column label\n");
2946 ok(check_record(rec, 2, "i4"), "wrong column label\n");
2947 ok(check_record(rec, 3, "L64"), "wrong column label\n");
2948 ok(check_record(rec, 4, "S255"), "wrong column label\n");
2949 ok(check_record(rec, 5, "S32"), "wrong column label\n");
2950 ok(check_record(rec, 6, "S72"), "wrong column label\n");
2951
2952 MsiCloseHandle(rec);
2954 MsiCloseHandle(hdb);
2956
2958}
2959
2960static void create_cc_test_files(void)
2961{
2962 CCAB cabParams;
2963 HFCI hfci;
2964 ERF erf;
2965 static CHAR cab_context[] = "test%d.cab";
2966 BOOL res;
2967
2968 create_file("maximus", 500);
2969 create_file("augustus", 50000);
2970 create_file("tiberius", 500);
2971 create_file("caesar", 500);
2972
2973 set_cab_parameters(&cabParams, "test1.cab", 40000);
2974
2977 get_temp_file, &cabParams, cab_context);
2978 ok(hfci != NULL, "Failed to create an FCI context\n");
2979
2980 res = add_file(hfci, "maximus", tcompTYPE_NONE);
2981 ok(res, "Failed to add file maximus\n");
2982
2983 res = add_file(hfci, "augustus", tcompTYPE_NONE);
2984 ok(res, "Failed to add file augustus\n");
2985
2986 res = add_file(hfci, "tiberius", tcompTYPE_NONE);
2987 ok(res, "Failed to add file tiberius\n");
2988
2990 ok(res, "Failed to flush the cabinet\n");
2991
2992 res = FCIDestroy(hfci);
2993 ok(res, "Failed to destroy the cabinet\n");
2994
2995 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
2996
2997 DeleteFileA("maximus");
2998 DeleteFileA("augustus");
2999 DeleteFileA("tiberius");
3000 DeleteFileA("caesar");
3001}
3002
3004{
3005 SHFILEOPSTRUCTA shfl;
3006 CHAR path[MAX_PATH+10];
3007
3009 lstrcatA(path, "\\*.cab");
3010 path[strlen(path) + 1] = '\0';
3011
3012 shfl.hwnd = NULL;
3013 shfl.wFunc = FO_DELETE;
3014 shfl.pFrom = path;
3015 shfl.pTo = NULL;
3017
3018 SHFileOperationA(&shfl);
3019}
3020
3021static void test_continuouscabs(void)
3022{
3023 UINT r;
3024
3025 if (!is_process_elevated())
3026 {
3027 skip("process is limited\n");
3028 return;
3029 }
3030
3033
3035
3038 {
3039 skip("Not enough rights to perform tests\n");
3040 goto error;
3041 }
3042 else
3043 {
3044 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3045 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3046 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3047 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3048 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3049 }
3050
3053
3056
3058
3061 {
3062 skip("Not enough rights to perform tests\n");
3063 }
3064 else
3065 {
3066 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3067 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3068 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3069 ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n");
3070 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3071 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3072 }
3073
3076
3077 /* Tests to show that only msi cab filename is taken in case of mismatch with the one given by previous cab */
3078
3079 /* Filename from cab is right and the one from msi is wrong */
3082
3084
3087 {
3088 skip("Not enough rights to perform tests\n");
3089 }
3090 else
3091 {
3092 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
3093 todo_wine ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3094 ok(!delete_pf("msitest\\caesar", TRUE), "File installed\n");
3095 todo_wine ok(!delete_pf("msitest\\maximus", TRUE), "File installed\n");
3096 todo_wine ok(!delete_pf("msitest", FALSE), "Directory created\n");
3097 }
3098
3101
3102 /* Filename from msi is right and the one from cab is wrong */
3104 ok(MoveFileA("test2.cab", "test2_.cab"), "Cannot rename test2.cab to test2_.cab\n");
3106
3108
3111 {
3112 skip("Not enough rights to perform tests\n");
3113 }
3114 else
3115 {
3116 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3117 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3118 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3119 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3120 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3121 }
3122
3123error:
3126}
3127
3128static void test_caborder(void)
3129{
3130 UINT r;
3131
3132 create_file("imperator", 100);
3133 create_file("maximus", 500);
3134 create_file("augustus", 50000);
3135 create_file("caesar", 500);
3136
3138
3140
3141 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
3142 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0");
3143 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
3144
3147 {
3148 skip("Not enough rights to perform tests\n");
3149 goto error;
3150 }
3151 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
3152 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
3153 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
3154 todo_wine
3155 {
3156 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
3157 ok(!delete_pf("msitest", FALSE), "Directory is created\n");
3158 }
3159
3161
3162 create_cab_file("test1.cab", MEDIA_SIZE, "imperator\0");
3163 create_cab_file("test2.cab", MEDIA_SIZE, "maximus\0augustus\0");
3164 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
3165
3167 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
3168 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
3169 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
3170 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
3171 ok(!delete_pf("msitest", FALSE), "Directory is created\n");
3172
3175
3178
3180 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
3181 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
3182 ok(!delete_pf("msitest", FALSE), "Directory is created\n");
3183 todo_wine
3184 {
3185 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
3186 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
3187 }
3188
3191
3194
3196 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
3197 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
3198 todo_wine
3199 {
3200 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
3201 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
3202 ok(!delete_pf("msitest", FALSE), "Directory is created\n");
3203 }
3204
3205error:
3207 DeleteFileA("imperator");
3208 DeleteFileA("maximus");
3209 DeleteFileA("augustus");
3210 DeleteFileA("caesar");
3212}
3213
3214static void test_mixedmedia(void)
3215{
3216 UINT r;
3217
3218 if (!is_process_elevated())
3219 {
3220 skip("process is limited\n");
3221 return;
3222 }
3223
3224 CreateDirectoryA("msitest", NULL);
3225 create_file("msitest\\maximus", 500);
3226 create_file("msitest\\augustus", 500);
3227 create_file("caesar", 500);
3228
3230
3232
3233 create_cab_file("test1.cab", MEDIA_SIZE, "caesar\0");
3234
3237 {
3238 skip("Not enough rights to perform tests\n");
3239 goto error;
3240 }
3241 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3242 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3243 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3244 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3245 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3246
3247error:
3248 /* Delete the files in the temp (current) folder */
3249 DeleteFileA("msitest\\maximus");
3250 DeleteFileA("msitest\\augustus");
3251 RemoveDirectoryA("msitest");
3252 DeleteFileA("caesar");
3253 DeleteFileA("test1.cab");
3255}
3256
3257static void test_samesequence(void)
3258{
3259 UINT r;
3260
3263
3265
3267 if (r == ERROR_INSTALL_FAILURE)
3268 {
3269 win_skip("unprivileged user?\n");
3270 goto error;
3271 }
3272 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3273 if (r == ERROR_SUCCESS)
3274 {
3275 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3276 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3277 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3278 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3279 }
3280
3281error:
3284}
3285
3286static void test_uiLevelFlags(void)
3287{
3288 UINT r;
3289
3292
3294
3296 if (r == ERROR_INSTALL_FAILURE)
3297 {
3298 win_skip("unprivileged user?\n");
3299 goto error;
3300 }
3301
3302 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3303 if (r == ERROR_SUCCESS)
3304 {
3305 ok(!delete_pf("msitest\\maximus", TRUE), "UI install occurred, but execute-only was requested.\n");
3306 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3307 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3308 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3309 }
3310
3311error:
3314}
3315
3317{
3318 CHAR buf[MAX_PATH];
3319 HANDLE file;
3320 DWORD size;
3321
3323 NULL, OPEN_EXISTING, 0, NULL);
3325 ReadFile(file, buf, 15, &size, NULL);
3327
3328 return !lstrcmpA(buf, "msitest\\maximus");
3329}
3330
3331static void test_readonlyfile(void)
3332{
3333 UINT r;
3334 DWORD size;
3335 HANDLE file;
3337
3338 if (!is_process_elevated())
3339 {
3340 skip("process is limited\n");
3341 return;
3342 }
3343
3344 CreateDirectoryA("msitest", NULL);
3345 create_file("msitest\\maximus", 500);
3347
3349
3351 lstrcatA(path, "\\msitest");
3353
3354 lstrcatA(path, "\\maximus");
3357
3358 WriteFile(file, "readonlyfile", strlen("readonlyfile"), &size, NULL);
3360
3363 {
3364 skip("Not enough rights to perform tests\n");
3365 goto error;
3366 }
3367 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3368 ok(file_matches(path), "Expected file to be overwritten\n");
3369 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3370 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3371
3372error:
3373 /* Delete the files in the temp (current) folder */
3374 DeleteFileA("msitest\\maximus");
3375 RemoveDirectoryA("msitest");
3377}
3378
3379static void test_readonlyfile_cab(void)
3380{
3381 UINT r;
3382 DWORD size;
3383 HANDLE file;
3385 CHAR buf[16];
3386
3387 if (!is_process_elevated())
3388 {
3389 skip("process is limited\n");
3390 return;
3391 }
3392
3393 CreateDirectoryA("msitest", NULL);
3394 create_file("maximus", 500);
3395 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
3396 DeleteFileA("maximus");
3397
3399
3401
3403 lstrcatA(path, "\\msitest");
3405
3406 lstrcatA(path, "\\maximus");
3409
3410 WriteFile(file, "readonlyfile", strlen("readonlyfile"), &size, NULL);
3412
3415 {
3416 skip("Not enough rights to perform tests\n");
3417 goto error;
3418 }
3419 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3420
3421 memset( buf, 0, sizeof(buf) );
3424 {
3425 ReadFile(file, buf, sizeof(buf) - 1, &size, NULL);
3427 }
3428 ok(!memcmp( buf, "maximus", sizeof("maximus")-1 ), "Expected file to be overwritten, got '%s'\n", buf);
3429 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3430 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3431
3432error:
3433 /* Delete the files in the temp (current) folder */
3435 DeleteFileA("msitest\\maximus");
3436 RemoveDirectoryA("msitest");
3438}
3439
3440static void test_setdirproperty(void)
3441{
3442 UINT r;
3443
3444 if (!is_process_elevated())
3445 {
3446 skip("process is limited\n");
3447 return;
3448 }
3449
3450 CreateDirectoryA("msitest", NULL);
3451 create_file("msitest\\maximus", 500);
3453
3455
3458 {
3459 skip("Not enough rights to perform tests\n");
3460 goto error;
3461 }
3462 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3463 ok(delete_cf("msitest\\maximus", TRUE), "File not installed\n");
3464 ok(delete_cf("msitest", FALSE), "Directory not created\n");
3465
3466error:
3467 /* Delete the files in the temp (current) folder */
3469 DeleteFileA("msitest\\maximus");
3470 RemoveDirectoryA("msitest");
3471}
3472
3473static void test_cabisextracted(void)
3474{
3475 UINT r;
3476
3477 if (!is_process_elevated())
3478 {
3479 skip("process is limited\n");
3480 return;
3481 }
3482
3483 CreateDirectoryA("msitest", NULL);
3484 create_file("msitest\\gaius", 500);
3485 create_file("maximus", 500);
3486 create_file("augustus", 500);
3487 create_file("caesar", 500);
3488
3489 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
3490 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0");
3491 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
3492
3494
3496
3499 {
3500 skip("Not enough rights to perform tests\n");
3501 goto error;
3502 }
3503 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3504 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3505 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3506 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3507 ok(delete_pf("msitest\\gaius", TRUE), "File not installed\n");
3508 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3509
3510error:
3511 /* Delete the files in the temp (current) folder */
3514 DeleteFileA("maximus");
3515 DeleteFileA("augustus");
3516 DeleteFileA("caesar");
3517 DeleteFileA("msitest\\gaius");
3518 RemoveDirectoryA("msitest");
3519}
3520
3522{
3524}
3525
3526BOOL pf_exists(const char *file)
3527{
3529
3531 lstrcatA(path, "\\");
3532 lstrcatA(path, file);
3533
3534 return file_exists(path);
3535}
3536
3537static void delete_pfmsitest_files(void)
3538{
3539 SHFILEOPSTRUCTA shfl;
3540 CHAR path[MAX_PATH+11];
3541
3543 lstrcatA(path, "\\msitest\\*");
3544 path[strlen(path) + 1] = '\0';
3545
3546 shfl.hwnd = NULL;
3547 shfl.wFunc = FO_DELETE;
3548 shfl.pFrom = path;
3549 shfl.pTo = NULL;
3551
3552 SHFileOperationA(&shfl);
3553
3555 lstrcatA(path, "\\msitest");
3557}
3558
3559UINT run_query(MSIHANDLE hdb, MSIHANDLE hrec, const char *query)
3560{
3561 MSIHANDLE hview = 0;
3562 UINT r;
3563
3564 r = MsiDatabaseOpenViewA(hdb, query, &hview);
3565 if(r != ERROR_SUCCESS)
3566 return r;
3567
3568 r = MsiViewExecute(hview, hrec);
3569 if(r == ERROR_SUCCESS)
3570 r = MsiViewClose(hview);
3571 MsiCloseHandle(hview);
3572 return r;
3573}
3574
3576{
3577 UINT r;
3578 MSIHANDLE suminfo = 0;
3579
3580 /* build summary info */
3582 ok(r == ERROR_SUCCESS , "Failed to open summaryinfo\n");
3583
3585 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3586
3588 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3589 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3590 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}");
3591 ok(r == ERROR_SUCCESS , "Failed to set summary info\n");
3592
3594 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3595
3597 ok(r == ERROR_SUCCESS , "Failed to make summary info persist\n");
3598
3600 ok(r == ERROR_SUCCESS , "Failed to close suminfo\n");
3601}
3602
3603static void generate_transform(void)
3604{
3605 MSIHANDLE hdb1, hdb2;
3606 LPCSTR query;
3607 UINT r;
3608
3609 /* start with two identical databases */
3611
3613 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3614
3615 r = MsiDatabaseCommit(hdb1);
3616 ok(r == ERROR_SUCCESS , "Failed to commit database\n");
3617
3619 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3620
3621 query = "INSERT INTO `Property` ( `Property`, `Value` ) VALUES ( 'prop', 'val' )";
3622 r = run_query(hdb1, 0, query);
3623 ok(r == ERROR_SUCCESS, "failed to add property\n");
3624
3625 /* database needs to be committed */
3626 MsiDatabaseCommit(hdb1);
3627
3628 r = MsiDatabaseGenerateTransformA(hdb1, hdb2, mstfile, 0, 0);
3629 ok(r == ERROR_SUCCESS, "return code %d, should be ERROR_SUCCESS\n", r);
3630
3631 r = MsiCreateTransformSummaryInfoA(hdb2, hdb2, mstfile, 0, 0);
3632 todo_wine ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3633
3634 MsiCloseHandle(hdb1);
3635 MsiCloseHandle(hdb2);
3636}
3637
3638/* data for generating a transform */
3639
3640/* tables transform names - encoded as they would be in an msi database file */
3641static const WCHAR name1[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */
3642static const WCHAR name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */
3643static const WCHAR name3[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */
3644
3645/* data in each table */
3646static const char data1[] = /* _StringData */
3647 "propval"; /* all the strings squashed together */
3648
3649static const WCHAR data2[] = { /* _StringPool */
3650/* len, refs */
3651 0, 0, /* string 0 '' */
3652 4, 1, /* string 1 'prop' */
3653 3, 1, /* string 2 'val' */
3654};
3655
3656static const WCHAR data3[] = { /* Property */
3657 0x0201, 0x0001, 0x0002,
3658};
3659
3660static const struct {
3662 const void *data;
3665{
3666 { name1, data1, sizeof data1 - 1 },
3667 { name2, data2, sizeof data2 },
3668 { name3, data3, sizeof data3 },
3670
3672{
3673 IStorage *stg = NULL;
3674 IStream *stm;
3675 WCHAR name[0x20];
3676 HRESULT r;
3677 DWORD i, count;
3679
3680 const CLSID CLSID_MsiTransform = { 0xc1082,0,0,{0xc0,0,0,0,0,0,0,0x46}};
3681
3682 MultiByteToWideChar(CP_ACP, 0, mstfile, -1, name, 0x20);
3683
3684 r = StgCreateDocfile(name, mode, 0, &stg);
3685 ok(r == S_OK, "failed to create storage\n");
3686 if (!stg)
3687 return;
3688
3689 r = IStorage_SetClass(stg, &CLSID_MsiTransform);
3690 ok(r == S_OK, "failed to set storage type\n");
3691
3692 for (i=0; i<ARRAY_SIZE(table_transform_data); i++)
3693 {
3694 r = IStorage_CreateStream(stg, table_transform_data[i].name,
3695 STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3696 if (FAILED(r))
3697 {
3698 ok(0, "failed to create stream %#lx\n", r);
3699 continue;
3700 }
3701
3702 r = IStream_Write(stm, table_transform_data[i].data,
3705 ok(0, "failed to write stream\n");
3706 IStream_Release(stm);
3707 }
3708
3709 IStorage_Release(stg);
3710
3712}
3713
3714static void test_transformprop(void)
3715{
3716 UINT r;
3717
3718 if (!is_process_elevated())
3719 {
3720 skip("process is limited\n");
3721 return;
3722 }
3723
3724 CreateDirectoryA("msitest", NULL);
3725 create_file("msitest\\augustus", 500);
3726
3728
3730
3733 {
3734 skip("Not enough rights to perform tests\n");
3735 goto error;
3736 }
3737 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3738 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3739 ok(!delete_pf("msitest", FALSE), "Directory created\n");
3740
3741 if (0)
3743 else
3745
3746 r = MsiInstallProductA(msifile, "TRANSFORMS=winetest.mst");
3747 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3748 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3749 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3750
3751error:
3752 /* Delete the files in the temp (current) folder */
3756 DeleteFileA("msitest\\augustus");
3757 RemoveDirectoryA("msitest");
3758}
3759
3760static void test_currentworkingdir(void)
3761{
3762 UINT r;
3764 LPSTR ptr;
3765
3766 if (!is_process_elevated())
3767 {
3768