2 * Copyright (C) 2006 James Hawkins
4 * A test program for installing MSI products.
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.
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.
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
21 #define _WIN32_MSI 300
32 #include <srrestoreptapi.h>
37 #include "wine/test.h"
39 static UINT (WINAPI
*pMsiQueryComponentStateA
)
40 (LPCSTR
, LPCSTR
, MSIINSTALLCONTEXT
, LPCSTR
, INSTALLSTATE
*);
41 static UINT (WINAPI
*pMsiSourceListEnumSourcesA
)
42 (LPCSTR
, LPCSTR
, MSIINSTALLCONTEXT
, DWORD
, DWORD
, LPSTR
, LPDWORD
);
43 static INSTALLSTATE (WINAPI
*pMsiGetComponentPathExA
)
44 (LPCSTR
, LPCSTR
, LPCSTR
, MSIINSTALLCONTEXT
, LPSTR
, LPDWORD
);
46 static BOOL (WINAPI
*pCheckTokenMembership
)(HANDLE
,PSID
,PBOOL
);
47 static BOOL (WINAPI
*pConvertSidToStringSidA
)(PSID
, LPSTR
*);
48 static BOOL (WINAPI
*pOpenProcessToken
)( HANDLE
, DWORD
, PHANDLE
);
49 static LONG (WINAPI
*pRegDeleteKeyExA
)(HKEY
, LPCSTR
, REGSAM
, DWORD
);
50 static BOOL (WINAPI
*pIsWow64Process
)(HANDLE
, PBOOL
);
52 static HMODULE hsrclient
= 0;
53 static BOOL (WINAPI
*pSRRemoveRestorePoint
)(DWORD
);
54 static BOOL (WINAPI
*pSRSetRestorePointA
)(RESTOREPOINTINFOA
*, STATEMGRSTATUS
*);
57 static const BOOL is_64bit
= sizeof(void *) > sizeof(int);
59 static const char *msifile
= "msitest.msi";
60 static const char *msifile2
= "winetest2.msi";
61 static const char *mstfile
= "winetest.mst";
63 static const WCHAR msifileW
[] = {'m','s','i','t','e','s','t','.','m','s','i',0};
64 static const WCHAR msifile2W
[] = {'w','i','n','e','t','e','s','t','2','.','m','s','i',0};
66 static CHAR CURR_DIR
[MAX_PATH
];
67 static CHAR PROG_FILES_DIR
[MAX_PATH
];
68 static CHAR PROG_FILES_DIR_NATIVE
[MAX_PATH
];
69 static CHAR COMMON_FILES_DIR
[MAX_PATH
];
70 static CHAR APP_DATA_DIR
[MAX_PATH
];
71 static CHAR WINDOWS_DIR
[MAX_PATH
];
73 /* msi database data */
75 static const CHAR component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
76 "s72\tS38\ts72\ti2\tS255\tS72\n"
77 "Component\tComponent\n"
78 "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n"
79 "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n"
80 "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\tNOT REINSTALL\tone.txt\n"
81 "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n"
82 "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n"
83 "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n"
84 "component\t\tMSITESTDIR\t0\t1\tfile\n"
85 "service_comp\t\tMSITESTDIR\t0\t1\tservice_file";
87 static const CHAR directory_dat
[] = "Directory\tDirectory_Parent\tDefaultDir\n"
89 "Directory\tDirectory\n"
90 "CABOUTDIR\tMSITESTDIR\tcabout\n"
91 "CHANGEDDIR\tMSITESTDIR\tchanged:second\n"
92 "FIRSTDIR\tMSITESTDIR\tfirst\n"
93 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
94 "NEWDIR\tCABOUTDIR\tnew\n"
95 "ProgramFilesFolder\tTARGETDIR\t.\n"
96 "TARGETDIR\t\tSourceDir";
98 static const CHAR feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
99 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
101 "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n"
102 "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n"
103 "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n"
104 "Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n"
105 "Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n"
106 "feature\t\t\t\t2\t1\tTARGETDIR\t0\n"
107 "service_feature\t\t\t\t2\t1\tTARGETDIR\t0";
109 static const CHAR feature_comp_dat
[] = "Feature_\tComponent_\n"
111 "FeatureComponents\tFeature_\tComponent_\n"
117 "feature\tcomponent\n"
118 "service_feature\tservice_comp\n";
120 static const CHAR file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
121 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
123 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
124 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
125 "one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n"
126 "three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n"
127 "two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n"
128 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
129 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1";
131 static const CHAR install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
133 "InstallExecuteSequence\tAction\n"
134 "AllocateRegistrySpace\tNOT Installed\t1550\n"
135 "CostFinalize\t\t1000\n"
136 "CostInitialize\t\t800\n"
138 "ResolveSource\t\t950\n"
139 "MoveFiles\t\t1700\n"
140 "InstallFiles\t\t4000\n"
141 "DuplicateFiles\t\t4500\n"
142 "WriteEnvironmentStrings\t\t4550\n"
143 "CreateShortcuts\t\t4600\n"
144 "InstallServices\t\t5000\n"
145 "InstallFinalize\t\t6600\n"
146 "InstallInitialize\t\t1500\n"
147 "InstallValidate\t\t1400\n"
148 "LaunchConditions\t\t100\n"
149 "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000";
151 static const CHAR media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
152 "i2\ti4\tL64\tS255\tS32\tS72\n"
154 "1\t3\t\t\tDISK1\t\n"
155 "2\t5\t\tmsitest.cab\tDISK2\t\n";
157 static const CHAR property_dat
[] = "Property\tValue\n"
159 "Property\tProperty\n"
160 "DefaultUIFont\tDlgFont8\n"
163 "InstallMode\tTypical\n"
164 "Manufacturer\tWine\n"
165 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
166 "PRIMARYFOLDER\tTARGETDIR\n"
167 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
169 "ProductLanguage\t1033\n"
170 "ProductName\tMSITEST\n"
171 "ProductVersion\t1.1.1\n"
172 "PROMPTROLLBACKCOST\tP\n"
174 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
175 "AdminProperties\tPOSTADMIN\n"
177 "SERVNAME\tTestService\n"
178 "SERVDISP\tTestServiceDisp\n"
179 "MSIFASTINSTALL\t1\n";
181 static const CHAR aup_property_dat
[] = "Property\tValue\n"
183 "Property\tProperty\n"
184 "DefaultUIFont\tDlgFont8\n"
188 "InstallMode\tTypical\n"
189 "Manufacturer\tWine\n"
190 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
191 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
193 "ProductLanguage\t1033\n"
194 "ProductName\tMSITEST\n"
195 "ProductVersion\t1.1.1\n"
196 "PROMPTROLLBACKCOST\tP\n"
198 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
199 "AdminProperties\tPOSTADMIN\n"
201 "SERVNAME\tTestService\n"
202 "SERVDISP\tTestServiceDisp\n"
203 "MSIFASTINSTALL\t1\n";
205 static const CHAR aup2_property_dat
[] = "Property\tValue\n"
207 "Property\tProperty\n"
208 "DefaultUIFont\tDlgFont8\n"
212 "InstallMode\tTypical\n"
213 "Manufacturer\tWine\n"
214 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
215 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
217 "ProductLanguage\t1033\n"
218 "ProductName\tMSITEST\n"
219 "ProductVersion\t1.1.1\n"
220 "PROMPTROLLBACKCOST\tP\n"
222 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
223 "AdminProperties\tPOSTADMIN\n"
225 "SERVNAME\tTestService\n"
226 "SERVDISP\tTestServiceDisp\n"
227 "MSIFASTINSTALL\t1\n";
229 static const CHAR icon_property_dat
[] = "Property\tValue\n"
231 "Property\tProperty\n"
232 "DefaultUIFont\tDlgFont8\n"
235 "InstallMode\tTypical\n"
236 "Manufacturer\tWine\n"
237 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
238 "ProductCode\t{7DF88A49-996F-4EC8-A022-BF956F9B2CBB}\n"
240 "ProductLanguage\t1033\n"
241 "ProductName\tMSITEST\n"
242 "ProductVersion\t1.1.1\n"
243 "PROMPTROLLBACKCOST\tP\n"
245 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
246 "AdminProperties\tPOSTADMIN\n"
248 "SERVNAME\tTestService\n"
249 "SERVDISP\tTestServiceDisp\n"
250 "MSIFASTINSTALL\t1\n";
252 static const CHAR shortcut_dat
[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"
253 "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n"
254 "Shortcut\tShortcut\n"
255 "Shortcut\tMSITESTDIR\tShortcut\tcomponent\tShortcut\t\tShortcut\t\t\t\t\t\n";
257 static const CHAR condition_dat
[] = "Feature_\tLevel\tCondition\n"
259 "Condition\tFeature_\tLevel\n"
262 static const CHAR up_property_dat
[] = "Property\tValue\n"
264 "Property\tProperty\n"
265 "DefaultUIFont\tDlgFont8\n"
268 "InstallMode\tTypical\n"
269 "Manufacturer\tWine\n"
270 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
271 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
273 "ProductLanguage\t1033\n"
274 "ProductName\tMSITEST\n"
275 "ProductVersion\t1.1.1\n"
276 "PROMPTROLLBACKCOST\tP\n"
278 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
279 "AdminProperties\tPOSTADMIN\n"
281 "SERVNAME\tTestService\n"
282 "SERVDISP\tTestServiceDisp\n"
283 "RemovePreviousVersions\t1\n"
284 "MSIFASTINSTALL\t1\n";
286 static const CHAR up2_property_dat
[] = "Property\tValue\n"
288 "Property\tProperty\n"
289 "DefaultUIFont\tDlgFont8\n"
292 "InstallMode\tTypical\n"
293 "Manufacturer\tWine\n"
294 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
295 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
297 "ProductLanguage\t1033\n"
298 "ProductName\tMSITEST\n"
299 "ProductVersion\t1.1.2\n"
300 "PROMPTROLLBACKCOST\tP\n"
302 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
303 "AdminProperties\tPOSTADMIN\n"
305 "SERVNAME\tTestService\n"
306 "SERVDISP\tTestServiceDisp\n"
307 "MSIFASTINSTALL\t1\n";
309 static const CHAR up3_property_dat
[] = "Property\tValue\n"
311 "Property\tProperty\n"
312 "DefaultUIFont\tDlgFont8\n"
315 "InstallMode\tTypical\n"
316 "Manufacturer\tWine\n"
317 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
318 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
320 "ProductLanguage\t1033\n"
321 "ProductName\tMSITEST\n"
322 "ProductVersion\t1.1.2\n"
323 "PROMPTROLLBACKCOST\tP\n"
325 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
326 "AdminProperties\tPOSTADMIN\n"
328 "SERVNAME\tTestService\n"
329 "SERVDISP\tTestServiceDisp\n"
330 "RemovePreviousVersions\t1\n"
331 "MSIFASTINSTALL\t1\n";
333 static const CHAR registry_dat
[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
334 "s72\ti2\tl255\tL255\tL0\ts72\n"
335 "Registry\tRegistry\n"
336 "Apples\t1\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n"
337 "Oranges\t1\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n"
338 "regdata\t1\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n"
339 "OrderTest\t1\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent";
341 static const CHAR service_install_dat
[] = "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
342 "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n"
343 "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n"
344 "ServiceInstall\tServiceInstall\n"
345 "TestService\t[SERVNAME]\t[SERVDISP]\t2\t3\t0\t\t\tTestService\t\t\tservice_comp\t\t";
347 static const CHAR service_control_dat
[] = "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
348 "s72\tl255\ti2\tL255\tI2\ts72\n"
349 "ServiceControl\tServiceControl\n"
350 "ServiceControl\tTestService\t8\t\t0\tservice_comp";
352 /* tables for test_continuouscabs */
353 static const CHAR cc_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
354 "s72\tS38\ts72\ti2\tS255\tS72\n"
355 "Component\tComponent\n"
356 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
357 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
358 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
360 static const CHAR cc2_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
361 "s72\tS38\ts72\ti2\tS255\tS72\n"
362 "Component\tComponent\n"
363 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
364 "augustus\t\tMSITESTDIR\t0\t0\taugustus\n"
365 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
367 static const CHAR cc_feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
368 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
370 "feature\t\t\t\t2\t1\tTARGETDIR\t0";
372 static const CHAR cc_feature_comp_dat
[] = "Feature_\tComponent_\n"
374 "FeatureComponents\tFeature_\tComponent_\n"
376 "feature\taugustus\n"
379 static const CHAR cc_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
380 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
382 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
383 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
384 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
386 static const CHAR cc2_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
387 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
389 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
390 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
391 "tiberius\tmaximus\ttiberius\t500\t\t\t16384\t3\n"
392 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
394 static const CHAR cc_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
395 "i2\ti4\tL64\tS255\tS32\tS72\n"
397 "1\t10\t\ttest1.cab\tDISK1\t\n"
398 "2\t2\t\ttest2.cab\tDISK2\t\n"
399 "3\t12\t\ttest3.cab\tDISK3\t\n";
401 static const CHAR cc3_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
402 "i2\ti4\tL64\tS255\tS32\tS72\n"
404 "1\t10\t\ttest1.cab\tDISK1\t\n"
405 "2\t2\t\ttest2_.cab\tDISK2\t\n"
406 "3\t12\t\ttest3.cab\tDISK3\t\n";
408 static const CHAR co_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
409 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
411 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
412 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
413 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
415 static const CHAR co_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
416 "i2\ti4\tL64\tS255\tS32\tS72\n"
418 "1\t10\t\ttest1.cab\tDISK1\t\n"
419 "2\t2\t\ttest2.cab\tDISK2\t\n"
420 "3\t3\t\ttest3.cab\tDISK3\t\n";
422 static const CHAR co2_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
423 "i2\ti4\tL64\tS255\tS32\tS72\n"
425 "1\t10\t\ttest1.cab\tDISK1\t\n"
426 "2\t12\t\ttest3.cab\tDISK3\t\n"
427 "3\t2\t\ttest2.cab\tDISK2\t\n";
429 static const CHAR mm_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
430 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
432 "maximus\tmaximus\tmaximus\t500\t\t\t512\t1\n"
433 "augustus\taugustus\taugustus\t500\t\t\t512\t2\n"
434 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
436 static const CHAR mm_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
437 "i2\ti4\tL64\tS255\tS32\tS72\n"
439 "1\t3\t\ttest1.cab\tDISK1\t\n";
441 static const CHAR ss_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
442 "i2\ti4\tL64\tS255\tS32\tS72\n"
444 "1\t2\t\ttest1.cab\tDISK1\t\n"
445 "2\t2\t\ttest2.cab\tDISK2\t\n"
446 "3\t12\t\ttest3.cab\tDISK3\t\n";
448 /* tables for test_uiLevelFlags */
449 static const CHAR ui_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
450 "s72\tS38\ts72\ti2\tS255\tS72\n"
451 "Component\tComponent\n"
452 "maximus\t\tMSITESTDIR\t0\tHASUIRUN=1\tmaximus\n"
453 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
454 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
456 static const CHAR ui_install_ui_seq_dat
[] = "Action\tCondition\tSequence\n"
458 "InstallUISequence\tAction\n"
459 "SetUIProperty\t\t5\n"
460 "ExecuteAction\t\t1100\n";
462 static const CHAR ui_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
463 "s72\ti2\tS64\tS0\tS255\n"
464 "CustomAction\tAction\n"
465 "SetUIProperty\t51\tHASUIRUN\t1\t\n";
467 static const CHAR rof_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
468 "s72\tS38\ts72\ti2\tS255\tS72\n"
469 "Component\tComponent\n"
470 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n";
472 static const CHAR rof_feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
473 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
475 "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n"
476 "montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0";
478 static const CHAR rof_feature_comp_dat
[] = "Feature_\tComponent_\n"
480 "FeatureComponents\tFeature_\tComponent_\n"
482 "montecristo\tmaximus";
484 static const CHAR rof_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
485 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
487 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1";
489 static const CHAR rof_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
490 "i2\ti4\tL64\tS255\tS32\tS72\n"
492 "1\t1\t\t\tDISK1\t\n";
494 static const CHAR rofc_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
495 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
497 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1";
499 static const CHAR rofc_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
500 "i2\ti4\tL64\tS255\tS32\tS72\n"
502 "1\t1\t\ttest1.cab\tDISK1\t\n";
504 static const CHAR sdp_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
506 "InstallExecuteSequence\tAction\n"
507 "AllocateRegistrySpace\tNOT Installed\t1550\n"
508 "CostFinalize\t\t1000\n"
509 "CostInitialize\t\t800\n"
511 "InstallFiles\t\t4000\n"
512 "InstallFinalize\t\t6600\n"
513 "InstallInitialize\t\t1500\n"
514 "InstallValidate\t\t1400\n"
515 "LaunchConditions\t\t100\n"
516 "SetDirProperty\t\t950";
518 static const CHAR sdp_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
519 "s72\ti2\tS64\tS0\tS255\n"
520 "CustomAction\tAction\n"
521 "SetDirProperty\t51\tMSITESTDIR\t[CommonFilesFolder]msitest\\\t\n";
523 static const CHAR pv_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
525 "InstallExecuteSequence\tAction\n"
526 "LaunchConditions\t\t100\n"
527 "CostInitialize\t\t800\n"
529 "CostFinalize\t\t1000\n"
530 "InstallValidate\t\t1400\n"
531 "InstallInitialize\t\t1500\n"
532 "InstallFiles\t\t4000\n"
533 "InstallFinalize\t\t6600\n";
535 static const CHAR cie_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
536 "s72\tS38\ts72\ti2\tS255\tS72\n"
537 "Component\tComponent\n"
538 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
539 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
540 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
541 "gaius\t\tMSITESTDIR\t0\t1\tgaius\n";
543 static const CHAR cie_feature_comp_dat
[] = "Feature_\tComponent_\n"
545 "FeatureComponents\tFeature_\tComponent_\n"
547 "feature\taugustus\n"
551 static const CHAR cie_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
552 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
554 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
555 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
556 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12\n"
557 "gaius\tgaius\tgaius\t500\t\t\t8192\t11";
559 static const CHAR cie_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
560 "i2\ti4\tL64\tS255\tS32\tS72\n"
562 "1\t1\t\ttest1.cab\tDISK1\t\n"
563 "2\t2\t\ttest2.cab\tDISK2\t\n"
564 "3\t12\t\ttest3.cab\tDISK3\t\n";
566 static const CHAR ci_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
567 "s72\tS38\ts72\ti2\tS255\tS72\n"
568 "Component\tComponent\n"
569 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n";
571 static const CHAR ci2_feature_comp_dat
[] = "Feature_\tComponent_\n"
573 "FeatureComponents\tFeature_\tComponent_\n"
576 static const CHAR ci2_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
577 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
579 "augustus\taugustus\taugustus\t500\t\t\t8192\t1";
581 static const CHAR pp_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
583 "InstallExecuteSequence\tAction\n"
584 "ValidateProductID\t\t700\n"
585 "CostInitialize\t\t800\n"
587 "CostFinalize\t\t1000\n"
588 "InstallValidate\t\t1400\n"
589 "InstallInitialize\t\t1500\n"
590 "ProcessComponents\tPROCESS_COMPONENTS=1 Or FULL=1\t1600\n"
591 "UnpublishFeatures\tUNPUBLISH_FEATURES=1 Or FULL=1\t1800\n"
592 "RemoveFiles\t\t3500\n"
593 "InstallFiles\t\t4000\n"
594 "RegisterUser\tREGISTER_USER=1 Or FULL=1\t6000\n"
595 "RegisterProduct\tREGISTER_PRODUCT=1 Or FULL=1\t6100\n"
596 "PublishFeatures\tPUBLISH_FEATURES=1 Or FULL=1\t6300\n"
597 "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n"
598 "InstallFinalize\t\t6600";
600 static const CHAR tp_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
601 "s72\tS38\ts72\ti2\tS255\tS72\n"
602 "Component\tComponent\n"
603 "augustus\t\tMSITESTDIR\t0\tprop=\"val\"\taugustus\n";
605 static const CHAR cwd_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
606 "s72\tS38\ts72\ti2\tS255\tS72\n"
607 "Component\tComponent\n"
608 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
610 static const CHAR adm_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
611 "s72\tS38\ts72\ti2\tS255\tS72\n"
612 "Component\tComponent\n"
613 "augustus\t\tMSITESTDIR\t0\tPOSTADMIN=1\taugustus";
615 static const CHAR adm_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
616 "s72\ti2\tS64\tS0\tS255\n"
617 "CustomAction\tAction\n"
618 "SetPOSTADMIN\t51\tPOSTADMIN\t1\t\n";
620 static const CHAR adm_admin_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
622 "AdminExecuteSequence\tAction\n"
623 "CostFinalize\t\t1000\n"
624 "CostInitialize\t\t800\n"
626 "SetPOSTADMIN\t\t950\n"
627 "InstallFiles\t\t4000\n"
628 "InstallFinalize\t\t6600\n"
629 "InstallInitialize\t\t1500\n"
630 "InstallValidate\t\t1400\n"
631 "LaunchConditions\t\t100";
633 static const CHAR amp_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
634 "s72\tS38\ts72\ti2\tS255\tS72\n"
635 "Component\tComponent\n"
636 "augustus\t\tMSITESTDIR\t0\tMYPROP=2718 and MyProp=42\taugustus\n";
638 static const CHAR rem_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
640 "InstallExecuteSequence\tAction\n"
641 "ValidateProductID\t\t700\n"
642 "CostInitialize\t\t800\n"
644 "CostFinalize\t\t1000\n"
645 "InstallValidate\t\t1400\n"
646 "InstallInitialize\t\t1500\n"
647 "ProcessComponents\t\t1600\n"
648 "UnpublishFeatures\t\t1800\n"
649 "RemoveFiles\t\t3500\n"
650 "InstallFiles\t\t4000\n"
651 "RegisterProduct\t\t6100\n"
652 "PublishFeatures\t\t6300\n"
653 "PublishProduct\t\t6400\n"
654 "InstallFinalize\t\t6600";
656 static const CHAR mc_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
657 "s72\tS38\ts72\ti2\tS255\tS72\n"
658 "Component\tComponent\n"
659 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
660 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
661 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
662 "gaius\t\tMSITESTDIR\t0\tGAIUS=1\tgaius\n"
663 "tiberius\t\tMSITESTDIR\t0\t\ttiberius\n";
665 static const CHAR mc_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
666 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
668 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
669 "augustus\taugustus\taugustus\t500\t\t\t0\t2\n"
670 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3\n"
671 "gaius\tgaius\tgaius\t500\t\t\t16384\t4\n"
672 "tiberius\ttiberius\ttiberius\t500\t\t\t0\t5\n";
674 static const CHAR mc_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
675 "i2\ti4\tL64\tS255\tS32\tS72\n"
677 "1\t1\t\ttest1.cab\tDISK1\t\n"
678 "2\t2\t\ttest2.cab\tDISK2\t\n"
679 "3\t3\t\ttest3.cab\tDISK3\t\n"
680 "4\t4\t\ttest3.cab\tDISK3\t\n"
681 "5\t5\t\ttest4.cab\tDISK4\t\n";
683 static const CHAR mc_file_hash_dat
[] = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"
684 "s72\ti2\ti4\ti4\ti4\ti4\n"
685 "MsiFileHash\tFile_\n"
686 "caesar\t0\t850433704\t-241429251\t675791761\t-1221108824";
688 static const CHAR wrv_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
689 "s72\tS38\ts72\ti2\tS255\tS72\n"
690 "Component\tComponent\n"
691 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
693 static const CHAR ca51_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
694 "s72\tS38\ts72\ti2\tS255\tS72\n"
695 "Component\tComponent\n"
696 "augustus\t\tMSITESTDIR\t0\tMYPROP=42\taugustus\n";
698 static const CHAR ca51_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
700 "InstallExecuteSequence\tAction\n"
701 "ValidateProductID\t\t700\n"
702 "GoodSetProperty\t\t725\n"
703 "BadSetProperty\t\t750\n"
704 "CostInitialize\t\t800\n"
705 "ResolveSource\t\t810\n"
707 "SetSourceDir\tSRCDIR\t910\n"
708 "CostFinalize\t\t1000\n"
709 "InstallValidate\t\t1400\n"
710 "InstallInitialize\t\t1500\n"
711 "InstallFiles\t\t4000\n"
712 "InstallFinalize\t\t6600";
714 static const CHAR ca51_custom_action_dat
[] = "Action\tType\tSource\tTarget\n"
716 "CustomAction\tAction\n"
717 "GoodSetProperty\t51\tMYPROP\t42\n"
718 "BadSetProperty\t51\t\tMYPROP\n"
719 "SetSourceDir\t51\tSourceDir\t[SRCDIR]\n";
721 static const CHAR is_feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
722 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
724 "one\t\t\t\t2\t1\t\t0\n" /* favorLocal */
725 "two\t\t\t\t2\t1\t\t1\n" /* favorSource */
726 "three\t\t\t\t2\t1\t\t4\n" /* favorAdvertise */
727 "four\t\t\t\t2\t0\t\t0"; /* disabled */
729 static const CHAR is_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
730 "s72\tS38\ts72\ti2\tS255\tS72\n"
731 "Component\tComponent\n"
732 "alpha\t\tMSITESTDIR\t0\t\talpha_file\n" /* favorLocal:Local */
733 "beta\t\tMSITESTDIR\t1\t\tbeta_file\n" /* favorLocal:Source */
734 "gamma\t\tMSITESTDIR\t2\t\tgamma_file\n" /* favorLocal:Optional */
735 "theta\t\tMSITESTDIR\t0\t\ttheta_file\n" /* favorSource:Local */
736 "delta\t\tMSITESTDIR\t1\t\tdelta_file\n" /* favorSource:Source */
737 "epsilon\t\tMSITESTDIR\t2\t\tepsilon_file\n" /* favorSource:Optional */
738 "zeta\t\tMSITESTDIR\t0\t\tzeta_file\n" /* favorAdvertise:Local */
739 "iota\t\tMSITESTDIR\t1\t\tiota_file\n" /* favorAdvertise:Source */
740 "eta\t\tMSITESTDIR\t2\t\teta_file\n" /* favorAdvertise:Optional */
741 "kappa\t\tMSITESTDIR\t0\t\tkappa_file\n" /* disabled:Local */
742 "lambda\t\tMSITESTDIR\t1\t\tlambda_file\n" /* disabled:Source */
743 "mu\t\tMSITESTDIR\t2\t\tmu_file\n"; /* disabled:Optional */
745 static const CHAR is_feature_comp_dat
[] = "Feature_\tComponent_\n"
747 "FeatureComponents\tFeature_\tComponent_\n"
761 static const CHAR is_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
762 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
764 "alpha_file\talpha\talpha\t500\t\t\t8192\t1\n"
765 "beta_file\tbeta\tbeta\t500\t\t\t8291\t2\n"
766 "gamma_file\tgamma\tgamma\t500\t\t\t8192\t3\n"
767 "theta_file\ttheta\ttheta\t500\t\t\t8192\t4\n"
768 "delta_file\tdelta\tdelta\t500\t\t\t8192\t5\n"
769 "epsilon_file\tepsilon\tepsilon\t500\t\t\t8192\t6\n"
770 "zeta_file\tzeta\tzeta\t500\t\t\t8192\t7\n"
771 "iota_file\tiota\tiota\t500\t\t\t8192\t8\n"
772 "eta_file\teta\teta\t500\t\t\t8192\t9\n"
773 "kappa_file\tkappa\tkappa\t500\t\t\t8192\t10\n"
774 "lambda_file\tlambda\tlambda\t500\t\t\t8192\t11\n"
775 "mu_file\tmu\tmu\t500\t\t\t8192\t12";
777 static const CHAR is_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
778 "i2\ti4\tL64\tS255\tS32\tS72\n"
780 "1\t12\t\t\tDISK1\t\n";
782 static const CHAR sp_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
783 "s72\tS38\ts72\ti2\tS255\tS72\n"
784 "Component\tComponent\n"
785 "augustus\t\tTWODIR\t0\t\taugustus\n";
787 static const CHAR sp_directory_dat
[] = "Directory\tDirectory_Parent\tDefaultDir\n"
789 "Directory\tDirectory\n"
790 "TARGETDIR\t\tSourceDir\n"
791 "ProgramFilesFolder\tTARGETDIR\t.\n"
792 "MSITESTDIR\tProgramFilesFolder\tmsitest:.\n"
793 "ONEDIR\tMSITESTDIR\t.:shortone|longone\n"
794 "TWODIR\tONEDIR\t.:shorttwo|longtwo";
796 static const CHAR mcp_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
797 "s72\tS38\ts72\ti2\tS255\tS72\n"
798 "Component\tComponent\n"
799 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t2\t\thydrogen\n"
800 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t2\t\thelium\n"
801 "lithium\t{4AF28FFC-71C7-4307-BDE4-B77C5338F56F}\tMSITESTDIR\t2\tPROPVAR=42\tlithium\n";
803 static const CHAR mcp_feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
804 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
806 "hydroxyl\t\thydroxyl\thydroxyl\t2\t1\tTARGETDIR\t0\n"
807 "heliox\t\theliox\theliox\t2\t5\tTARGETDIR\t0\n"
808 "lithia\t\tlithia\tlithia\t2\t10\tTARGETDIR\t0";
810 static const CHAR mcp_feature_comp_dat
[] = "Feature_\tComponent_\n"
812 "FeatureComponents\tFeature_\tComponent_\n"
813 "hydroxyl\thydrogen\n"
817 static const CHAR mcp_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
818 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
820 "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n"
821 "helium\thelium\thelium\t0\t\t\t8192\t1\n"
822 "lithium\tlithium\tlithium\t0\t\t\t8192\t1\n"
823 "beryllium\tmissingcomp\tberyllium\t0\t\t\t8192\t1";
825 static const CHAR ai_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
826 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
828 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
829 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
830 "one.txt\tOne\tone.txt\t1000\t\t\t16384\t1\n"
831 "three.txt\tThree\tthree.txt\t1000\t\t\t16384\t3\n"
832 "two.txt\tTwo\ttwo.txt\t1000\t\t\t16384\t2\n"
833 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
834 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1";
836 static const CHAR ip_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
838 "InstallExecuteSequence\tAction\n"
839 "CostFinalize\t\t1000\n"
840 "ValidateProductID\t\t700\n"
841 "CostInitialize\t\t800\n"
843 "RemoveFiles\t\t3500\n"
844 "InstallFiles\t\t4000\n"
845 "RegisterUser\t\t6000\n"
846 "RegisterProduct\t\t6100\n"
847 "PublishFeatures\t\t6300\n"
848 "PublishProduct\t\t6400\n"
849 "InstallFinalize\t\t6600\n"
850 "InstallInitialize\t\t1500\n"
851 "ProcessComponents\t\t1600\n"
852 "UnpublishFeatures\t\t1800\n"
853 "InstallValidate\t\t1400\n"
854 "LaunchConditions\t\t100\n"
855 "TestInstalledProp\tInstalled AND NOT REMOVE\t950\n";
857 static const CHAR ip_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
858 "s72\ti2\tS64\tS0\tS255\n"
859 "CustomAction\tAction\n"
860 "TestInstalledProp\t19\t\tTest failed\t\n";
862 static const CHAR aup_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
864 "InstallExecuteSequence\tAction\n"
865 "CostFinalize\t\t1000\n"
866 "ValidateProductID\t\t700\n"
867 "CostInitialize\t\t800\n"
869 "RemoveFiles\t\t3500\n"
870 "InstallFiles\t\t4000\n"
871 "RegisterUser\t\t6000\n"
872 "RegisterProduct\t\t6100\n"
873 "PublishFeatures\t\t6300\n"
874 "PublishProduct\t\t6400\n"
875 "InstallFinalize\t\t6600\n"
876 "InstallInitialize\t\t1500\n"
877 "ProcessComponents\t\t1600\n"
878 "UnpublishFeatures\t\t1800\n"
879 "InstallValidate\t\t1400\n"
880 "LaunchConditions\t\t100\n"
881 "TestAllUsersProp\tALLUSERS AND NOT REMOVE\t50\n";
883 static const CHAR aup2_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
885 "InstallExecuteSequence\tAction\n"
886 "CostFinalize\t\t1000\n"
887 "ValidateProductID\t\t700\n"
888 "CostInitialize\t\t800\n"
890 "RemoveFiles\t\t3500\n"
891 "InstallFiles\t\t4000\n"
892 "RegisterUser\t\t6000\n"
893 "RegisterProduct\t\t6100\n"
894 "PublishFeatures\t\t6300\n"
895 "PublishProduct\t\t6400\n"
896 "InstallFinalize\t\t6600\n"
897 "InstallInitialize\t\t1500\n"
898 "ProcessComponents\t\t1600\n"
899 "UnpublishFeatures\t\t1800\n"
900 "InstallValidate\t\t1400\n"
901 "LaunchConditions\t\t100\n"
902 "TestAllUsersProp\tALLUSERS=2 AND NOT REMOVE\t50\n";
904 static const CHAR aup3_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
906 "InstallExecuteSequence\tAction\n"
907 "CostFinalize\t\t1000\n"
908 "ValidateProductID\t\t700\n"
909 "CostInitialize\t\t800\n"
911 "RemoveFiles\t\t3500\n"
912 "InstallFiles\t\t4000\n"
913 "RegisterUser\t\t6000\n"
914 "RegisterProduct\t\t6100\n"
915 "PublishFeatures\t\t6300\n"
916 "PublishProduct\t\t6400\n"
917 "InstallFinalize\t\t6600\n"
918 "InstallInitialize\t\t1500\n"
919 "ProcessComponents\t\t1600\n"
920 "UnpublishFeatures\t\t1800\n"
921 "InstallValidate\t\t1400\n"
922 "LaunchConditions\t\t100\n"
923 "TestAllUsersProp\tALLUSERS=1 AND NOT REMOVE\t50\n";
925 static const CHAR aup_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
926 "s72\ti2\tS64\tS0\tS255\n"
927 "CustomAction\tAction\n"
928 "TestAllUsersProp\t19\t\tTest failed\t\n";
930 static const CHAR fo_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
931 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
933 "override.txt\toverride\toverride.txt\t1000\t\t\t8192\t1\n"
934 "preselected.txt\tpreselected\tpreselected.txt\t1000\t\t\t8192\t2\n"
935 "notpreselected.txt\tnotpreselected\tnotpreselected.txt\t1000\t\t\t8192\t3\n";
937 static const CHAR fo_feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
938 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
940 "override\t\t\toverride feature\t1\t1\tMSITESTDIR\t0\n"
941 "preselected\t\t\tpreselected feature\t1\t1\tMSITESTDIR\t0\n"
942 "notpreselected\t\t\tnotpreselected feature\t1\t1\tMSITESTDIR\t0\n";
944 static const CHAR fo_condition_dat
[] = "Feature_\tLevel\tCondition\n"
946 "Condition\tFeature_\tLevel\n"
947 "preselected\t0\tPreselected\n"
948 "notpreselected\t0\tNOT Preselected\n";
950 static const CHAR fo_feature_comp_dat
[] = "Feature_\tComponent_\n"
952 "FeatureComponents\tFeature_\tComponent_\n"
953 "override\toverride\n"
954 "preselected\tpreselected\n"
955 "notpreselected\tnotpreselected\n";
957 static const CHAR fo_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
958 "s72\tS38\ts72\ti2\tS255\tS72\n"
959 "Component\tComponent\n"
960 "override\t{0A00FB1D-97B0-4B42-ADF0-BB8913416623}\tMSITESTDIR\t0\t\toverride.txt\n"
961 "preselected\t{44E1DB75-605A-43DD-8CF5-CAB17F1BBD60}\tMSITESTDIR\t0\t\tpreselected.txt\n"
962 "notpreselected\t{E1647733-5E75-400A-A92E-5E60B4D4EF9F}\tMSITESTDIR\t0\t\tnotpreselected.txt\n";
964 static const CHAR fo_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
965 "s72\ti2\tS64\tS0\tS255\n"
966 "CustomAction\tAction\n"
967 "SetPreselected\t51\tPreselected\t1\t\n";
969 static const CHAR fo_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
971 "InstallExecuteSequence\tAction\n"
972 "LaunchConditions\t\t100\n"
973 "SetPreselected\tpreselect=1\t200\n"
974 "CostInitialize\t\t800\n"
976 "CostFinalize\t\t1000\n"
977 "InstallValidate\t\t1400\n"
978 "InstallInitialize\t\t1500\n"
979 "ProcessComponents\t\t1600\n"
980 "RemoveFiles\t\t1700\n"
981 "InstallFiles\t\t2000\n"
982 "RegisterProduct\t\t5000\n"
983 "PublishFeatures\t\t5100\n"
984 "PublishProduct\t\t5200\n"
985 "InstallFinalize\t\t6000\n";
987 static const CHAR uc_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
988 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
990 "upgradecode.txt\tupgradecode\tupgradecode.txt\t1000\t\t\t8192\t1\n";
992 static const CHAR uc_feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
993 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
995 "upgradecode\t\t\tupgradecode feature\t1\t2\tMSITESTDIR\t0\n";
997 static const CHAR uc_feature_comp_dat
[] = "Feature_\tComponent_\n"
999 "FeatureComponents\tFeature_\tComponent_\n"
1000 "upgradecode\tupgradecode\n";
1002 static const CHAR uc_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1003 "s72\tS38\ts72\ti2\tS255\tS72\n"
1004 "Component\tComponent\n"
1005 "upgradecode\t{6952B732-2FCB-4E47-976F-989FCBD7EDFB}\tMSITESTDIR\t0\t\tupgradecode.txt\n";
1007 static const CHAR uc_property_dat
[] = "Property\tValue\n"
1009 "Property\tProperty\n"
1011 "ProductCode\t{E5FB1241-F547-4BA7-A60E-8E75797268D4}\n"
1012 "ProductName\tMSITEST\n"
1013 "ProductVersion\t1.1.1\n"
1014 "UpgradeCode\t#UPGEADECODE#\n"
1015 "MSIFASTINSTALL\t1\n";
1017 static const CHAR uc_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
1019 "InstallExecuteSequence\tAction\n"
1020 "LaunchConditions\t\t100\n"
1021 "CostInitialize\t\t200\n"
1023 "CostFinalize\t\t400\n"
1024 "InstallInitialize\t\t500\n"
1025 "ProcessComponents\t\t600\n"
1026 "InstallValidate\t\t700\n"
1027 "RemoveFiles\t\t800\n"
1028 "InstallFiles\t\t900\n"
1029 "RegisterProduct\t\t1000\n"
1030 "PublishFeatures\t\t1100\n"
1031 "PublishProduct\t\t1200\n"
1032 "InstallFinalize\t\t1300\n";
1034 static const char mixed_feature_dat
[] =
1035 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1036 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1037 "Feature\tFeature\n"
1038 "feature1\t\t\t\t1\t2\tMSITESTDIR\t0\n"
1039 "feature2\t\t\t\t1\t2\tMSITESTDIR\t0\n";
1041 static const char mixed_feature_comp_dat
[] =
1042 "Feature_\tComponent_\n"
1044 "FeatureComponents\tFeature_\tComponent_\n"
1046 "feature2\tcomp2\n";
1048 static const char mixed_component_dat
[] =
1049 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1050 "s72\tS38\ts72\ti2\tS255\tS72\n"
1051 "Component\tComponent\n"
1052 "comp1\t{DE9F0EF4-0ED3-495A-8105-060C0EA457B8}\tTARGETDIR\t4\t\tregdata1\n"
1053 "comp2\t{4912DBE7-FC3A-4F91-BB5C-88F5C15C19A5}\tTARGETDIR\t260\t\tregdata2\n";
1055 static const char mixed_registry_dat
[] =
1056 "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
1057 "s72\ti2\tl255\tL255\tL0\ts72\n"
1058 "Registry\tRegistry\n"
1059 "regdata1\t2\tSOFTWARE\\Wine\\msitest\ttest1\t\tcomp1\n"
1060 "regdata2\t2\tSOFTWARE\\Wine\\msitest\ttest2\t\tcomp2\n"
1061 "regdata3\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\t\tCLSID_Winetest32\tcomp1\n"
1062 "regdata4\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32\t\twinetest32.dll\tcomp1\n"
1063 "regdata5\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\t\tCLSID_Winetest64\tcomp2\n"
1064 "regdata6\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32\t\twinetest64.dll\tcomp2\n";
1066 static const char mixed_install_exec_seq_dat
[] =
1067 "Action\tCondition\tSequence\n"
1069 "InstallExecuteSequence\tAction\n"
1070 "LaunchConditions\t\t100\n"
1071 "CostInitialize\t\t200\n"
1073 "CostFinalize\t\t400\n"
1074 "InstallValidate\t\t500\n"
1075 "InstallInitialize\t\t600\n"
1076 "ProcessComponents\t\t700\n"
1077 "UnpublishFeatures\t\t800\n"
1078 "RemoveRegistryValues\t\t900\n"
1079 "WriteRegistryValues\t\t1000\n"
1080 "RegisterProduct\t\t1100\n"
1081 "PublishFeatures\t\t1200\n"
1082 "PublishProduct\t\t1300\n"
1083 "InstallFinalize\t\t1400\n";
1085 static const char vp_file_dat
[] =
1086 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1087 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1089 "volumeprop\tcomp\tvolumeprop.txt\t1000\t\t\t8192\t1\n";
1091 static const char vp_feature_dat
[] =
1092 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1093 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1094 "Feature\tFeature\n"
1095 "feature\t\t\t\t1\t2\tMSITESTDIR\t0\n";
1097 static const char vp_feature_comp_dat
[] =
1098 "Feature_\tComponent_\n"
1100 "FeatureComponents\tFeature_\tComponent_\n"
1103 static const char vp_component_dat
[] =
1104 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1105 "s72\tS38\ts72\ti2\tS255\tS72\n"
1106 "Component\tComponent\n"
1107 "comp\t{24364AE7-5B7F-496C-AF5A-54893639C567}\tMSITESTDIR\t0\t\tvolumeprop\n";
1109 static const char vp_custom_action_dat
[] =
1110 "Action\tType\tSource\tTarget\tISComments\n"
1111 "s72\ti2\tS64\tS0\tS255\n"
1112 "CustomAction\tAction\n"
1113 "TestPrimaryVolumePath0\t19\t\tPrimaryVolumePath set before CostFinalize\t\n"
1114 "TestPrimaryVolumeSpaceAvailable0\t19\t\tPrimaryVolumeSpaceAvailable set before CostFinalize\t\n"
1115 "TestPrimaryVolumeSpaceRequired0\t19\t\tPrimaryVolumeSpaceRequired set before CostFinalize\t\n"
1116 "TestPrimaryVolumeSpaceRemaining0\t19\t\tPrimaryVolumeSpaceRemaining set before CostFinalize\t\n"
1117 "TestPrimaryVolumePath1\t19\t\tPrimaryVolumePath set before InstallValidate\t\n"
1118 "TestPrimaryVolumeSpaceAvailable1\t19\t\tPrimaryVolumeSpaceAvailable not set before InstallValidate\t\n"
1119 "TestPrimaryVolumeSpaceRequired1\t19\t\tPrimaryVolumeSpaceRequired not set before InstallValidate\t\n"
1120 "TestPrimaryVolumeSpaceRemaining1\t19\t\tPrimaryVolumeSpaceRemaining not set before InstallValidate\t\n"
1121 "TestPrimaryVolumePath2\t19\t\tPrimaryVolumePath not set after InstallValidate\t\n"
1122 "TestPrimaryVolumeSpaceAvailable2\t19\t\tPrimaryVolumeSpaceAvailable not set after InstallValidate\t\n"
1123 "TestPrimaryVolumeSpaceRequired2\t19\t\tPrimaryVolumeSpaceRequired not set after InstallValidate\t\n"
1124 "TestPrimaryVolumeSpaceRemaining2\t19\t\tPrimaryVolumeSpaceRemaining not set after InstallValidate\t\n";
1126 static const char vp_install_exec_seq_dat
[] =
1127 "Action\tCondition\tSequence\n"
1129 "InstallExecuteSequence\tAction\n"
1130 "LaunchConditions\t\t100\n"
1131 "CostInitialize\t\t200\n"
1133 "TestPrimaryVolumePath0\tPrimaryVolumePath AND NOT REMOVE\t400\n"
1134 "TestPrimaryVolumeSpaceAvailable0\tPrimaryVolumeSpaceAvailable AND NOT REMOVE\t500\n"
1135 "TestPrimaryVolumeSpaceRequired0\tPrimaryVolumeSpaceRequired AND NOT REMOVE\t510\n"
1136 "TestPrimaryVolumeSpaceRemaining0\tPrimaryVolumeSpaceRemaining AND NOT REMOVE\t520\n"
1137 "CostFinalize\t\t600\n"
1138 "TestPrimaryVolumePath1\tPrimaryVolumePath AND NOT REMOVE\t600\n"
1139 "TestPrimaryVolumeSpaceAvailable1\tNOT PrimaryVolumeSpaceAvailable AND NOT REMOVE\t800\n"
1140 "TestPrimaryVolumeSpaceRequired1\tNOT PrimaryVolumeSpaceRequired AND NOT REMOVE\t810\n"
1141 "TestPrimaryVolumeSpaceRemaining1\tNOT PrimaryVolumeSpaceRemaining AND NOT REMOVE\t820\n"
1142 "InstallValidate\t\t900\n"
1143 "TestPrimaryVolumePath2\tNOT PrimaryVolumePath AND NOT REMOVE\t1000\n"
1144 "TestPrimaryVolumeSpaceAvailable2\tNOT PrimaryVolumeSpaceAvailable AND NOT REMOVE\t1100\n"
1145 "TestPrimaryVolumeSpaceRequired2\tNOT PrimaryVolumeSpaceRequired AND NOT REMOVE\t1110\n"
1146 "TestPrimaryVolumeSpaceRemaining2\tNOT PrimaryVolumeSpaceRemaining AND NOT REMOVE\t1120\n"
1147 "InstallInitialize\t\t1200\n"
1148 "ProcessComponents\t\t1300\n"
1149 "RemoveFiles\t\t1400\n"
1150 "InstallFiles\t\t1500\n"
1151 "RegisterProduct\t\t1600\n"
1152 "PublishFeatures\t\t1700\n"
1153 "PublishProduct\t\t1800\n"
1154 "InstallFinalize\t\t1900\n";
1156 static const char shc_property_dat
[] =
1159 "Property\tProperty\n"
1161 "ProductCode\t{5CD99CD0-69C7-409B-9905-82DD743CC840}\n"
1162 "ProductName\tMSITEST\n"
1163 "ProductVersion\t1.1.1\n"
1164 "MSIFASTINSTALL\t1\n";
1166 static const char shc2_property_dat
[] =
1169 "Property\tProperty\n"
1171 "ProductCode\t{4CEFADE5-DAFB-4C21-8EF2-4ED4F139F340}\n"
1172 "ProductName\tMSITEST2\n"
1173 "ProductVersion\t1.1.1\n"
1174 "MSIFASTINSTALL\t1\n";
1176 static const char shc_file_dat
[] =
1177 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1178 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1180 "sharedcomponent\tsharedcomponent\tsharedcomponent.txt\t1000\t\t\t8192\t1\n";
1182 static const char shc_feature_dat
[] =
1183 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1184 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1185 "Feature\tFeature\n"
1186 "feature\t\t\t\t1\t2\tMSITESTDIR\t0\n";
1188 static const char shc_feature_comp_dat
[] =
1189 "Feature_\tComponent_\n"
1191 "FeatureComponents\tFeature_\tComponent_\n"
1192 "feature\tsharedcomponent\n";
1194 static const char shc_component_dat
[] =
1195 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1196 "s72\tS38\ts72\ti2\tS255\tS72\n"
1197 "Component\tComponent\n"
1198 "sharedcomponent\t{900A4ACB-DC6F-4795-A04B-81B530183D41}\tMSITESTDIR\t0\t\tsharedcomponent\n";
1200 static const char shc_custom_action_dat
[] =
1201 "Action\tType\tSource\tTarget\tISComments\n"
1202 "s72\ti2\tS64\tS0\tS255\n"
1203 "CustomAction\tAction\n"
1204 "TestComponentAction\t19\t\twrong component action on install\t\n";
1206 static const char shc_install_exec_seq_dat
[] =
1207 "Action\tCondition\tSequence\n"
1209 "InstallExecuteSequence\tAction\n"
1210 "LaunchConditions\t\t100\n"
1211 "CostInitialize\t\t200\n"
1213 "CostFinalize\t\t600\n"
1214 "InstallValidate\t\t900\n"
1215 "InstallInitialize\t\t1200\n"
1216 "ProcessComponents\t\t1300\n"
1217 "RemoveFiles\t\t1400\n"
1218 "InstallFiles\t\t1500\n"
1219 "TestComponentAction\tNOT REMOVE AND ($sharedcomponent <> 3)\t1600\n"
1220 "RegisterProduct\t\t1700\n"
1221 "PublishFeatures\t\t1800\n"
1222 "PublishProduct\t\t1900\n"
1223 "InstallFinalize\t\t2000\n";
1225 static const char ft_file_dat
[] =
1226 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1227 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1229 "featuretree\tcomp\tfeaturetree.txt\t1000\t\t\t8192\t1\n";
1231 static const char ft_comp_dat
[] =
1232 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1233 "s72\tS38\ts72\ti2\tS255\tS72\n"
1234 "Component\tComponent\n"
1235 "comp\t{12345678-1234-1234-1234-222222222222}\tTARGETDIR\t0\t\t\n"
1236 "comp2\t{12345678-1234-1234-1234-333333333333}\tTARGETDIR\t0\t\tfeaturetree\n";
1238 static const char ft_feature_dat
[] =
1239 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1240 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1241 "Feature\tFeature\n"
1242 "A\t\t\t\t2\t1\t\t0\n"
1243 "C\tB\t\t\t2\t1\t\t0\n"
1244 "B\tA\t\t\t4\t1\t\t0\n"
1245 "D\t\t\t\t2\t1\t\t0\n";
1247 static const char ft_feature_comp_dat
[] =
1248 "Feature_\tComponent_\n"
1250 "FeatureComponents\tFeature_\tComponent_\n"
1254 static const char ft_condition_dat
[] =
1255 "Feature_\tLevel\tCondition\n"
1257 "Condition\tFeature_\tLevel\n"
1258 "A\t0\t\"0\"<>INSTALLTYPE\n";
1260 static const char ft_custom_action_dat
[] =
1261 "Action\tType\tSource\tTarget\tISComments\n"
1262 "s72\ti2\tS64\tS0\tS255\n"
1263 "CustomAction\tAction\n"
1264 "Run A\t19\t\tA\t\n"
1265 "Run B\t19\t\tB\t\n"
1266 "Run C\t19\t\tC\t\n";
1268 static const char ft_install_exec_seq_dat
[] =
1269 "Action\tCondition\tSequence\n"
1271 "InstallExecuteSequence\tAction\n"
1272 "CostInitialize\t\t100\n"
1274 "CostFinalize\t\t300\n"
1275 "InstallValidate\t\t400\n"
1276 "InstallInitialize\t\t500\n"
1277 "Run C\t3 = &C AND NOT Installed\t600\n"
1278 "Run B\t3 = &B AND NOT Installed\t700\n"
1279 "Run A\t3 = &A AND NOT Installed\t800\n"
1280 "ProcessComponents\t\t900\n"
1281 "RemoveFiles\t\t1000\n"
1282 "InstallFiles\t\t1100\n"
1283 "RegisterProduct\t\t1200\n"
1284 "PublishFeatures\t\t1300\n"
1285 "PublishProduct\t\t1400\n"
1286 "InstallFinalize\t\t1500\n";
1288 typedef struct _msi_table
1290 const CHAR
*filename
;
1295 #define ADD_TABLE(x) {#x".idt", x##_dat, sizeof(x##_dat)}
1297 static const msi_table tables
[] =
1299 ADD_TABLE(component
),
1300 ADD_TABLE(directory
),
1302 ADD_TABLE(feature_comp
),
1304 ADD_TABLE(install_exec_seq
),
1306 ADD_TABLE(property
),
1307 ADD_TABLE(registry
),
1308 ADD_TABLE(service_install
),
1309 ADD_TABLE(service_control
)
1312 static const msi_table sc_tables
[] =
1314 ADD_TABLE(component
),
1315 ADD_TABLE(directory
),
1317 ADD_TABLE(feature_comp
),
1319 ADD_TABLE(install_exec_seq
),
1321 ADD_TABLE(property
),
1325 static const msi_table ps_tables
[] =
1327 ADD_TABLE(component
),
1328 ADD_TABLE(directory
),
1330 ADD_TABLE(feature_comp
),
1332 ADD_TABLE(install_exec_seq
),
1334 ADD_TABLE(property
),
1335 ADD_TABLE(condition
)
1338 static const msi_table up_tables
[] =
1340 ADD_TABLE(component
),
1341 ADD_TABLE(directory
),
1343 ADD_TABLE(feature_comp
),
1345 ADD_TABLE(install_exec_seq
),
1347 ADD_TABLE(up_property
),
1348 ADD_TABLE(registry
),
1349 ADD_TABLE(service_install
),
1350 ADD_TABLE(service_control
)
1353 static const msi_table up2_tables
[] =
1355 ADD_TABLE(component
),
1356 ADD_TABLE(directory
),
1358 ADD_TABLE(feature_comp
),
1360 ADD_TABLE(install_exec_seq
),
1362 ADD_TABLE(up2_property
),
1363 ADD_TABLE(registry
),
1364 ADD_TABLE(service_install
),
1365 ADD_TABLE(service_control
)
1368 static const msi_table up3_tables
[] =
1370 ADD_TABLE(component
),
1371 ADD_TABLE(directory
),
1373 ADD_TABLE(feature_comp
),
1375 ADD_TABLE(install_exec_seq
),
1377 ADD_TABLE(up3_property
),
1378 ADD_TABLE(registry
),
1379 ADD_TABLE(service_install
),
1380 ADD_TABLE(service_control
)
1383 static const msi_table up4_tables
[] =
1385 ADD_TABLE(component
),
1386 ADD_TABLE(directory
),
1388 ADD_TABLE(feature_comp
),
1390 ADD_TABLE(pp_install_exec_seq
),
1392 ADD_TABLE(property
),
1393 ADD_TABLE(registry
),
1394 ADD_TABLE(service_install
),
1395 ADD_TABLE(service_control
)
1398 static const msi_table up5_tables
[] =
1400 ADD_TABLE(component
),
1401 ADD_TABLE(directory
),
1403 ADD_TABLE(feature_comp
),
1405 ADD_TABLE(pp_install_exec_seq
),
1407 ADD_TABLE(up_property
),
1408 ADD_TABLE(registry
),
1409 ADD_TABLE(service_install
),
1410 ADD_TABLE(service_control
)
1413 static const msi_table up6_tables
[] =
1415 ADD_TABLE(component
),
1416 ADD_TABLE(directory
),
1418 ADD_TABLE(feature_comp
),
1420 ADD_TABLE(pp_install_exec_seq
),
1422 ADD_TABLE(up2_property
),
1423 ADD_TABLE(registry
),
1424 ADD_TABLE(service_install
),
1425 ADD_TABLE(service_control
)
1428 static const msi_table up7_tables
[] =
1430 ADD_TABLE(component
),
1431 ADD_TABLE(directory
),
1433 ADD_TABLE(feature_comp
),
1435 ADD_TABLE(pp_install_exec_seq
),
1437 ADD_TABLE(up3_property
),
1438 ADD_TABLE(registry
),
1439 ADD_TABLE(service_install
),
1440 ADD_TABLE(service_control
)
1443 static const msi_table cc_tables
[] =
1445 ADD_TABLE(cc_component
),
1446 ADD_TABLE(directory
),
1447 ADD_TABLE(cc_feature
),
1448 ADD_TABLE(cc_feature_comp
),
1450 ADD_TABLE(install_exec_seq
),
1451 ADD_TABLE(cc_media
),
1452 ADD_TABLE(property
),
1455 static const msi_table cc2_tables
[] =
1457 ADD_TABLE(cc2_component
),
1458 ADD_TABLE(directory
),
1459 ADD_TABLE(cc_feature
),
1460 ADD_TABLE(cc_feature_comp
),
1461 ADD_TABLE(cc2_file
),
1462 ADD_TABLE(install_exec_seq
),
1463 ADD_TABLE(cc_media
),
1464 ADD_TABLE(property
),
1467 static const msi_table cc3_tables
[] =
1469 ADD_TABLE(cc_component
),
1470 ADD_TABLE(directory
),
1471 ADD_TABLE(cc_feature
),
1472 ADD_TABLE(cc_feature_comp
),
1474 ADD_TABLE(install_exec_seq
),
1475 ADD_TABLE(cc3_media
),
1476 ADD_TABLE(property
),
1479 static const msi_table co_tables
[] =
1481 ADD_TABLE(cc_component
),
1482 ADD_TABLE(directory
),
1483 ADD_TABLE(cc_feature
),
1484 ADD_TABLE(cc_feature_comp
),
1486 ADD_TABLE(install_exec_seq
),
1487 ADD_TABLE(co_media
),
1488 ADD_TABLE(property
),
1491 static const msi_table co2_tables
[] =
1493 ADD_TABLE(cc_component
),
1494 ADD_TABLE(directory
),
1495 ADD_TABLE(cc_feature
),
1496 ADD_TABLE(cc_feature_comp
),
1498 ADD_TABLE(install_exec_seq
),
1499 ADD_TABLE(co2_media
),
1500 ADD_TABLE(property
),
1503 static const msi_table mm_tables
[] =
1505 ADD_TABLE(cc_component
),
1506 ADD_TABLE(directory
),
1507 ADD_TABLE(cc_feature
),
1508 ADD_TABLE(cc_feature_comp
),
1510 ADD_TABLE(install_exec_seq
),
1511 ADD_TABLE(mm_media
),
1512 ADD_TABLE(property
),
1515 static const msi_table ss_tables
[] =
1517 ADD_TABLE(cc_component
),
1518 ADD_TABLE(directory
),
1519 ADD_TABLE(cc_feature
),
1520 ADD_TABLE(cc_feature_comp
),
1522 ADD_TABLE(install_exec_seq
),
1523 ADD_TABLE(ss_media
),
1524 ADD_TABLE(property
),
1527 static const msi_table ui_tables
[] =
1529 ADD_TABLE(ui_component
),
1530 ADD_TABLE(directory
),
1531 ADD_TABLE(cc_feature
),
1532 ADD_TABLE(cc_feature_comp
),
1534 ADD_TABLE(install_exec_seq
),
1535 ADD_TABLE(ui_install_ui_seq
),
1536 ADD_TABLE(ui_custom_action
),
1537 ADD_TABLE(cc_media
),
1538 ADD_TABLE(property
),
1541 static const msi_table rof_tables
[] =
1543 ADD_TABLE(rof_component
),
1544 ADD_TABLE(directory
),
1545 ADD_TABLE(rof_feature
),
1546 ADD_TABLE(rof_feature_comp
),
1547 ADD_TABLE(rof_file
),
1548 ADD_TABLE(install_exec_seq
),
1549 ADD_TABLE(rof_media
),
1550 ADD_TABLE(property
),
1553 static const msi_table rofc_tables
[] =
1555 ADD_TABLE(rof_component
),
1556 ADD_TABLE(directory
),
1557 ADD_TABLE(rof_feature
),
1558 ADD_TABLE(rof_feature_comp
),
1559 ADD_TABLE(rofc_file
),
1560 ADD_TABLE(install_exec_seq
),
1561 ADD_TABLE(rofc_media
),
1562 ADD_TABLE(property
),
1565 static const msi_table sdp_tables
[] =
1567 ADD_TABLE(rof_component
),
1568 ADD_TABLE(directory
),
1569 ADD_TABLE(rof_feature
),
1570 ADD_TABLE(rof_feature_comp
),
1571 ADD_TABLE(rof_file
),
1572 ADD_TABLE(sdp_install_exec_seq
),
1573 ADD_TABLE(sdp_custom_action
),
1574 ADD_TABLE(rof_media
),
1575 ADD_TABLE(property
),
1578 static const msi_table cie_tables
[] =
1580 ADD_TABLE(cie_component
),
1581 ADD_TABLE(directory
),
1582 ADD_TABLE(cc_feature
),
1583 ADD_TABLE(cie_feature_comp
),
1584 ADD_TABLE(cie_file
),
1585 ADD_TABLE(install_exec_seq
),
1586 ADD_TABLE(cie_media
),
1587 ADD_TABLE(property
),
1590 static const msi_table tp_tables
[] =
1592 ADD_TABLE(tp_component
),
1593 ADD_TABLE(directory
),
1594 ADD_TABLE(rof_feature
),
1595 ADD_TABLE(ci2_feature_comp
),
1596 ADD_TABLE(ci2_file
),
1597 ADD_TABLE(install_exec_seq
),
1598 ADD_TABLE(rof_media
),
1599 ADD_TABLE(property
),
1602 static const msi_table cwd_tables
[] =
1604 ADD_TABLE(cwd_component
),
1605 ADD_TABLE(directory
),
1606 ADD_TABLE(rof_feature
),
1607 ADD_TABLE(ci2_feature_comp
),
1608 ADD_TABLE(ci2_file
),
1609 ADD_TABLE(install_exec_seq
),
1610 ADD_TABLE(rof_media
),
1611 ADD_TABLE(property
),
1614 static const msi_table adm_tables
[] =
1616 ADD_TABLE(adm_component
),
1617 ADD_TABLE(directory
),
1618 ADD_TABLE(rof_feature
),
1619 ADD_TABLE(ci2_feature_comp
),
1620 ADD_TABLE(ci2_file
),
1621 ADD_TABLE(install_exec_seq
),
1622 ADD_TABLE(rof_media
),
1623 ADD_TABLE(property
),
1624 ADD_TABLE(adm_custom_action
),
1625 ADD_TABLE(adm_admin_exec_seq
),
1628 static const msi_table amp_tables
[] =
1630 ADD_TABLE(amp_component
),
1631 ADD_TABLE(directory
),
1632 ADD_TABLE(rof_feature
),
1633 ADD_TABLE(ci2_feature_comp
),
1634 ADD_TABLE(ci2_file
),
1635 ADD_TABLE(install_exec_seq
),
1636 ADD_TABLE(rof_media
),
1637 ADD_TABLE(property
),
1640 static const msi_table mc_tables
[] =
1642 ADD_TABLE(mc_component
),
1643 ADD_TABLE(directory
),
1644 ADD_TABLE(cc_feature
),
1645 ADD_TABLE(cie_feature_comp
),
1647 ADD_TABLE(install_exec_seq
),
1648 ADD_TABLE(mc_media
),
1649 ADD_TABLE(property
),
1650 ADD_TABLE(mc_file_hash
),
1653 static const msi_table sf_tables
[] =
1655 ADD_TABLE(wrv_component
),
1656 ADD_TABLE(directory
),
1657 ADD_TABLE(rof_feature
),
1658 ADD_TABLE(ci2_feature_comp
),
1659 ADD_TABLE(ci2_file
),
1660 ADD_TABLE(install_exec_seq
),
1661 ADD_TABLE(rof_media
),
1662 ADD_TABLE(property
),
1665 static const msi_table ca51_tables
[] =
1667 ADD_TABLE(ca51_component
),
1668 ADD_TABLE(directory
),
1669 ADD_TABLE(rof_feature
),
1670 ADD_TABLE(ci2_feature_comp
),
1671 ADD_TABLE(ci2_file
),
1672 ADD_TABLE(ca51_install_exec_seq
),
1673 ADD_TABLE(rof_media
),
1674 ADD_TABLE(property
),
1675 ADD_TABLE(ca51_custom_action
),
1678 static const msi_table is_tables
[] =
1680 ADD_TABLE(is_component
),
1681 ADD_TABLE(directory
),
1682 ADD_TABLE(is_feature
),
1683 ADD_TABLE(is_feature_comp
),
1685 ADD_TABLE(install_exec_seq
),
1686 ADD_TABLE(is_media
),
1687 ADD_TABLE(property
),
1690 static const msi_table sp_tables
[] =
1692 ADD_TABLE(sp_component
),
1693 ADD_TABLE(sp_directory
),
1694 ADD_TABLE(rof_feature
),
1695 ADD_TABLE(ci2_feature_comp
),
1696 ADD_TABLE(ci2_file
),
1697 ADD_TABLE(install_exec_seq
),
1698 ADD_TABLE(rof_media
),
1699 ADD_TABLE(property
),
1702 static const msi_table mcp_tables
[] =
1704 ADD_TABLE(mcp_component
),
1705 ADD_TABLE(directory
),
1706 ADD_TABLE(mcp_feature
),
1707 ADD_TABLE(mcp_feature_comp
),
1708 ADD_TABLE(mcp_file
),
1709 ADD_TABLE(rem_install_exec_seq
),
1710 ADD_TABLE(rof_media
),
1711 ADD_TABLE(property
),
1714 static const msi_table ai_tables
[] =
1716 ADD_TABLE(component
),
1717 ADD_TABLE(directory
),
1719 ADD_TABLE(feature_comp
),
1721 ADD_TABLE(install_exec_seq
),
1726 static const msi_table pc_tables
[] =
1728 ADD_TABLE(ca51_component
),
1729 ADD_TABLE(directory
),
1730 ADD_TABLE(rof_feature
),
1731 ADD_TABLE(ci2_feature_comp
),
1732 ADD_TABLE(ci2_file
),
1733 ADD_TABLE(install_exec_seq
),
1734 ADD_TABLE(rof_media
),
1738 static const msi_table ip_tables
[] =
1740 ADD_TABLE(component
),
1741 ADD_TABLE(directory
),
1743 ADD_TABLE(feature_comp
),
1745 ADD_TABLE(ip_install_exec_seq
),
1746 ADD_TABLE(ip_custom_action
),
1751 static const msi_table aup_tables
[] =
1753 ADD_TABLE(component
),
1754 ADD_TABLE(directory
),
1756 ADD_TABLE(feature_comp
),
1758 ADD_TABLE(aup_install_exec_seq
),
1759 ADD_TABLE(aup_custom_action
),
1764 static const msi_table aup2_tables
[] =
1766 ADD_TABLE(component
),
1767 ADD_TABLE(directory
),
1769 ADD_TABLE(feature_comp
),
1771 ADD_TABLE(aup2_install_exec_seq
),
1772 ADD_TABLE(aup_custom_action
),
1774 ADD_TABLE(aup_property
)
1777 static const msi_table aup3_tables
[] =
1779 ADD_TABLE(component
),
1780 ADD_TABLE(directory
),
1782 ADD_TABLE(feature_comp
),
1784 ADD_TABLE(aup2_install_exec_seq
),
1785 ADD_TABLE(aup_custom_action
),
1787 ADD_TABLE(aup2_property
)
1790 static const msi_table aup4_tables
[] =
1792 ADD_TABLE(component
),
1793 ADD_TABLE(directory
),
1795 ADD_TABLE(feature_comp
),
1797 ADD_TABLE(aup3_install_exec_seq
),
1798 ADD_TABLE(aup_custom_action
),
1800 ADD_TABLE(aup2_property
)
1803 static const msi_table fiu_tables
[] =
1805 ADD_TABLE(rof_component
),
1806 ADD_TABLE(directory
),
1807 ADD_TABLE(rof_feature
),
1808 ADD_TABLE(rof_feature_comp
),
1809 ADD_TABLE(rof_file
),
1810 ADD_TABLE(pp_install_exec_seq
),
1811 ADD_TABLE(rof_media
),
1812 ADD_TABLE(property
),
1815 static const msi_table fiuc_tables
[] =
1817 ADD_TABLE(rof_component
),
1818 ADD_TABLE(directory
),
1819 ADD_TABLE(rof_feature
),
1820 ADD_TABLE(rof_feature_comp
),
1821 ADD_TABLE(rofc_file
),
1822 ADD_TABLE(pp_install_exec_seq
),
1823 ADD_TABLE(rofc_media
),
1824 ADD_TABLE(property
),
1827 static const msi_table fo_tables
[] =
1829 ADD_TABLE(directory
),
1831 ADD_TABLE(fo_component
),
1832 ADD_TABLE(fo_feature
),
1833 ADD_TABLE(fo_condition
),
1834 ADD_TABLE(fo_feature_comp
),
1835 ADD_TABLE(fo_custom_action
),
1836 ADD_TABLE(fo_install_exec_seq
),
1841 static const msi_table icon_base_tables
[] =
1843 ADD_TABLE(ci_component
),
1844 ADD_TABLE(directory
),
1845 ADD_TABLE(rof_feature
),
1846 ADD_TABLE(rof_feature_comp
),
1847 ADD_TABLE(rof_file
),
1848 ADD_TABLE(pp_install_exec_seq
),
1849 ADD_TABLE(rof_media
),
1850 ADD_TABLE(icon_property
),
1853 static const msi_table pv_tables
[] =
1855 ADD_TABLE(rof_component
),
1856 ADD_TABLE(directory
),
1857 ADD_TABLE(rof_feature
),
1858 ADD_TABLE(rof_feature_comp
),
1859 ADD_TABLE(rof_file
),
1860 ADD_TABLE(pv_install_exec_seq
),
1861 ADD_TABLE(rof_media
),
1865 static const msi_table uc_tables
[] =
1867 ADD_TABLE(directory
),
1868 ADD_TABLE(uc_component
),
1869 ADD_TABLE(uc_feature
),
1870 ADD_TABLE(uc_feature_comp
),
1872 ADD_TABLE(uc_install_exec_seq
),
1874 ADD_TABLE(uc_property
)
1877 static const msi_table mixed_tables
[] =
1879 ADD_TABLE(directory
),
1880 ADD_TABLE(mixed_component
),
1881 ADD_TABLE(mixed_feature
),
1882 ADD_TABLE(mixed_feature_comp
),
1883 ADD_TABLE(mixed_install_exec_seq
),
1884 ADD_TABLE(mixed_registry
),
1889 static const msi_table vp_tables
[] =
1891 ADD_TABLE(directory
),
1893 ADD_TABLE(vp_component
),
1894 ADD_TABLE(vp_feature
),
1895 ADD_TABLE(vp_feature_comp
),
1896 ADD_TABLE(vp_custom_action
),
1897 ADD_TABLE(vp_install_exec_seq
),
1902 static const msi_table shc_tables
[] =
1905 ADD_TABLE(directory
),
1906 ADD_TABLE(shc_file
),
1907 ADD_TABLE(shc_component
),
1908 ADD_TABLE(shc_feature
),
1909 ADD_TABLE(shc_feature_comp
),
1910 ADD_TABLE(shc_custom_action
),
1911 ADD_TABLE(shc_install_exec_seq
),
1912 ADD_TABLE(shc_property
)
1915 static const msi_table shc2_tables
[] =
1918 ADD_TABLE(directory
),
1919 ADD_TABLE(shc_file
),
1920 ADD_TABLE(shc_component
),
1921 ADD_TABLE(shc_feature
),
1922 ADD_TABLE(shc_feature_comp
),
1923 ADD_TABLE(shc_custom_action
),
1924 ADD_TABLE(shc_install_exec_seq
),
1925 ADD_TABLE(shc2_property
)
1928 static const msi_table ft_tables
[] =
1931 ADD_TABLE(directory
),
1934 ADD_TABLE(ft_feature
),
1935 ADD_TABLE(ft_feature_comp
),
1936 ADD_TABLE(ft_condition
),
1937 ADD_TABLE(ft_custom_action
),
1938 ADD_TABLE(ft_install_exec_seq
),
1942 /* cabinet definitions */
1944 /* make the max size large so there is only one cab file */
1945 #define MEDIA_SIZE 0x7FFFFFFF
1946 #define FOLDER_THRESHOLD 900000
1948 /* the FCI callbacks */
1950 static void * CDECL
mem_alloc(ULONG cb
)
1952 return HeapAlloc(GetProcessHeap(), 0, cb
);
1955 static void CDECL
mem_free(void *memory
)
1957 HeapFree(GetProcessHeap(), 0, memory
);
1960 static BOOL CDECL
get_next_cabinet(PCCAB pccab
, ULONG cbPrevCab
, void *pv
)
1962 sprintf(pccab
->szCab
, pv
, pccab
->iCab
);
1966 static LONG CDECL
progress(UINT typeStatus
, ULONG cb1
, ULONG cb2
, void *pv
)
1971 static int CDECL
file_placed(PCCAB pccab
, char *pszFile
, LONG cbFile
,
1972 BOOL fContinuation
, void *pv
)
1977 static INT_PTR CDECL
fci_open(char *pszFile
, int oflag
, int pmode
, int *err
, void *pv
)
1981 DWORD dwShareMode
= 0;
1982 DWORD dwCreateDisposition
= OPEN_EXISTING
;
1984 dwAccess
= GENERIC_READ
| GENERIC_WRITE
;
1985 /* FILE_SHARE_DELETE is not supported by Windows Me/98/95 */
1986 dwShareMode
= FILE_SHARE_READ
| FILE_SHARE_WRITE
;
1988 if (GetFileAttributesA(pszFile
) != INVALID_FILE_ATTRIBUTES
)
1989 dwCreateDisposition
= OPEN_EXISTING
;
1991 dwCreateDisposition
= CREATE_NEW
;
1993 handle
= CreateFileA(pszFile
, dwAccess
, dwShareMode
, NULL
,
1994 dwCreateDisposition
, 0, NULL
);
1996 ok(handle
!= INVALID_HANDLE_VALUE
, "Failed to CreateFile %s\n", pszFile
);
1998 return (INT_PTR
)handle
;
2001 static UINT CDECL
fci_read(INT_PTR hf
, void *memory
, UINT cb
, int *err
, void *pv
)
2003 HANDLE handle
= (HANDLE
)hf
;
2007 res
= ReadFile(handle
, memory
, cb
, &dwRead
, NULL
);
2008 ok(res
, "Failed to ReadFile\n");
2013 static UINT CDECL
fci_write(INT_PTR hf
, void *memory
, UINT cb
, int *err
, void *pv
)
2015 HANDLE handle
= (HANDLE
)hf
;
2019 res
= WriteFile(handle
, memory
, cb
, &dwWritten
, NULL
);
2020 ok(res
, "Failed to WriteFile\n");
2025 static int CDECL
fci_close(INT_PTR hf
, int *err
, void *pv
)
2027 HANDLE handle
= (HANDLE
)hf
;
2028 ok(CloseHandle(handle
), "Failed to CloseHandle\n");
2033 static LONG CDECL
fci_seek(INT_PTR hf
, LONG dist
, int seektype
, int *err
, void *pv
)
2035 HANDLE handle
= (HANDLE
)hf
;
2038 ret
= SetFilePointer(handle
, dist
, NULL
, seektype
);
2039 ok(ret
!= INVALID_SET_FILE_POINTER
, "Failed to SetFilePointer\n");
2044 static int CDECL
fci_delete(char *pszFile
, int *err
, void *pv
)
2046 BOOL ret
= DeleteFileA(pszFile
);
2047 ok(ret
, "Failed to DeleteFile %s\n", pszFile
);
2052 static void init_functionpointers(void)
2054 HMODULE hmsi
= GetModuleHandleA("msi.dll");
2055 HMODULE hadvapi32
= GetModuleHandleA("advapi32.dll");
2056 HMODULE hkernel32
= GetModuleHandleA("kernel32.dll");
2058 #define GET_PROC(mod, func) \
2059 p ## func = (void*)GetProcAddress(mod, #func); \
2061 trace("GetProcAddress(%s) failed\n", #func);
2063 GET_PROC(hmsi
, MsiQueryComponentStateA
);
2064 GET_PROC(hmsi
, MsiSourceListEnumSourcesA
);
2065 GET_PROC(hmsi
, MsiGetComponentPathExA
);
2067 GET_PROC(hadvapi32
, CheckTokenMembership
);
2068 GET_PROC(hadvapi32
, ConvertSidToStringSidA
);
2069 GET_PROC(hadvapi32
, OpenProcessToken
);
2070 GET_PROC(hadvapi32
, RegDeleteKeyExA
)
2071 GET_PROC(hkernel32
, IsWow64Process
)
2073 hsrclient
= LoadLibraryA("srclient.dll");
2074 GET_PROC(hsrclient
, SRRemoveRestorePoint
);
2075 GET_PROC(hsrclient
, SRSetRestorePointA
);
2080 static BOOL
is_process_limited(void)
2082 SID_IDENTIFIER_AUTHORITY NtAuthority
= {SECURITY_NT_AUTHORITY
};
2087 if (!pCheckTokenMembership
|| !pOpenProcessToken
) return FALSE
;
2089 if (!AllocateAndInitializeSid(&NtAuthority
, 2, SECURITY_BUILTIN_DOMAIN_RID
,
2090 DOMAIN_ALIAS_RID_ADMINS
, 0, 0, 0, 0, 0, 0, &Group
) ||
2091 !pCheckTokenMembership(NULL
, Group
, &IsInGroup
))
2093 trace("Could not check if the current user is an administrator\n");
2101 /* Only administrators have enough privileges for these tests */
2105 if (pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY
, &token
))
2108 TOKEN_ELEVATION_TYPE type
= TokenElevationTypeDefault
;
2111 ret
= GetTokenInformation(token
, TokenElevationType
, &type
, sizeof(type
), &size
);
2113 return (ret
&& type
== TokenElevationTypeLimited
);
2118 static BOOL
check_record(MSIHANDLE rec
, UINT field
, LPCSTR val
)
2125 r
= MsiRecordGetStringA(rec
, field
, buffer
, &sz
);
2126 return (r
== ERROR_SUCCESS
) && !strcmp(val
, buffer
);
2129 static BOOL CDECL
get_temp_file(char *pszTempName
, int cbTempName
, void *pv
)
2133 tempname
= HeapAlloc(GetProcessHeap(), 0, MAX_PATH
);
2134 GetTempFileNameA(".", "xx", 0, tempname
);
2136 if (tempname
&& (strlen(tempname
) < (unsigned)cbTempName
))
2138 lstrcpyA(pszTempName
, tempname
);
2139 HeapFree(GetProcessHeap(), 0, tempname
);
2143 HeapFree(GetProcessHeap(), 0, tempname
);
2148 static INT_PTR CDECL
get_open_info(char *pszName
, USHORT
*pdate
, USHORT
*ptime
,
2149 USHORT
*pattribs
, int *err
, void *pv
)
2151 BY_HANDLE_FILE_INFORMATION finfo
;
2157 handle
= CreateFileA(pszName
, GENERIC_READ
, FILE_SHARE_READ
, NULL
,
2158 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
| FILE_FLAG_SEQUENTIAL_SCAN
, NULL
);
2160 ok(handle
!= INVALID_HANDLE_VALUE
, "Failed to CreateFile %s\n", pszName
);
2162 res
= GetFileInformationByHandle(handle
, &finfo
);
2163 ok(res
, "Expected GetFileInformationByHandle to succeed\n");
2165 FileTimeToLocalFileTime(&finfo
.ftLastWriteTime
, &filetime
);
2166 FileTimeToDosDateTime(&filetime
, pdate
, ptime
);
2168 attrs
= GetFileAttributesA(pszName
);
2169 ok(attrs
!= INVALID_FILE_ATTRIBUTES
, "Failed to GetFileAttributes\n");
2171 return (INT_PTR
)handle
;
2174 static BOOL
add_file(HFCI hfci
, const char *file
, TCOMP compress
)
2176 char path
[MAX_PATH
];
2177 char filename
[MAX_PATH
];
2179 lstrcpyA(path
, CURR_DIR
);
2180 lstrcatA(path
, "\\");
2181 lstrcatA(path
, file
);
2183 lstrcpyA(filename
, file
);
2185 return FCIAddFile(hfci
, path
, filename
, FALSE
, get_next_cabinet
,
2186 progress
, get_open_info
, compress
);
2189 static void set_cab_parameters(PCCAB pCabParams
, const CHAR
*name
, DWORD max_size
)
2191 ZeroMemory(pCabParams
, sizeof(CCAB
));
2193 pCabParams
->cb
= max_size
;
2194 pCabParams
->cbFolderThresh
= FOLDER_THRESHOLD
;
2195 pCabParams
->setID
= 0xbeef;
2196 pCabParams
->iCab
= 1;
2197 lstrcpyA(pCabParams
->szCabPath
, CURR_DIR
);
2198 lstrcatA(pCabParams
->szCabPath
, "\\");
2199 lstrcpyA(pCabParams
->szCab
, name
);
2202 static void create_cab_file(const CHAR
*name
, DWORD max_size
, const CHAR
*files
)
2210 set_cab_parameters(&cabParams
, name
, max_size
);
2212 hfci
= FCICreate(&erf
, file_placed
, mem_alloc
, mem_free
, fci_open
,
2213 fci_read
, fci_write
, fci_close
, fci_seek
, fci_delete
,
2214 get_temp_file
, &cabParams
, NULL
);
2216 ok(hfci
!= NULL
, "Failed to create an FCI context\n");
2221 res
= add_file(hfci
, ptr
, tcompTYPE_MSZIP
);
2222 ok(res
, "Failed to add file: %s\n", ptr
);
2223 ptr
+= lstrlenA(ptr
) + 1;
2226 res
= FCIFlushCabinet(hfci
, FALSE
, get_next_cabinet
, progress
);
2227 ok(res
, "Failed to flush the cabinet\n");
2229 res
= FCIDestroy(hfci
);
2230 ok(res
, "Failed to destroy the cabinet\n");
2233 static BOOL
get_user_dirs(void)
2238 if (RegOpenKeyA(HKEY_CURRENT_USER
,
2239 "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", &hkey
))
2243 if(RegQueryValueExA(hkey
, "AppData", 0, &type
, (LPBYTE
)APP_DATA_DIR
, &size
)){
2252 static BOOL
get_system_dirs(void)
2257 if (RegOpenKeyA(HKEY_LOCAL_MACHINE
, "Software\\Microsoft\\Windows\\CurrentVersion", &hkey
))
2261 if (RegQueryValueExA(hkey
, "ProgramFilesDir (x86)", 0, &type
, (LPBYTE
)PROG_FILES_DIR
, &size
) &&
2262 RegQueryValueExA(hkey
, "ProgramFilesDir", 0, &type
, (LPBYTE
)PROG_FILES_DIR
, &size
)) {
2268 if (RegQueryValueExA(hkey
, "CommonFilesDir (x86)", 0, &type
, (LPBYTE
)COMMON_FILES_DIR
, &size
) &&
2269 RegQueryValueExA(hkey
, "CommonFilesDir", 0, &type
, (LPBYTE
)COMMON_FILES_DIR
, &size
)) {
2275 if (RegQueryValueExA(hkey
, "ProgramFilesDir", 0, &type
, (LPBYTE
)PROG_FILES_DIR_NATIVE
, &size
)) {
2282 if(!GetWindowsDirectoryA(WINDOWS_DIR
, MAX_PATH
))
2288 static void create_file_data(LPCSTR name
, LPCSTR data
, DWORD size
)
2293 file
= CreateFileA(name
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, 0, NULL
);
2294 if (file
== INVALID_HANDLE_VALUE
)
2297 WriteFile(file
, data
, strlen(data
), &written
, NULL
);
2301 SetFilePointer(file
, size
, NULL
, FILE_BEGIN
);
2308 #define create_file(name, size) create_file_data(name, name, size)
2310 static void create_test_files(void)
2312 CreateDirectoryA("msitest", NULL
);
2313 create_file("msitest\\one.txt", 100);
2314 CreateDirectoryA("msitest\\first", NULL
);
2315 create_file("msitest\\first\\two.txt", 100);
2316 CreateDirectoryA("msitest\\second", NULL
);
2317 create_file("msitest\\second\\three.txt", 100);
2319 create_file("four.txt", 100);
2320 create_file("five.txt", 100);
2321 create_cab_file("msitest.cab", MEDIA_SIZE
, "four.txt\0five.txt\0");
2323 create_file("msitest\\filename", 100);
2324 create_file("msitest\\service.exe", 100);
2326 DeleteFileA("four.txt");
2327 DeleteFileA("five.txt");
2330 static BOOL
delete_pf(const CHAR
*rel_path
, BOOL is_file
)
2332 CHAR path
[MAX_PATH
];
2334 lstrcpyA(path
, PROG_FILES_DIR
);
2335 lstrcatA(path
, "\\");
2336 lstrcatA(path
, rel_path
);
2339 return DeleteFileA(path
);
2341 return RemoveDirectoryA(path
);
2344 static BOOL
delete_pf_native(const CHAR
*rel_path
, BOOL is_file
)
2346 CHAR path
[MAX_PATH
];
2348 lstrcpyA(path
, PROG_FILES_DIR_NATIVE
);
2349 lstrcatA(path
, "\\");
2350 lstrcatA(path
, rel_path
);
2353 return DeleteFileA(path
);
2355 return RemoveDirectoryA(path
);
2358 static BOOL
delete_cf(const CHAR
*rel_path
, BOOL is_file
)
2360 CHAR path
[MAX_PATH
];
2362 lstrcpyA(path
, COMMON_FILES_DIR
);
2363 lstrcatA(path
, "\\");
2364 lstrcatA(path
, rel_path
);
2367 return DeleteFileA(path
);
2369 return RemoveDirectoryA(path
);
2372 static BOOL
compare_pf_data(const char *filename
, const char *data
, DWORD size
)
2377 char *buffer
, path
[MAX_PATH
];
2379 lstrcpyA(path
, PROG_FILES_DIR
);
2380 lstrcatA(path
, "\\");
2381 lstrcatA(path
, filename
);
2383 handle
= CreateFileA(path
, GENERIC_READ
, 0, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2384 buffer
= HeapAlloc(GetProcessHeap(), 0, size
);
2387 ReadFile(handle
, buffer
, size
, &read
, NULL
);
2388 if (read
== size
&& !memcmp(data
, buffer
, size
)) ret
= TRUE
;
2389 HeapFree(GetProcessHeap(), 0, buffer
);
2391 CloseHandle(handle
);
2395 static void delete_test_files(void)
2397 DeleteFileA("msitest.msi");
2398 DeleteFileA("msitest.cab");
2399 DeleteFileA("msitest\\second\\three.txt");
2400 DeleteFileA("msitest\\first\\two.txt");
2401 DeleteFileA("msitest\\one.txt");
2402 DeleteFileA("msitest\\service.exe");
2403 DeleteFileA("msitest\\filename");
2404 RemoveDirectoryA("msitest\\second");
2405 RemoveDirectoryA("msitest\\first");
2406 RemoveDirectoryA("msitest");
2409 static void write_file(const CHAR
*filename
, const char *data
, int data_size
)
2413 HANDLE hf
= CreateFileA(filename
, GENERIC_WRITE
, 0, NULL
,
2414 CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
2415 WriteFile(hf
, data
, data_size
, &size
, NULL
);
2419 static void write_msi_summary_info(MSIHANDLE db
, INT version
, INT wordcount
,
2420 const char *template, const char *packagecode
)
2425 r
= MsiGetSummaryInformationA(db
, NULL
, 5, &summary
);
2426 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2428 r
= MsiSummaryInfoSetPropertyA(summary
, PID_TEMPLATE
, VT_LPSTR
, 0, NULL
, template);
2429 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2431 r
= MsiSummaryInfoSetPropertyA(summary
, PID_REVNUMBER
, VT_LPSTR
, 0, NULL
, packagecode
);
2432 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2434 r
= MsiSummaryInfoSetPropertyA(summary
, PID_PAGECOUNT
, VT_I4
, version
, NULL
, NULL
);
2435 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2437 r
= MsiSummaryInfoSetPropertyA(summary
, PID_WORDCOUNT
, VT_I4
, wordcount
, NULL
, NULL
);
2438 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2440 r
= MsiSummaryInfoSetPropertyA(summary
, PID_TITLE
, VT_LPSTR
, 0, NULL
, "MSITEST");
2441 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2443 /* write the summary changes back to the stream */
2444 r
= MsiSummaryInfoPersist(summary
);
2445 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2447 MsiCloseHandle(summary
);
2450 #define create_database(name, tables, num_tables) \
2451 create_database_wordcount(name, tables, num_tables, 100, 0, ";1033", \
2452 "{004757CA-5092-49C2-AD20-28E1CE0DF5F2}");
2454 #define create_database_template(name, tables, num_tables, version, template) \
2455 create_database_wordcount(name, tables, num_tables, version, 0, template, \
2456 "{004757CA-5092-49C2-AD20-28E1CE0DF5F2}");
2458 static void create_database_wordcount(const CHAR
*name
, const msi_table
*tables
,
2459 int num_tables
, INT version
, INT wordcount
,
2460 const char *template, const char *packagecode
)
2467 len
= MultiByteToWideChar( CP_ACP
, 0, name
, -1, NULL
, 0 );
2468 if (!(nameW
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof(WCHAR
) ))) return;
2469 MultiByteToWideChar( CP_ACP
, 0, name
, -1, nameW
, len
);
2471 r
= MsiOpenDatabaseW(nameW
, MSIDBOPEN_CREATE
, &db
);
2472 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2474 /* import the tables into the database */
2475 for (j
= 0; j
< num_tables
; j
++)
2477 const msi_table
*table
= &tables
[j
];
2479 write_file(table
->filename
, table
->data
, (table
->size
- 1) * sizeof(char));
2481 r
= MsiDatabaseImportA(db
, CURR_DIR
, table
->filename
);
2482 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2484 DeleteFileA(table
->filename
);
2487 write_msi_summary_info(db
, version
, wordcount
, template, packagecode
);
2489 r
= MsiDatabaseCommit(db
);
2490 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2493 HeapFree( GetProcessHeap(), 0, nameW
);
2496 static void check_service_is_installed(void)
2498 SC_HANDLE scm
, service
;
2501 scm
= OpenSCManagerA(NULL
, NULL
, SC_MANAGER_ALL_ACCESS
);
2502 ok(scm
!= NULL
, "Failed to open the SC Manager\n");
2504 service
= OpenServiceA(scm
, "TestService", SC_MANAGER_ALL_ACCESS
);
2505 ok(service
!= NULL
, "Failed to open TestService\n");
2507 res
= DeleteService(service
);
2508 ok(res
, "Failed to delete TestService\n");
2510 CloseServiceHandle(service
);
2511 CloseServiceHandle(scm
);
2514 static BOOL
notify_system_change(DWORD event_type
, STATEMGRSTATUS
*status
)
2516 RESTOREPOINTINFOA spec
;
2518 spec
.dwEventType
= event_type
;
2519 spec
.dwRestorePtType
= APPLICATION_INSTALL
;
2520 spec
.llSequenceNumber
= status
->llSequenceNumber
;
2521 lstrcpyA(spec
.szDescription
, "msitest restore point");
2523 return pSRSetRestorePointA(&spec
, status
);
2526 static void remove_restore_point(DWORD seq_number
)
2530 res
= pSRRemoveRestorePoint(seq_number
);
2531 if (res
!= ERROR_SUCCESS
)
2532 trace("Failed to remove the restore point : %08x\n", res
);
2535 static LONG
delete_key( HKEY key
, LPCSTR subkey
, REGSAM access
)
2537 if (pRegDeleteKeyExA
)
2538 return pRegDeleteKeyExA( key
, subkey
, access
, 0 );
2539 return RegDeleteKeyA( key
, subkey
);
2542 static void test_MsiInstallProduct(void)
2545 CHAR path
[MAX_PATH
];
2548 DWORD num
, size
, type
;
2549 REGSAM access
= KEY_ALL_ACCESS
;
2551 if (is_process_limited())
2553 skip("process is limited\n");
2558 access
|= KEY_WOW64_64KEY
;
2560 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
2562 /* szPackagePath is NULL */
2563 r
= MsiInstallProductA(NULL
, "INSTALL=ALL");
2564 ok(r
== ERROR_INVALID_PARAMETER
,
2565 "Expected ERROR_INVALID_PARAMETER, got %d\n", r
);
2567 /* both szPackagePath and szCommandLine are NULL */
2568 r
= MsiInstallProductA(NULL
, NULL
);
2569 ok(r
== ERROR_INVALID_PARAMETER
,
2570 "Expected ERROR_INVALID_PARAMETER, got %d\n", r
);
2572 /* szPackagePath is empty */
2573 r
= MsiInstallProductA("", "INSTALL=ALL");
2574 ok(r
== ERROR_PATH_NOT_FOUND
,
2575 "Expected ERROR_PATH_NOT_FOUND, got %d\n", r
);
2577 create_test_files();
2578 create_database(msifile
, tables
, sizeof(tables
) / sizeof(msi_table
));
2580 /* install, don't publish */
2581 r
= MsiInstallProductA(msifile
, NULL
);
2582 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
2584 skip("Not enough rights to perform tests\n");
2587 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2589 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
2590 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
2591 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
2592 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
2593 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
2594 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
2595 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
2596 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
2597 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
2598 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
2599 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
2600 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
2602 res
= RegOpenKeyExA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", 0, access
, &hkey
);
2603 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2607 res
= RegQueryValueExA(hkey
, "Name", NULL
, &type
, (LPBYTE
)path
, &size
);
2608 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2609 ok(!lstrcmpA(path
, "imaname"), "Expected imaname, got %s\n", path
);
2613 res
= RegQueryValueExA(hkey
, "blah", NULL
, &type
, (LPBYTE
)path
, &size
);
2614 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2618 res
= RegQueryValueExA(hkey
, "number", NULL
, &type
, (LPBYTE
)&num
, &size
);
2619 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2620 ok(num
== 314, "Expected 314, got %d\n", num
);
2624 res
= RegQueryValueExA(hkey
, "OrderTestName", NULL
, &type
, (LPBYTE
)path
, &size
);
2625 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2626 ok(!lstrcmpA(path
, "OrderTestValue"), "Expected OrderTestValue, got %s\n", path
);
2628 check_service_is_installed();
2630 delete_key(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", access
);
2632 /* not published, reinstall */
2633 r
= MsiInstallProductA(msifile
, NULL
);
2634 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2636 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
2637 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
2638 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
2639 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
2640 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
2641 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
2642 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
2643 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
2644 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
2645 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
2646 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
2647 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
2649 res
= RegOpenKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", &hkey
);
2650 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2651 RegDeleteKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest");
2653 create_database(msifile
, up_tables
, sizeof(up_tables
) / sizeof(msi_table
));
2655 /* not published, RemovePreviousVersions set */
2656 r
= MsiInstallProductA(msifile
, NULL
);
2657 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2659 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
2660 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
2661 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
2662 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
2663 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
2664 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
2665 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
2666 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
2667 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
2668 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
2669 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
2670 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
2672 res
= RegOpenKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", &hkey
);
2673 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2674 RegDeleteKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest");
2676 create_database(msifile
, up2_tables
, sizeof(up2_tables
) / sizeof(msi_table
));
2678 /* not published, version number bumped */
2679 r
= MsiInstallProductA(msifile
, NULL
);
2680 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2682 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
2683 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
2684 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
2685 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
2686 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
2687 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
2688 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
2689 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
2690 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
2691 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
2692 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
2693 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
2695 res
= RegOpenKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", &hkey
);
2696 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2697 RegDeleteKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest");
2699 create_database(msifile
, up3_tables
, sizeof(up3_tables
) / sizeof(msi_table
));
2701 /* not published, RemovePreviousVersions set and version number bumped */
2702 r
= MsiInstallProductA(msifile
, NULL
);
2703 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2705 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
2706 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
2707 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
2708 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
2709 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
2710 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
2711 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
2712 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
2713 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
2714 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
2715 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
2716 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
2718 res
= RegOpenKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", &hkey
);
2719 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2720 RegDeleteKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest");
2722 create_database(msifile
, up4_tables
, sizeof(up4_tables
) / sizeof(msi_table
));
2724 /* install, publish product */
2725 r
= MsiInstallProductA(msifile
, "PUBLISH_PRODUCT=1");
2726 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2728 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
2729 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
2730 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
2731 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
2732 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
2733 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
2734 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
2735 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
2736 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
2737 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
2738 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
2739 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
2741 res
= RegOpenKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", &hkey
);
2742 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2744 create_database(msifile
, up4_tables
, sizeof(up4_tables
) / sizeof(msi_table
));
2746 /* published, reinstall */
2747 r
= MsiInstallProductA(msifile
, NULL
);
2748 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2750 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
2751 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
2752 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
2753 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
2754 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
2755 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
2756 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
2757 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
2758 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
2759 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
2760 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
2761 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
2763 res
= RegOpenKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", &hkey
);
2764 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2766 create_database(msifile
, up5_tables
, sizeof(up5_tables
) / sizeof(msi_table
));
2768 /* published product, RemovePreviousVersions set */
2769 r
= MsiInstallProductA(msifile
, NULL
);
2770 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2772 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
2773 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
2774 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
2775 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
2776 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
2777 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
2778 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
2779 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
2780 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
2781 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
2782 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
2783 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
2785 res
= RegOpenKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", &hkey
);
2786 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2788 create_database(msifile
, up6_tables
, sizeof(up6_tables
) / sizeof(msi_table
));
2790 /* published product, version number bumped */
2791 r
= MsiInstallProductA(msifile
, NULL
);
2792 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2794 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
2795 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
2796 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
2797 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
2798 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
2799 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
2800 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
2801 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
2802 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
2803 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
2804 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
2805 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
2807 res
= RegOpenKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", &hkey
);
2808 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2810 create_database(msifile
, up7_tables
, sizeof(up7_tables
) / sizeof(msi_table
));
2812 /* published product, RemovePreviousVersions set and version number bumped */
2813 r
= MsiInstallProductA(msifile
, NULL
);
2814 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2816 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
2817 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
2818 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
2819 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
2820 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
2821 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
2822 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
2823 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
2824 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
2825 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
2826 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
2827 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
2829 res
= RegOpenKeyA(HKEY_CURRENT_USER
, "SOFTWARE\\Wine\\msitest", &hkey
);
2830 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2832 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
2833 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2836 delete_test_files();
2837 DeleteFileA(msifile
);
2840 static void test_MsiSetComponentState(void)
2842 INSTALLSTATE installed
, action
;
2844 char path
[MAX_PATH
];
2847 create_database(msifile
, tables
, sizeof(tables
) / sizeof(msi_table
));
2851 lstrcpyA(path
, CURR_DIR
);
2852 lstrcatA(path
, "\\");
2853 lstrcatA(path
, msifile
);
2855 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
2857 r
= MsiOpenPackageA(path
, &package
);
2858 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
2860 skip("Not enough rights to perform tests\n");
2863 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2865 r
= MsiDoActionA(package
, "CostInitialize");
2866 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2868 r
= MsiDoActionA(package
, "FileCost");
2869 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2871 r
= MsiDoActionA(package
, "CostFinalize");
2872 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2874 r
= MsiGetComponentStateA(package
, "dangler", &installed
, &action
);
2875 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2876 ok(installed
== INSTALLSTATE_ABSENT
, "Expected INSTALLSTATE_ABSENT, got %d\n", installed
);
2877 ok(action
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action
);
2879 r
= MsiSetComponentStateA(package
, "dangler", INSTALLSTATE_SOURCE
);
2880 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2882 MsiCloseHandle(package
);
2886 DeleteFileA(msifile
);
2889 static void test_packagecoltypes(void)
2891 MSIHANDLE hdb
, view
, rec
;
2892 char path
[MAX_PATH
];
2893 WCHAR pathW
[MAX_PATH
];
2897 create_database(msifile
, tables
, sizeof(tables
) / sizeof(msi_table
));
2901 lstrcpyA(path
, CURR_DIR
);
2902 lstrcatA(path
, "\\");
2903 lstrcatA(path
, msifile
);
2904 MultiByteToWideChar( CP_ACP
, 0, path
, -1, pathW
, MAX_PATH
);
2906 r
= MsiOpenDatabaseW(pathW
, MSIDBOPEN_READONLY
, &hdb
);
2907 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2909 query
= "SELECT * FROM `Media`";
2910 r
= MsiDatabaseOpenViewA( hdb
, query
, &view
);
2911 ok(r
== ERROR_SUCCESS
, "MsiDatabaseOpenView failed\n");
2913 r
= MsiViewGetColumnInfo( view
, MSICOLINFO_NAMES
, &rec
);
2914 count
= MsiRecordGetFieldCount( rec
);
2915 ok(r
== ERROR_SUCCESS
, "MsiViewGetColumnInfo failed\n");
2916 ok(count
== 6, "Expected 6, got %d\n", count
);
2917 ok(check_record(rec
, 1, "DiskId"), "wrong column label\n");
2918 ok(check_record(rec
, 2, "LastSequence"), "wrong column label\n");
2919 ok(check_record(rec
, 3, "DiskPrompt"), "wrong column label\n");
2920 ok(check_record(rec
, 4, "Cabinet"), "wrong column label\n");
2921 ok(check_record(rec
, 5, "VolumeLabel"), "wrong column label\n");
2922 ok(check_record(rec
, 6, "Source"), "wrong column label\n");
2923 MsiCloseHandle(rec
);
2925 r
= MsiViewGetColumnInfo( view
, MSICOLINFO_TYPES
, &rec
);
2926 count
= MsiRecordGetFieldCount( rec
);
2927 ok(r
== ERROR_SUCCESS
, "MsiViewGetColumnInfo failed\n");
2928 ok(count
== 6, "Expected 6, got %d\n", count
);
2929 ok(check_record(rec
, 1, "i2"), "wrong column label\n");
2930 ok(check_record(rec
, 2, "i4"), "wrong column label\n");
2931 ok(check_record(rec
, 3, "L64"), "wrong column label\n");
2932 ok(check_record(rec
, 4, "S255"), "wrong column label\n");
2933 ok(check_record(rec
, 5, "S32"), "wrong column label\n");
2934 ok(check_record(rec
, 6, "S72"), "wrong column label\n");
2936 MsiCloseHandle(rec
);
2937 MsiCloseHandle(view
);
2938 MsiCloseHandle(hdb
);
2941 DeleteFileA(msifile
);
2944 static void create_cc_test_files(void)
2949 static CHAR cab_context
[] = "test%d.cab";
2952 create_file("maximus", 500);
2953 create_file("augustus", 50000);
2954 create_file("tiberius", 500);
2955 create_file("caesar", 500);
2957 set_cab_parameters(&cabParams
, "test1.cab", 40000);
2959 hfci
= FCICreate(&erf
, file_placed
, mem_alloc
, mem_free
, fci_open
,
2960 fci_read
, fci_write
, fci_close
, fci_seek
, fci_delete
,
2961 get_temp_file
, &cabParams
, cab_context
);
2962 ok(hfci
!= NULL
, "Failed to create an FCI context\n");
2964 res
= add_file(hfci
, "maximus", tcompTYPE_NONE
);
2965 ok(res
, "Failed to add file maximus\n");
2967 res
= add_file(hfci
, "augustus", tcompTYPE_NONE
);
2968 ok(res
, "Failed to add file augustus\n");
2970 res
= add_file(hfci
, "tiberius", tcompTYPE_NONE
);
2971 ok(res
, "Failed to add file tiberius\n");
2973 res
= FCIFlushCabinet(hfci
, FALSE
, get_next_cabinet
, progress
);
2974 ok(res
, "Failed to flush the cabinet\n");
2976 res
= FCIDestroy(hfci
);
2977 ok(res
, "Failed to destroy the cabinet\n");
2979 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
2981 DeleteFileA("maximus");
2982 DeleteFileA("augustus");
2983 DeleteFileA("tiberius");
2984 DeleteFileA("caesar");
2987 static void delete_cab_files(void)
2989 SHFILEOPSTRUCTA shfl
;
2990 CHAR path
[MAX_PATH
+10];
2992 lstrcpyA(path
, CURR_DIR
);
2993 lstrcatA(path
, "\\*.cab");
2994 path
[strlen(path
) + 1] = '\0';
2997 shfl
.wFunc
= FO_DELETE
;
3000 shfl
.fFlags
= FOF_FILESONLY
| FOF_NOCONFIRMATION
| FOF_NORECURSION
| FOF_SILENT
;
3002 SHFileOperationA(&shfl
);
3005 static void test_continuouscabs(void)
3009 if (is_process_limited())
3011 skip("process is limited\n");
3015 create_cc_test_files();
3016 create_database(msifile
, cc_tables
, sizeof(cc_tables
) / sizeof(msi_table
));
3018 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3020 r
= MsiInstallProductA(msifile
, NULL
);
3021 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3023 skip("Not enough rights to perform tests\n");
3028 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3029 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3030 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
3031 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3032 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3036 DeleteFileA(msifile
);
3038 create_cc_test_files();
3039 create_database(msifile
, cc2_tables
, sizeof(cc2_tables
) / sizeof(msi_table
));
3041 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3043 r
= MsiInstallProductA(msifile
, NULL
);
3044 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3046 skip("Not enough rights to perform tests\n");
3050 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3051 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3052 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3053 ok(delete_pf("msitest\\tiberius", TRUE
), "File not installed\n");
3054 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
3055 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3059 DeleteFileA(msifile
);
3061 /* Tests to show that only msi cab filename is taken in case of mismatch with the one given by previous cab */
3063 /* Filename from cab is right and the one from msi is wrong */
3064 create_cc_test_files();
3065 create_database(msifile
, cc3_tables
, sizeof(cc3_tables
) / sizeof(msi_table
));
3067 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3069 r
= MsiInstallProductA(msifile
, NULL
);
3070 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3072 skip("Not enough rights to perform tests\n");
3076 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
3077 todo_wine
ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3078 ok(!delete_pf("msitest\\caesar", TRUE
), "File installed\n");
3079 todo_wine
ok(!delete_pf("msitest\\maximus", TRUE
), "File installed\n");
3080 todo_wine
ok(!delete_pf("msitest", FALSE
), "Directory created\n");
3084 DeleteFileA(msifile
);
3086 /* Filename from msi is right and the one from cab is wrong */
3087 create_cc_test_files();
3088 ok(MoveFileA("test2.cab", "test2_.cab"), "Cannot rename test2.cab to test2_.cab\n");
3089 create_database(msifile
, cc3_tables
, sizeof(cc3_tables
) / sizeof(msi_table
));
3091 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3093 r
= MsiInstallProductA(msifile
, NULL
);
3094 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3096 skip("Not enough rights to perform tests\n");
3100 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3101 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3102 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
3103 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3104 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3109 DeleteFileA(msifile
);
3112 static void test_caborder(void)
3116 create_file("imperator", 100);
3117 create_file("maximus", 500);
3118 create_file("augustus", 50000);
3119 create_file("caesar", 500);
3121 create_database(msifile
, cc_tables
, sizeof(cc_tables
) / sizeof(msi_table
));
3123 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3125 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
3126 create_cab_file("test2.cab", MEDIA_SIZE
, "augustus\0");
3127 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
3129 r
= MsiInstallProductA(msifile
, NULL
);
3130 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3132 skip("Not enough rights to perform tests\n");
3135 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
3136 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
3137 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
3140 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
3141 ok(!delete_pf("msitest", FALSE
), "Directory is created\n");
3146 create_cab_file("test1.cab", MEDIA_SIZE
, "imperator\0");
3147 create_cab_file("test2.cab", MEDIA_SIZE
, "maximus\0augustus\0");
3148 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
3150 r
= MsiInstallProductA(msifile
, NULL
);
3151 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
3152 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
3153 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
3154 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
3155 ok(!delete_pf("msitest", FALSE
), "Directory is created\n");
3158 DeleteFileA(msifile
);
3160 create_cc_test_files();
3161 create_database(msifile
, co_tables
, sizeof(co_tables
) / sizeof(msi_table
));
3163 r
= MsiInstallProductA(msifile
, NULL
);
3164 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
3165 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
3166 ok(!delete_pf("msitest", FALSE
), "Directory is created\n");
3169 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
3170 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
3174 DeleteFileA(msifile
);
3176 create_cc_test_files();
3177 create_database(msifile
, co2_tables
, sizeof(co2_tables
) / sizeof(msi_table
));
3179 r
= MsiInstallProductA(msifile
, NULL
);
3180 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
3181 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
3184 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
3185 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
3186 ok(!delete_pf("msitest", FALSE
), "Directory is created\n");
3191 DeleteFileA("imperator");
3192 DeleteFileA("maximus");
3193 DeleteFileA("augustus");
3194 DeleteFileA("caesar");
3195 DeleteFileA(msifile
);
3198 static void test_mixedmedia(void)
3202 if (is_process_limited())
3204 skip("process is limited\n");
3208 CreateDirectoryA("msitest", NULL
);
3209 create_file("msitest\\maximus", 500);
3210 create_file("msitest\\augustus", 500);
3211 create_file("caesar", 500);
3213 create_database(msifile
, mm_tables
, sizeof(mm_tables
) / sizeof(msi_table
));
3215 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3217 create_cab_file("test1.cab", MEDIA_SIZE
, "caesar\0");
3219 r
= MsiInstallProductA(msifile
, NULL
);
3220 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3222 skip("Not enough rights to perform tests\n");
3225 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3226 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3227 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
3228 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3229 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3232 /* Delete the files in the temp (current) folder */
3233 DeleteFileA("msitest\\maximus");
3234 DeleteFileA("msitest\\augustus");
3235 RemoveDirectoryA("msitest");
3236 DeleteFileA("caesar");
3237 DeleteFileA("test1.cab");
3238 DeleteFileA(msifile
);
3241 static void test_samesequence(void)
3245 create_cc_test_files();
3246 create_database(msifile
, ss_tables
, sizeof(ss_tables
) / sizeof(msi_table
));
3248 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3250 r
= MsiInstallProductA(msifile
, NULL
);
3251 if (r
== ERROR_INSTALL_FAILURE
)
3253 win_skip("unprivileged user?\n");
3256 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3257 if (r
== ERROR_SUCCESS
)
3259 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3260 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
3261 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3262 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3267 DeleteFileA(msifile
);
3270 static void test_uiLevelFlags(void)
3274 create_cc_test_files();
3275 create_database(msifile
, ui_tables
, sizeof(ui_tables
) / sizeof(msi_table
));
3277 MsiSetInternalUI(INSTALLUILEVEL_NONE
| INSTALLUILEVEL_SOURCERESONLY
, NULL
);
3279 r
= MsiInstallProductA(msifile
, NULL
);
3280 if (r
== ERROR_INSTALL_FAILURE
)
3282 win_skip("unprivileged user?\n");
3286 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3287 if (r
== ERROR_SUCCESS
)
3289 ok(!delete_pf("msitest\\maximus", TRUE
), "UI install occurred, but execute-only was requested.\n");
3290 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
3291 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3292 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3297 DeleteFileA(msifile
);
3300 static BOOL
file_matches(LPSTR path
)
3306 file
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
3307 NULL
, OPEN_EXISTING
, 0, NULL
);
3308 ZeroMemory(buf
, MAX_PATH
);
3309 ReadFile(file
, buf
, 15, &size
, NULL
);
3312 return !lstrcmpA(buf
, "msitest\\maximus");
3315 static void test_readonlyfile(void)
3320 CHAR path
[MAX_PATH
];
3322 if (is_process_limited())
3324 skip("process is limited\n");
3328 CreateDirectoryA("msitest", NULL
);
3329 create_file("msitest\\maximus", 500);
3330 create_database(msifile
, rof_tables
, sizeof(rof_tables
) / sizeof(msi_table
));
3332 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3334 lstrcpyA(path
, PROG_FILES_DIR
);
3335 lstrcatA(path
, "\\msitest");
3336 CreateDirectoryA(path
, NULL
);
3338 lstrcatA(path
, "\\maximus");
3339 file
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
3340 NULL
, CREATE_NEW
, FILE_ATTRIBUTE_READONLY
, NULL
);
3342 WriteFile(file
, "readonlyfile", strlen("readonlyfile"), &size
, NULL
);
3345 r
= MsiInstallProductA(msifile
, NULL
);
3346 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3348 skip("Not enough rights to perform tests\n");
3351 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3352 ok(file_matches(path
), "Expected file to be overwritten\n");
3353 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3354 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3357 /* Delete the files in the temp (current) folder */
3358 DeleteFileA("msitest\\maximus");
3359 RemoveDirectoryA("msitest");
3360 DeleteFileA(msifile
);
3363 static void test_readonlyfile_cab(void)
3368 CHAR path
[MAX_PATH
];
3371 if (is_process_limited())
3373 skip("process is limited\n");
3377 CreateDirectoryA("msitest", NULL
);
3378 create_file("maximus", 500);
3379 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
3380 DeleteFileA("maximus");
3382 create_database(msifile
, rofc_tables
, sizeof(rofc_tables
) / sizeof(msi_table
));
3384 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3386 lstrcpyA(path
, PROG_FILES_DIR
);
3387 lstrcatA(path
, "\\msitest");
3388 CreateDirectoryA(path
, NULL
);
3390 lstrcatA(path
, "\\maximus");
3391 file
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
3392 NULL
, CREATE_NEW
, FILE_ATTRIBUTE_READONLY
, NULL
);
3394 WriteFile(file
, "readonlyfile", strlen("readonlyfile"), &size
, NULL
);
3397 r
= MsiInstallProductA(msifile
, NULL
);
3398 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3400 skip("Not enough rights to perform tests\n");
3403 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3405 memset( buf
, 0, sizeof(buf
) );
3406 if ((file
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
3407 NULL
, OPEN_EXISTING
, 0, NULL
)) != INVALID_HANDLE_VALUE
)
3409 ReadFile(file
, buf
, sizeof(buf
) - 1, &size
, NULL
);
3412 ok(!memcmp( buf
, "maximus", sizeof("maximus")-1 ), "Expected file to be overwritten, got '%s'\n", buf
);
3413 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3414 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3417 /* Delete the files in the temp (current) folder */
3419 DeleteFileA("msitest\\maximus");
3420 RemoveDirectoryA("msitest");
3421 DeleteFileA(msifile
);
3424 static void test_setdirproperty(void)
3428 if (is_process_limited())
3430 skip("process is limited\n");
3434 CreateDirectoryA("msitest", NULL
);
3435 create_file("msitest\\maximus", 500);
3436 create_database(msifile
, sdp_tables
, sizeof(sdp_tables
) / sizeof(msi_table
));
3438 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3440 r
= MsiInstallProductA(msifile
, NULL
);
3441 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3443 skip("Not enough rights to perform tests\n");
3446 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3447 ok(delete_cf("msitest\\maximus", TRUE
), "File not installed\n");
3448 ok(delete_cf("msitest", FALSE
), "Directory not created\n");
3451 /* Delete the files in the temp (current) folder */
3452 DeleteFileA(msifile
);
3453 DeleteFileA("msitest\\maximus");
3454 RemoveDirectoryA("msitest");
3457 static void test_cabisextracted(void)
3461 if (is_process_limited())
3463 skip("process is limited\n");
3467 CreateDirectoryA("msitest", NULL
);
3468 create_file("msitest\\gaius", 500);
3469 create_file("maximus", 500);
3470 create_file("augustus", 500);
3471 create_file("caesar", 500);
3473 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
3474 create_cab_file("test2.cab", MEDIA_SIZE
, "augustus\0");
3475 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
3477 create_database(msifile
, cie_tables
, sizeof(cie_tables
) / sizeof(msi_table
));
3479 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3481 r
= MsiInstallProductA(msifile
, NULL
);
3482 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3484 skip("Not enough rights to perform tests\n");
3487 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3488 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3489 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3490 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
3491 ok(delete_pf("msitest\\gaius", TRUE
), "File not installed\n");
3492 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3495 /* Delete the files in the temp (current) folder */
3497 DeleteFileA(msifile
);
3498 DeleteFileA("maximus");
3499 DeleteFileA("augustus");
3500 DeleteFileA("caesar");
3501 DeleteFileA("msitest\\gaius");
3502 RemoveDirectoryA("msitest");
3505 static BOOL
file_exists(LPCSTR file
)
3507 return GetFileAttributesA(file
) != INVALID_FILE_ATTRIBUTES
;
3510 static BOOL
pf_exists(LPCSTR file
)
3512 CHAR path
[MAX_PATH
];
3514 lstrcpyA(path
, PROG_FILES_DIR
);
3515 lstrcatA(path
, "\\");
3516 lstrcatA(path
, file
);
3518 return file_exists(path
);
3521 static void delete_pfmsitest_files(void)
3523 SHFILEOPSTRUCTA shfl
;
3524 CHAR path
[MAX_PATH
+11];
3526 lstrcpyA(path
, PROG_FILES_DIR
);
3527 lstrcatA(path
, "\\msitest\\*");
3528 path
[strlen(path
) + 1] = '\0';
3531 shfl
.wFunc
= FO_DELETE
;
3534 shfl
.fFlags
= FOF_FILESONLY
| FOF_NOCONFIRMATION
| FOF_NORECURSION
| FOF_SILENT
| FOF_NOERRORUI
;
3536 SHFileOperationA(&shfl
);
3538 lstrcpyA(path
, PROG_FILES_DIR
);
3539 lstrcatA(path
, "\\msitest");
3540 RemoveDirectoryA(path
);
3543 static UINT
run_query(MSIHANDLE hdb
, MSIHANDLE hrec
, const char *query
)
3545 MSIHANDLE hview
= 0;
3548 r
= MsiDatabaseOpenViewA(hdb
, query
, &hview
);
3549 if(r
!= ERROR_SUCCESS
)
3552 r
= MsiViewExecute(hview
, hrec
);
3553 if(r
== ERROR_SUCCESS
)
3554 r
= MsiViewClose(hview
);
3555 MsiCloseHandle(hview
);
3559 static void set_transform_summary_info(void)
3562 MSIHANDLE suminfo
= 0;
3564 /* build summary info */
3565 r
= MsiGetSummaryInformationA(0, mstfile
, 3, &suminfo
);
3566 ok(r
== ERROR_SUCCESS
, "Failed to open summaryinfo\n");
3568 r
= MsiSummaryInfoSetPropertyA(suminfo
, PID_TITLE
, VT_LPSTR
, 0, NULL
, "MSITEST");
3569 ok(r
== ERROR_SUCCESS
, "Failed to set summary info\n");
3571 r
= MsiSummaryInfoSetPropertyA(suminfo
, PID_REVNUMBER
, VT_LPSTR
, 0, NULL
,
3572 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3573 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3574 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}");
3575 ok(r
== ERROR_SUCCESS
, "Failed to set summary info\n");
3577 r
= MsiSummaryInfoSetPropertyA(suminfo
, PID_PAGECOUNT
, VT_I4
, 100, NULL
, NULL
);
3578 ok(r
== ERROR_SUCCESS
, "Failed to set summary info\n");
3580 r
= MsiSummaryInfoPersist(suminfo
);
3581 ok(r
== ERROR_SUCCESS
, "Failed to make summary info persist\n");
3583 r
= MsiCloseHandle(suminfo
);
3584 ok(r
== ERROR_SUCCESS
, "Failed to close suminfo\n");
3587 static void generate_transform(void)
3589 MSIHANDLE hdb1
, hdb2
;
3593 /* start with two identical databases */
3594 CopyFileA(msifile
, msifile2
, FALSE
);
3596 r
= MsiOpenDatabaseW(msifile2W
, MSIDBOPEN_TRANSACT
, &hdb1
);
3597 ok(r
== ERROR_SUCCESS
, "Failed to create database\n");
3599 r
= MsiDatabaseCommit(hdb1
);
3600 ok(r
== ERROR_SUCCESS
, "Failed to commit database\n");
3602 r
= MsiOpenDatabaseW(msifileW
, MSIDBOPEN_READONLY
, &hdb2
);
3603 ok(r
== ERROR_SUCCESS
, "Failed to create database\n");
3605 query
= "INSERT INTO `Property` ( `Property`, `Value` ) VALUES ( 'prop', 'val' )";
3606 r
= run_query(hdb1
, 0, query
);
3607 ok(r
== ERROR_SUCCESS
, "failed to add property\n");
3609 /* database needs to be committed */
3610 MsiDatabaseCommit(hdb1
);
3612 r
= MsiDatabaseGenerateTransformA(hdb1
, hdb2
, mstfile
, 0, 0);
3613 ok(r
== ERROR_SUCCESS
, "return code %d, should be ERROR_SUCCESS\n", r
);
3615 r
= MsiCreateTransformSummaryInfoA(hdb2
, hdb2
, mstfile
, 0, 0);
3616 todo_wine
ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3618 MsiCloseHandle(hdb1
);
3619 MsiCloseHandle(hdb2
);
3622 /* data for generating a transform */
3624 /* tables transform names - encoded as they would be in an msi database file */
3625 static const WCHAR name1
[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */
3626 static const WCHAR name2
[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */
3627 static const WCHAR name3
[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */
3629 /* data in each table */
3630 static const char data1
[] = /* _StringData */
3631 "propval"; /* all the strings squashed together */
3633 static const WCHAR data2
[] = { /* _StringPool */
3635 0, 0, /* string 0 '' */
3636 4, 1, /* string 1 'prop' */
3637 3, 1, /* string 2 'val' */
3640 static const WCHAR data3
[] = { /* Property */
3641 0x0201, 0x0001, 0x0002,
3644 static const struct {
3648 } table_transform_data
[] =
3650 { name1
, data1
, sizeof data1
- 1 },
3651 { name2
, data2
, sizeof data2
},
3652 { name3
, data3
, sizeof data3
},
3655 #define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0])
3657 static void generate_transform_manual(void)
3659 IStorage
*stg
= NULL
;
3664 const DWORD mode
= STGM_CREATE
|STGM_READWRITE
|STGM_DIRECT
|STGM_SHARE_EXCLUSIVE
;
3666 const CLSID CLSID_MsiTransform
= { 0xc1082,0,0,{0xc0,0,0,0,0,0,0,0x46}};
3668 MultiByteToWideChar(CP_ACP
, 0, mstfile
, -1, name
, 0x20);
3670 r
= StgCreateDocfile(name
, mode
, 0, &stg
);
3671 ok(r
== S_OK
, "failed to create storage\n");
3675 r
= IStorage_SetClass(stg
, &CLSID_MsiTransform
);
3676 ok(r
== S_OK
, "failed to set storage type\n");
3678 for (i
=0; i
<NUM_TRANSFORM_TABLES
; i
++)
3680 r
= IStorage_CreateStream(stg
, table_transform_data
[i
].name
,
3681 STGM_WRITE
| STGM_SHARE_EXCLUSIVE
, 0, 0, &stm
);
3684 ok(0, "failed to create stream %08x\n", r
);
3688 r
= IStream_Write(stm
, table_transform_data
[i
].data
,
3689 table_transform_data
[i
].size
, &count
);
3690 if (FAILED(r
) || count
!= table_transform_data
[i
].size
)
3691 ok(0, "failed to write stream\n");
3692 IStream_Release(stm
);
3695 IStorage_Release(stg
);
3697 set_transform_summary_info();
3700 static void test_transformprop(void)
3704 if (is_process_limited())
3706 skip("process is limited\n");
3710 CreateDirectoryA("msitest", NULL
);
3711 create_file("msitest\\augustus", 500);
3713 create_database(msifile
, tp_tables
, sizeof(tp_tables
) / sizeof(msi_table
));
3715 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3717 r
= MsiInstallProductA(msifile
, NULL
);
3718 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3720 skip("Not enough rights to perform tests\n");
3723 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3724 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3725 ok(!delete_pf("msitest", FALSE
), "Directory created\n");
3728 generate_transform();
3730 generate_transform_manual();
3732 r
= MsiInstallProductA(msifile
, "TRANSFORMS=winetest.mst");
3733 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3734 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3735 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3738 /* Delete the files in the temp (current) folder */
3739 DeleteFileA(msifile
);
3740 DeleteFileA(msifile2
);
3741 DeleteFileA(mstfile
);
3742 DeleteFileA("msitest\\augustus");
3743 RemoveDirectoryA("msitest");
3746 static void test_currentworkingdir(void)
3749 CHAR drive
[MAX_PATH
], path
[MAX_PATH
];
3752 if (is_process_limited())
3754 skip("process is limited\n");
3758 CreateDirectoryA("msitest", NULL
);
3759 create_file("msitest\\augustus", 500);
3761 create_database(msifile
, cwd_tables
, sizeof(cwd_tables
) / sizeof(msi_table
));
3763 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3765 CreateDirectoryA("diffdir", NULL
);
3766 SetCurrentDirectoryA("diffdir");
3768 sprintf(path
, "..\\%s", msifile
);
3769 r
= MsiInstallProductA(path
, NULL
);
3772 ok(r
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r
);
3773 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3774 ok(!delete_pf("msitest", FALSE
), "Directory created\n");
3777 sprintf(path
, "%s\\%s", CURR_DIR
, msifile
);
3778 r
= MsiInstallProductA(path
, NULL
);
3779 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3781 skip("Not enough rights to perform tests\n");
3784 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3785 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3786 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3788 lstrcpyA(drive
, CURR_DIR
);
3791 SetCurrentDirectoryA(drive
);
3793 lstrcpyA(path
, CURR_DIR
);
3794 if (path
[lstrlenA(path
) - 1] != '\\') lstrcatA(path
, "\\");
3795 lstrcatA(path
, msifile
);
3796 ptr
= strchr(path
, ':');
3799 r
= MsiInstallProductA(ptr
, NULL
);
3800 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3801 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3802 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
3805 SetCurrentDirectoryA(CURR_DIR
);
3806 DeleteFileA(msifile
);
3807 DeleteFileA("msitest\\augustus");
3808 RemoveDirectoryA("msitest");
3809 RemoveDirectoryA("diffdir");
3812 static void set_admin_summary_info(const WCHAR
*name
)
3814 MSIHANDLE db
, summary
;
3817 r
= MsiOpenDatabaseW(name
, MSIDBOPEN_DIRECT
, &db
);
3818 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3820 r
= MsiGetSummaryInformationA(db
, NULL
, 1, &summary
);
3821 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3823 r
= MsiSummaryInfoSetPropertyA(summary
, PID_WORDCOUNT
, VT_I4
, 5, NULL
, NULL
);
3824 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3826 /* write the summary changes back to the stream */
3827 r
= MsiSummaryInfoPersist(summary
);
3828 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3830 MsiCloseHandle(summary
);
3832 r
= MsiDatabaseCommit(db
);
3833 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3838 static void test_admin(void)
3842 CreateDirectoryA("msitest", NULL
);
3843 create_file("msitest\\augustus", 500);
3845 create_database(msifile
, adm_tables
, sizeof(adm_tables
) / sizeof(msi_table
));
3846 set_admin_summary_info(msifileW
);
3848 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3850 r
= MsiInstallProductA(msifile
, NULL
);
3851 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3853 skip("Not enough rights to perform tests\n");
3856 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3857 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3858 ok(!delete_pf("msitest", FALSE
), "Directory created\n");
3859 ok(!DeleteFileA("c:\\msitest\\augustus"), "File installed\n");
3860 ok(!RemoveDirectoryA("c:\\msitest"), "File installed\n");
3862 r
= MsiInstallProductA(msifile
, "ACTION=ADMIN");
3863 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3864 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3865 ok(!delete_pf("msitest", FALSE
), "Directory created\n");
3868 ok(DeleteFileA("c:\\msitest\\augustus"), "File not installed\n");
3869 ok(RemoveDirectoryA("c:\\msitest"), "File not installed\n");
3873 DeleteFileA(msifile
);
3874 DeleteFileA("msitest\\augustus");
3875 RemoveDirectoryA("msitest");
3878 static void set_admin_property_stream(LPCSTR file
)
3882 WCHAR fileW
[MAX_PATH
];
3885 const DWORD mode
= STGM_DIRECT
| STGM_READWRITE
| STGM_SHARE_EXCLUSIVE
;
3887 /* AdminProperties */
3888 static const WCHAR stmname
[] = {0x41ca,0x4330,0x3e71,0x44b5,0x4233,0x45f5,0x422c,0x4836,0};
3889 static const WCHAR data
[] = {'M','Y','P','R','O','P','=','2','7','1','8',' ',
3890 'M','y','P','r','o','p','=','4','2',0};
3892 MultiByteToWideChar(CP_ACP
, 0, file
, -1, fileW
, MAX_PATH
);
3894 hr
= StgOpenStorage(fileW
, NULL
, mode
, NULL
, 0, &stg
);
3895 ok(hr
== S_OK
, "Expected S_OK, got %d\n", hr
);
3899 hr
= IStorage_CreateStream(stg
, stmname
, STGM_WRITE
| STGM_SHARE_EXCLUSIVE
, 0, 0, &stm
);
3900 ok(hr
== S_OK
, "Expected S_OK, got %d\n", hr
);
3902 hr
= IStream_Write(stm
, data
, sizeof(data
), &count
);
3903 ok(hr
== S_OK
, "Expected S_OK, got %d\n", hr
);
3905 IStream_Release(stm
);
3906 IStorage_Release(stg
);
3909 static void test_adminprops(void)
3913 if (is_process_limited())
3915 skip("process is limited\n");
3919 CreateDirectoryA("msitest", NULL
);
3920 create_file("msitest\\augustus", 500);
3922 create_database(msifile
, amp_tables
, sizeof(amp_tables
) / sizeof(msi_table
));
3923 set_admin_summary_info(msifileW
);
3924 set_admin_property_stream(msifile
);
3926 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3928 r
= MsiInstallProductA(msifile
, NULL
);
3929 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3931 skip("Not enough rights to perform tests\n");
3934 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3935 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3936 ok(delete_pf("msitest", FALSE
), "Directory created\n");
3939 DeleteFileA(msifile
);
3940 DeleteFileA("msitest\\augustus");
3941 RemoveDirectoryA("msitest");
3944 static void create_pf_data(LPCSTR file
, LPCSTR data
, BOOL is_file
)
3946 CHAR path
[MAX_PATH
];
3948 lstrcpyA(path
, PROG_FILES_DIR
);
3949 lstrcatA(path
, "\\");
3950 lstrcatA(path
, file
);
3953 create_file_data(path
, data
, 500);
3955 CreateDirectoryA(path
, NULL
);
3958 #define create_pf(file, is_file) create_pf_data(file, file, is_file)
3960 static void test_missingcab(void)
3964 if (is_process_limited())
3966 skip("process is limited\n");
3970 CreateDirectoryA("msitest", NULL
);
3971 create_file("msitest\\augustus", 500);
3972 create_file("maximus", 500);
3973 create_file("tiberius", 500);
3975 create_database(msifile
, mc_tables
, sizeof(mc_tables
) / sizeof(msi_table
));
3977 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3979 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
3980 create_cab_file("test4.cab", MEDIA_SIZE
, "tiberius\0");
3982 create_pf("msitest", FALSE
);
3983 create_pf_data("msitest\\caesar", "abcdefgh", TRUE
);
3984 create_pf_data("msitest\\tiberius", "abcdefgh", TRUE
);
3986 r
= MsiInstallProductA(msifile
, NULL
);
3987 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
3989 skip("Not enough rights to perform tests\n");
3992 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3993 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3994 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3995 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
3996 ok(compare_pf_data("msitest\\tiberius", "abcdefgh", sizeof("abcdefgh")), "Wrong file contents\n");
3997 ok(delete_pf("msitest\\tiberius", TRUE
), "File not installed\n");
3998 ok(!delete_pf("msitest\\gaius", TRUE
), "File installed\n");
3999 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4001 create_pf("msitest", FALSE
);
4002 create_pf_data("msitest\\caesar", "abcdefgh", TRUE
);
4003 create_pf_data("msitest\\tiberius", "abcdefgh", TRUE
);
4004 create_pf("msitest\\gaius", TRUE
);
4006 r
= MsiInstallProductA(msifile
, "GAIUS=1");
4007 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
4010 ok(!delete_pf("msitest\\maximus", TRUE
), "File installed\n");
4011 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4013 ok(delete_pf("msitest\\caesar", TRUE
), "File removed\n");
4014 ok(compare_pf_data("msitest\\tiberius", "abcdefgh", sizeof("abcdefgh")), "Wrong file contents\n");
4015 ok(delete_pf("msitest\\tiberius", TRUE
), "File removed\n");
4016 ok(delete_pf("msitest\\gaius", TRUE
), "File removed\n");
4017 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4020 delete_pf("msitest", FALSE
);
4021 DeleteFileA("msitest\\augustus");
4022 RemoveDirectoryA("msitest");
4023 DeleteFileA("maximus");
4024 DeleteFileA("tiberius");
4025 DeleteFileA("test1.cab");
4026 DeleteFileA("test4.cab");
4027 DeleteFileA(msifile
);
4030 static void test_sourcefolder(void)
4034 if (is_process_limited())
4036 skip("process is limited\n");
4040 CreateDirectoryA("msitest", NULL
);
4041 create_file("augustus", 500);
4043 create_database(msifile
, sf_tables
, sizeof(sf_tables
) / sizeof(msi_table
));
4045 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4047 r
= MsiInstallProductA(msifile
, NULL
);
4048 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
4050 skip("Not enough rights to perform tests\n");
4053 ok(r
== ERROR_INSTALL_FAILURE
,
4054 "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
4055 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4058 ok(!delete_pf("msitest", FALSE
), "Directory created\n");
4060 RemoveDirectoryA("msitest");
4062 r
= MsiInstallProductA(msifile
, NULL
);
4063 ok(r
== ERROR_INSTALL_FAILURE
,
4064 "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
4065 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4068 ok(!delete_pf("msitest", FALSE
), "Directory created\n");
4072 DeleteFileA(msifile
);
4073 DeleteFileA("augustus");
4076 static void test_customaction51(void)
4080 if (is_process_limited())
4082 skip("process is limited\n");
4086 CreateDirectoryA("msitest", NULL
);
4087 create_file("msitest\\augustus", 500);
4089 create_database(msifile
, ca51_tables
, sizeof(ca51_tables
) / sizeof(msi_table
));
4091 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4093 r
= MsiInstallProductA(msifile
, NULL
);
4094 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
4096 skip("Not enough rights to perform tests\n");
4099 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4100 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4101 ok(delete_pf("msitest", FALSE
), "Directory created\n");
4104 DeleteFileA(msifile
);
4105 DeleteFileA("msitest\\augustus");
4106 RemoveDirectoryA("msitest");
4109 static void test_installstate(void)
4113 if (is_process_limited())
4115 skip("process is limited\n");
4119 CreateDirectoryA("msitest", NULL
);
4120 create_file("msitest\\alpha", 500);
4121 create_file("msitest\\beta", 500);
4122 create_file("msitest\\gamma", 500);
4123 create_file("msitest\\theta", 500);
4124 create_file("msitest\\delta", 500);
4125 create_file("msitest\\epsilon", 500);
4126 create_file("msitest\\zeta", 500);
4127 create_file("msitest\\iota", 500);
4128 create_file("msitest\\eta", 500);
4129 create_file("msitest\\kappa", 500);
4130 create_file("msitest\\lambda", 500);
4131 create_file("msitest\\mu", 500);
4133 create_database(msifile
, is_tables
, sizeof(is_tables
) / sizeof(msi_table
));
4135 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4137 r
= MsiInstallProductA(msifile
, NULL
);
4138 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
4140 skip("Not enough rights to perform tests\n");
4143 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4144 ok(delete_pf("msitest\\alpha", TRUE
), "File not installed\n");
4145 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4146 ok(delete_pf("msitest\\gamma", TRUE
), "File not installed\n");
4147 ok(delete_pf("msitest\\theta", TRUE
), "File not installed\n");
4148 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4149 ok(!delete_pf("msitest\\epsilon", TRUE
), "File installed\n");
4150 ok(!delete_pf("msitest\\zeta", TRUE
), "File installed\n");
4151 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4152 ok(!delete_pf("msitest\\eta", TRUE
), "File installed\n");
4153 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4154 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4155 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4156 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4158 r
= MsiInstallProductA(msifile
, "ADDLOCAL=\"one,two,three,four\"");
4159 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4160 ok(delete_pf("msitest\\alpha", TRUE
), "File not installed\n");
4161 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4162 ok(delete_pf("msitest\\gamma", TRUE
), "File not installed\n");
4163 ok(delete_pf("msitest\\theta", TRUE
), "File not installed\n");
4164 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4165 ok(delete_pf("msitest\\epsilon", TRUE
), "File not installed\n");
4166 ok(delete_pf("msitest\\zeta", TRUE
), "File not installed\n");
4167 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4168 ok(delete_pf("msitest\\eta", TRUE
), "File not installed\n");
4169 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4170 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4171 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4172 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4174 r
= MsiInstallProductA(msifile
, "ADDSOURCE=\"one,two,three,four\"");
4175 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4176 ok(delete_pf("msitest\\alpha", TRUE
), "File not installed\n");
4177 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4178 ok(!delete_pf("msitest\\gamma", TRUE
), "File installed\n");
4179 ok(delete_pf("msitest\\theta", TRUE
), "File not installed\n");
4180 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4181 ok(!delete_pf("msitest\\epsilon", TRUE
), "File installed\n");
4182 ok(delete_pf("msitest\\zeta", TRUE
), "File not installed\n");
4183 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4184 ok(!delete_pf("msitest\\eta", TRUE
), "File installed\n");
4185 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4186 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4187 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4188 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4190 r
= MsiInstallProductA(msifile
, "REMOVE=\"one,two,three,four\"");
4191 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4192 ok(!delete_pf("msitest\\alpha", TRUE
), "File installed\n");
4193 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4194 ok(!delete_pf("msitest\\gamma", TRUE
), "File installed\n");
4195 ok(!delete_pf("msitest\\theta", TRUE
), "File installed\n");
4196 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4197 ok(!delete_pf("msitest\\epsilon", TRUE
), "File installed\n");
4198 ok(!delete_pf("msitest\\zeta", TRUE
), "File installed\n");
4199 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4200 ok(!delete_pf("msitest\\eta", TRUE
), "File installed\n");
4201 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4202 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4203 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4204 ok(!delete_pf("msitest", FALSE
), "Directory created\n");
4207 DeleteFileA(msifile
);
4208 DeleteFileA("msitest\\alpha");
4209 DeleteFileA("msitest\\beta");
4210 DeleteFileA("msitest\\gamma");
4211 DeleteFileA("msitest\\theta");
4212 DeleteFileA("msitest\\delta");
4213 DeleteFileA("msitest\\epsilon");
4214 DeleteFileA("msitest\\zeta");
4215 DeleteFileA("msitest\\iota");
4216 DeleteFileA("msitest\\eta");
4217 DeleteFileA("msitest\\kappa");
4218 DeleteFileA("msitest\\lambda");
4219 DeleteFileA("msitest\\mu");
4220 RemoveDirectoryA("msitest");
4223 static const struct sourcepathmap
4225 BOOL sost
; /* shortone\shorttwo */
4226 BOOL solt
; /* shortone\longtwo */
4227 BOOL lost
; /* longone\shorttwo */
4228 BOOL lolt
; /* longone\longtwo */
4229 BOOL soste
; /* shortone\shorttwo source exists */
4230 BOOL solte
; /* shortone\longtwo source exists */
4231 BOOL loste
; /* longone\shorttwo source exists */
4232 BOOL lolte
; /* longone\longtwo source exists */
4237 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4238 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4239 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4240 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4241 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4242 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4243 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4244 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4245 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4246 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4247 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4248 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4249 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4250 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4251 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4252 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4253 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4254 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4255 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4256 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4257 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4258 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4259 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4260 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4261 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4262 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4263 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4264 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4265 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4266 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4267 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4268 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4269 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4270 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4271 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4272 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4273 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4274 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4275 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4276 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4277 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4278 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4279 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4280 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4281 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4282 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4283 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4284 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4285 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4286 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4287 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4288 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4289 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4290 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4291 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4292 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4293 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4294 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4295 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4296 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4297 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4298 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4299 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4300 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4301 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4302 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4303 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4304 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4305 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4306 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4307 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4308 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4309 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4310 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4311 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4312 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4313 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4314 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4315 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4316 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4317 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4318 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4319 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4320 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4321 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4322 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4323 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4324 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4325 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4326 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4327 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4328 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4329 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4330 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4331 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4332 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4333 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4334 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4335 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4336 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4337 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4338 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4339 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4340 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4341 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4342 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4343 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4344 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4345 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4346 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4347 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4348 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4349 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4350 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4351 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4352 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4353 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4354 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4355 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4356 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4357 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4358 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4359 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4360 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4361 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4362 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4363 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4364 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4365 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4366 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4367 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4368 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4369 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4370 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4371 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4372 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4373 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4374 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4375 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4376 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4377 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4378 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4379 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4380 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4381 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4382 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4383 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4384 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4385 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4386 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4387 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4388 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4389 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4390 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4391 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4392 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4393 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4394 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4395 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4396 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4397 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4398 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4399 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4400 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4401 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4402 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4403 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4404 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4405 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4406 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4407 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4408 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4409 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4410 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4411 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4412 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4413 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4414 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4415 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4416 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4417 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4418 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4419 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4420 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4421 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4422 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4423 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4424 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4425 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4426 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4427 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4428 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4429 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4430 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4431 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4432 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4433 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4434 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4435 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4436 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4437 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4438 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4439 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4440 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4441 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4442 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4443 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4444 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4445 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4446 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4447 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4448 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4449 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4450 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4451 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4452 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4453 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4454 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4455 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4456 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4457 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4458 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4459 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4460 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4461 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4462 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4463 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4464 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4465 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4466 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4467 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4468 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4469 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4470 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4471 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4472 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4473 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4474 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4475 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4476 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4477 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4478 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4479 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4480 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4481 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4482 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4483 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4484 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4485 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4486 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4487 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4488 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4489 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4490 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4491 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4492 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4495 static DWORD
get_pf_file_size(LPCSTR file
)
4497 CHAR path
[MAX_PATH
];
4501 lstrcpyA(path
, PROG_FILES_DIR
);
4502 lstrcatA(path
, "\\");
4503 lstrcatA(path
, file
);
4505 hfile
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, 0, NULL
);
4506 if (hfile
== INVALID_HANDLE_VALUE
)
4507 return INVALID_FILE_SIZE
;
4509 size
= GetFileSize(hfile
, NULL
);
4514 static void test_sourcepath(void)
4518 if (!winetest_interactive
)
4520 skip("Run in interactive mode to run source path tests.\n");
4524 create_database(msifile
, sp_tables
, sizeof(sp_tables
) / sizeof(msi_table
));
4526 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4528 for (i
= 0; i
< sizeof(spmap
) / sizeof(spmap
[0]); i
++)
4532 CreateDirectoryA("shortone", NULL
);
4533 CreateDirectoryA("shortone\\shorttwo", NULL
);
4538 CreateDirectoryA("shortone", NULL
);
4539 CreateDirectoryA("shortone\\longtwo", NULL
);
4544 CreateDirectoryA("longone", NULL
);
4545 CreateDirectoryA("longone\\shorttwo", NULL
);
4550 CreateDirectoryA("longone", NULL
);
4551 CreateDirectoryA("longone\\longtwo", NULL
);
4555 create_file("shortone\\shorttwo\\augustus", 50);
4557 create_file("shortone\\longtwo\\augustus", 100);
4559 create_file("longone\\shorttwo\\augustus", 150);
4561 create_file("longone\\longtwo\\augustus", 200);
4563 r
= MsiInstallProductA(msifile
, NULL
);
4564 ok(r
== spmap
[i
].err
, "%d: Expected %d, got %d\n", i
, spmap
[i
].err
, r
);
4565 ok(get_pf_file_size("msitest\\augustus") == spmap
[i
].size
,
4566 "%d: Expected %d, got %d\n", i
, spmap
[i
].size
,
4567 get_pf_file_size("msitest\\augustus"));
4569 if (r
== ERROR_SUCCESS
)
4571 ok(delete_pf("msitest\\augustus", TRUE
), "%d: File not installed\n", i
);
4572 ok(delete_pf("msitest", FALSE
), "%d: Directory not created\n", i
);
4576 ok(!delete_pf("msitest\\augustus", TRUE
), "%d: File installed\n", i
);
4577 todo_wine
ok(!delete_pf("msitest", FALSE
), "%d: Directory installed\n", i
);
4580 DeleteFileA("shortone\\shorttwo\\augustus");
4581 DeleteFileA("shortone\\longtwo\\augustus");
4582 DeleteFileA("longone\\shorttwo\\augustus");
4583 DeleteFileA("longone\\longtwo\\augustus");
4584 RemoveDirectoryA("shortone\\shorttwo");
4585 RemoveDirectoryA("shortone\\longtwo");
4586 RemoveDirectoryA("longone\\shorttwo");
4587 RemoveDirectoryA("longone\\longtwo");
4588 RemoveDirectoryA("shortone");
4589 RemoveDirectoryA("longone");
4592 DeleteFileA(msifile
);
4595 static void test_missingcomponent(void)
4599 if (is_process_limited())
4601 skip("process is limited\n");
4605 CreateDirectoryA("msitest", NULL
);
4606 create_file("msitest\\hydrogen", 500);
4607 create_file("msitest\\helium", 500);
4608 create_file("msitest\\lithium", 500);
4609 create_file("beryllium", 500);
4611 create_database(msifile
, mcp_tables
, sizeof(mcp_tables
) / sizeof(msi_table
));
4613 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4615 r
= MsiInstallProductA(msifile
, "INSTALLLEVEL=10 PROPVAR=42");
4616 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
4618 skip("Not enough rights to perform tests\n");
4621 else if (r
== ERROR_INSTALL_FAILURE
)
4623 win_skip("broken result\n");
4626 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4627 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4628 ok(pf_exists("msitest\\helium"), "File not installed\n");
4629 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4630 ok(!pf_exists("msitest\\beryllium"), "File installed\n");
4631 ok(pf_exists("msitest"), "File not installed\n");
4633 r
= MsiInstallProductA(msifile
, "REMOVE=ALL INSTALLLEVEL=10 PROPVAR=42");
4634 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4635 ok(!delete_pf("msitest\\hydrogen", TRUE
), "File not removed\n");
4636 ok(!delete_pf("msitest\\helium", TRUE
), "File not removed\n");
4637 ok(!delete_pf("msitest\\lithium", TRUE
), "File not removed\n");
4638 ok(!pf_exists("msitest\\beryllium"), "File installed\n");
4639 ok(!delete_pf("msitest", FALSE
), "Directory not removed\n");
4642 DeleteFileA(msifile
);
4643 DeleteFileA("msitest\\hydrogen");
4644 DeleteFileA("msitest\\helium");
4645 DeleteFileA("msitest\\lithium");
4646 DeleteFileA("beryllium");
4647 RemoveDirectoryA("msitest");
4650 static void test_sourcedirprop(void)
4653 CHAR props
[MAX_PATH
];
4655 if (is_process_limited())
4657 skip("process is limited\n");
4661 CreateDirectoryA("msitest", NULL
);
4662 create_file("msitest\\augustus", 500);
4664 create_database(msifile
, ca51_tables
, sizeof(ca51_tables
) / sizeof(msi_table
));
4666 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4668 r
= MsiInstallProductA(msifile
, NULL
);
4669 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
4671 skip("Not enough rights to perform tests\n");
4674 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4675 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4676 ok(delete_pf("msitest", FALSE
), "Directory created\n");
4678 DeleteFileA("msitest\\augustus");
4679 RemoveDirectoryA("msitest");
4681 CreateDirectoryA("altsource", NULL
);
4682 CreateDirectoryA("altsource\\msitest", NULL
);
4683 create_file("altsource\\msitest\\augustus", 500);
4685 sprintf(props
, "SRCDIR=%s\\altsource\\", CURR_DIR
);
4687 r
= MsiInstallProductA(msifile
, props
);
4688 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4689 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4690 ok(delete_pf("msitest", FALSE
), "Directory created\n");
4692 DeleteFileA("altsource\\msitest\\augustus");
4693 RemoveDirectoryA("altsource\\msitest");
4694 RemoveDirectoryA("altsource");
4697 DeleteFileA("msitest\\augustus");
4698 RemoveDirectoryA("msitest");
4699 DeleteFileA(msifile
);
4702 static void test_adminimage(void)
4706 if (is_process_limited())
4708 skip("process is limited\n");
4712 CreateDirectoryA("msitest", NULL
);
4713 CreateDirectoryA("msitest\\first", NULL
);
4714 CreateDirectoryA("msitest\\second", NULL
);
4715 CreateDirectoryA("msitest\\cabout", NULL
);
4716 CreateDirectoryA("msitest\\cabout\\new", NULL
);
4717 create_file("msitest\\one.txt", 100);
4718 create_file("msitest\\first\\two.txt", 100);
4719 create_file("msitest\\second\\three.txt", 100);
4720 create_file("msitest\\cabout\\four.txt", 100);
4721 create_file("msitest\\cabout\\new\\five.txt", 100);
4722 create_file("msitest\\filename", 100);
4723 create_file("msitest\\service.exe", 100);
4725 create_database_wordcount(msifile
, ai_tables
,
4726 sizeof(ai_tables
) / sizeof(msi_table
),
4727 100, msidbSumInfoSourceTypeAdminImage
, ";1033",
4728 "{004757CA-5092-49C2-AD20-28E1CE0DF5F2}");
4730 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4732 r
= MsiInstallProductA(msifile
, NULL
);
4733 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
4735 skip("Not enough rights to perform tests\n");
4738 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4740 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
4741 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
4742 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
4743 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
4744 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
4745 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
4746 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
4747 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
4748 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
4749 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
4750 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
4751 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4754 DeleteFileA("msifile");
4755 DeleteFileA("msitest\\cabout\\new\\five.txt");
4756 DeleteFileA("msitest\\cabout\\four.txt");
4757 DeleteFileA("msitest\\second\\three.txt");
4758 DeleteFileA("msitest\\first\\two.txt");
4759 DeleteFileA("msitest\\one.txt");
4760 DeleteFileA("msitest\\service.exe");
4761 DeleteFileA("msitest\\filename");
4762 RemoveDirectoryA("msitest\\cabout\\new");
4763 RemoveDirectoryA("msitest\\cabout");
4764 RemoveDirectoryA("msitest\\second");
4765 RemoveDirectoryA("msitest\\first");
4766 RemoveDirectoryA("msitest");
4769 static void test_propcase(void)
4773 if (is_process_limited())
4775 skip("process is limited\n");
4779 CreateDirectoryA("msitest", NULL
);
4780 create_file("msitest\\augustus", 500);
4782 create_database(msifile
, pc_tables
, sizeof(pc_tables
) / sizeof(msi_table
));
4784 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4786 r
= MsiInstallProductA(msifile
, "MyProp=42");
4787 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
4789 skip("Not enough rights to perform tests\n");
4792 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4793 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
4794 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4796 r
= MsiInstallProductA(msifile
, "Prop1=\"Copyright \"\"My Company\"\" 2015\" MyProp=42");
4797 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4798 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
4799 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4801 r
= MsiInstallProductA(msifile
, "Prop1=\"\"\"install.exe\"\" /Install\" MyProp=\"42\"");
4802 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4803 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
4804 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4807 DeleteFileA(msifile
);
4808 DeleteFileA("msitest\\augustus");
4809 RemoveDirectoryA("msitest");
4812 static void test_int_widths( void )
4814 static const WCHAR msitestW
[] = {'m','s','i','t','e','s','t','.','m','s','i',0};
4815 static const WCHAR msitableW
[] = {'m','s','i','t','a','b','l','e','.','i','d','t',0};
4816 static const WCHAR slashW
[] = {'\\',0};
4817 static const char int0
[] = "int0\ni0\nint0\tint0\n1";
4818 static const char int1
[] = "int1\ni1\nint1\tint1\n1";
4819 static const char int2
[] = "int2\ni2\nint2\tint2\n1";
4820 static const char int3
[] = "int3\ni3\nint3\tint3\n1";
4821 static const char int4
[] = "int4\ni4\nint4\tint4\n1";
4822 static const char int5
[] = "int5\ni5\nint5\tint5\n1";
4823 static const char int8
[] = "int8\ni8\nint8\tint8\n1";
4832 { int0
, sizeof(int0
) - 1, ERROR_SUCCESS
},
4833 { int1
, sizeof(int1
) - 1, ERROR_SUCCESS
},
4834 { int2
, sizeof(int2
) - 1, ERROR_SUCCESS
},
4835 { int3
, sizeof(int3
) - 1, ERROR_FUNCTION_FAILED
},
4836 { int4
, sizeof(int4
) - 1, ERROR_SUCCESS
},
4837 { int5
, sizeof(int5
) - 1, ERROR_FUNCTION_FAILED
},
4838 { int8
, sizeof(int8
) - 1, ERROR_FUNCTION_FAILED
}
4840 WCHAR tmpdir
[MAX_PATH
], msitable
[MAX_PATH
], msidb
[MAX_PATH
];
4844 GetTempPathW(MAX_PATH
, tmpdir
);
4845 CreateDirectoryW(tmpdir
, NULL
);
4847 lstrcpyW(msitable
, tmpdir
);
4848 lstrcatW(msitable
, slashW
);
4849 lstrcatW(msitable
, msitableW
);
4851 lstrcpyW(msidb
, tmpdir
);
4852 lstrcatW(msidb
, slashW
);
4853 lstrcatW(msidb
, msitestW
);
4855 r
= MsiOpenDatabaseW(msidb
, MSIDBOPEN_CREATE
, &db
);
4856 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4858 for (i
= 0; i
< sizeof(tests
)/sizeof(tests
[0]); i
++)
4861 HANDLE handle
= CreateFileW(msitable
, GENERIC_WRITE
, 0, NULL
,
4862 CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
4863 WriteFile(handle
, tests
[i
].data
, tests
[i
].size
, &count
, NULL
);
4864 CloseHandle(handle
);
4866 r
= MsiDatabaseImportW(db
, tmpdir
, msitableW
);
4867 ok(r
== tests
[i
].ret
, " %u expected %u, got %u\n", i
, tests
[i
].ret
, r
);
4869 r
= MsiDatabaseCommit(db
);
4870 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4871 DeleteFileW(msitable
);
4876 RemoveDirectoryW(tmpdir
);
4879 static void test_shortcut(void)
4884 if (is_process_limited())
4886 skip("process is limited\n");
4890 create_test_files();
4891 create_database(msifile
, sc_tables
, sizeof(sc_tables
) / sizeof(msi_table
));
4893 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4895 r
= MsiInstallProductA(msifile
, NULL
);
4896 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
4898 skip("Not enough rights to perform tests\n");
4901 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4903 hr
= CoInitializeEx(NULL
, COINIT_MULTITHREADED
);
4904 ok(SUCCEEDED(hr
), "CoInitialize failed 0x%08x\n", hr
);
4906 r
= MsiInstallProductA(msifile
, NULL
);
4907 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4911 hr
= CoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
4912 ok(SUCCEEDED(hr
), "CoInitialize failed 0x%08x\n", hr
);
4914 r
= MsiInstallProductA(msifile
, NULL
);
4915 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4919 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
4920 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
4921 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
4922 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
4923 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
4924 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
4925 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
4926 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
4927 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
4928 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
4929 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
4930 while (!delete_pf("msitest\\Shortcut.lnk", TRUE
) && GetLastError() == ERROR_SHARING_VIOLATION
) Sleep(1000);
4931 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4934 delete_test_files();
4935 DeleteFileA(msifile
);
4938 static void test_preselected(void)
4942 if (is_process_limited())
4944 skip("process is limited\n");
4948 create_test_files();
4949 create_database(msifile
, ps_tables
, sizeof(ps_tables
) / sizeof(msi_table
));
4951 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4953 r
= MsiInstallProductA(msifile
, "ADDLOCAL=One");
4954 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
4956 skip("Not enough rights to perform tests\n");
4959 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4961 ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File installed\n");
4962 ok(!delete_pf("msitest\\cabout\\new", FALSE
), "Directory created\n");
4963 ok(!delete_pf("msitest\\cabout\\four.txt", TRUE
), "File installed\n");
4964 ok(!delete_pf("msitest\\cabout", FALSE
), "Directory created\n");
4965 ok(!delete_pf("msitest\\changed\\three.txt", TRUE
), "File installed\n");
4966 ok(!delete_pf("msitest\\changed", FALSE
), "Directory created\n");
4967 ok(!delete_pf("msitest\\first\\two.txt", TRUE
), "File installed\n");
4968 ok(!delete_pf("msitest\\first", FALSE
), "Directory created\n");
4969 ok(!delete_pf("msitest\\filename", TRUE
), "File installed\n");
4970 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
4971 ok(!delete_pf("msitest\\service.exe", TRUE
), "File installed\n");
4972 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4974 r
= MsiInstallProductA(msifile
, NULL
);
4975 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4977 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
4978 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
4979 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
4980 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
4981 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
4982 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
4983 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
4984 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
4985 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
4986 ok(!delete_pf("msitest\\one.txt", TRUE
), "File installed\n");
4987 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
4988 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
4991 delete_test_files();
4992 DeleteFileA(msifile
);
4995 static void test_installed_prop(void)
4997 static const char prodcode
[] = "{7df88a48-996f-4ec8-a022-bf956f9b2cbb}";
5000 if (is_process_limited())
5002 skip("process is limited\n");
5006 create_test_files();
5007 create_database(msifile
, ip_tables
, sizeof(ip_tables
) / sizeof(msi_table
));
5009 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5011 r
= MsiInstallProductA(msifile
, "FULL=1");
5012 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
5014 skip("Not enough rights to perform tests\n");
5017 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5019 r
= MsiInstallProductA(msifile
, "FULL=1");
5020 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
5022 r
= MsiConfigureProductExA(prodcode
, INSTALLLEVEL_DEFAULT
, INSTALLSTATE_DEFAULT
, "FULL=1");
5023 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
5025 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
5026 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
5027 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
5028 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
5029 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
5030 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
5031 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
5032 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
5033 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
5034 ok(delete_pf("msitest\\one.txt", TRUE
), "File installed\n");
5035 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
5036 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
5038 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5039 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5042 delete_test_files();
5043 DeleteFileA(msifile
);
5046 static void test_allusers_prop(void)
5050 if (is_process_limited())
5052 skip("process is limited\n");
5056 create_test_files();
5057 create_database(msifile
, aup_tables
, sizeof(aup_tables
) / sizeof(msi_table
));
5059 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5061 /* ALLUSERS property unset */
5062 r
= MsiInstallProductA(msifile
, "FULL=1");
5063 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
5065 skip("Not enough rights to perform tests\n");
5068 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5070 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
5071 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
5072 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
5073 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
5074 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
5075 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
5076 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
5077 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
5078 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
5079 ok(delete_pf("msitest\\one.txt", TRUE
), "File installed\n");
5080 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
5081 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
5083 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5084 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5086 delete_test_files();
5088 create_test_files();
5089 create_database(msifile
, aup2_tables
, sizeof(aup2_tables
) / sizeof(msi_table
));
5091 /* ALLUSERS property set to 1 */
5092 r
= MsiInstallProductA(msifile
, "FULL=1");
5093 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5095 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
5096 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
5097 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
5098 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
5099 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
5100 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
5101 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
5102 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
5103 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
5104 ok(delete_pf("msitest\\one.txt", TRUE
), "File installed\n");
5105 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
5106 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
5108 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5109 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5111 delete_test_files();
5113 create_test_files();
5114 create_database(msifile
, aup3_tables
, sizeof(aup3_tables
) / sizeof(msi_table
));
5116 /* ALLUSERS property set to 2 */
5117 r
= MsiInstallProductA(msifile
, "FULL=1");
5118 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5120 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
5121 ok(delete_pf("msitest\\cabout\\new", FALSE
), "Directory not created\n");
5122 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
5123 ok(delete_pf("msitest\\cabout", FALSE
), "Directory not created\n");
5124 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
5125 ok(delete_pf("msitest\\changed", FALSE
), "Directory not created\n");
5126 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
5127 ok(delete_pf("msitest\\first", FALSE
), "Directory not created\n");
5128 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
5129 ok(delete_pf("msitest\\one.txt", TRUE
), "File installed\n");
5130 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
5131 ok(delete_pf("msitest", FALSE
), "Directory not created\n");
5133 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5134 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5136 delete_test_files();
5138 create_test_files();
5139 create_database(msifile
, aup4_tables
, sizeof(aup4_tables
) / sizeof(msi_table
));
5141 /* ALLUSERS property set to 2, conditioned on ALLUSERS = 1 */
5142 r
= MsiInstallProductA(msifile
, "FULL=1");
5143 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
5146 delete_test_files();
5147 DeleteFileA(msifile
);
5150 static const char session_manager
[] = "System\\CurrentControlSet\\Control\\Session Manager";
5151 static const char rename_ops
[] = "PendingFileRenameOperations";
5153 static void process_pending_renames(HKEY hkey
)
5155 char *buf
, *src
, *dst
, *buf2
, *buf2ptr
;
5160 ret
= RegQueryValueExA(hkey
, rename_ops
, NULL
, NULL
, NULL
, &size
);
5161 ok(!ret
, "RegQueryValueExA failed %d\n", ret
);
5163 buf
= HeapAlloc(GetProcessHeap(), 0, size
+ 1);
5164 buf2ptr
= buf2
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, size
+ 1);
5166 ret
= RegQueryValueExA(hkey
, rename_ops
, NULL
, NULL
, (LPBYTE
)buf
, &size
);
5168 ok(!ret
, "RegQueryValueExA failed %d\n", ret
);
5171 for (src
= buf
; *src
; src
= dst
+ strlen(dst
) + 1)
5173 DWORD flags
= MOVEFILE_COPY_ALLOWED
;
5176 dst
= src
+ strlen(src
) + 1;
5178 if (!strstr(src
, "msitest"))
5180 lstrcpyA(buf2ptr
, src
);
5181 buf2ptr
+= strlen(src
) + 1;
5182 lstrcpyA(buf2ptr
, dst
);
5183 buf2ptr
+= strlen(dst
) + 1;
5191 flags
|= MOVEFILE_REPLACE_EXISTING
;
5194 if (src
[0] == '\\' && src
[1] == '?' && src
[2] == '?' && src
[3] == '\\') src
+= 4;
5197 if (dst
[0] == '\\' && dst
[1] == '?' && dst
[2] == '?' && dst
[3] == '\\') dst
+= 4;
5198 fileret
= MoveFileExA(src
, dst
, flags
);
5199 ok(fileret
, "Failed to move file %s -> %s (%u)\n", src
, dst
, GetLastError());
5203 fileret
= DeleteFileA(src
);
5204 ok(fileret
|| broken(!fileret
) /* win2k3 */, "Failed to delete file %s (%u)\n", src
, GetLastError());
5208 ok(found
, "Expected a 'msitest' entry\n");
5211 RegSetValueExA(hkey
, rename_ops
, 0, REG_MULTI_SZ
, (LPBYTE
)buf2
, buf2ptr
+ 1 - buf2
);
5213 RegDeleteValueA(hkey
, rename_ops
);
5215 HeapFree(GetProcessHeap(), 0, buf
);
5216 HeapFree(GetProcessHeap(), 0, buf2
);
5219 static BOOL
file_matches_data(LPCSTR file
, LPCSTR data
)
5221 DWORD len
, data_len
= strlen(data
);
5225 handle
= CreateFileA(file
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, 0, NULL
);
5226 ok(handle
!= INVALID_HANDLE_VALUE
, "failed to open %s (%u)\n", file
, GetLastError());
5228 if (ReadFile(handle
, buf
, sizeof(buf
), &len
, NULL
) && len
>= data_len
)
5230 CloseHandle(handle
);
5231 return !memcmp(buf
, data
, data_len
);
5233 CloseHandle(handle
);
5237 static void test_file_in_use(void)
5242 char path
[MAX_PATH
];
5244 if (is_process_limited())
5246 skip("process is limited\n");
5250 RegOpenKeyExA(HKEY_LOCAL_MACHINE
, session_manager
, 0, KEY_ALL_ACCESS
, &hkey
);
5252 CreateDirectoryA("msitest", NULL
);
5253 create_file("msitest\\maximus", 500);
5254 create_database(msifile
, fiu_tables
, sizeof(fiu_tables
) / sizeof(msi_table
));
5256 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5258 lstrcpyA(path
, PROG_FILES_DIR
);
5259 lstrcatA(path
, "\\msitest");
5260 CreateDirectoryA(path
, NULL
);
5262 lstrcatA(path
, "\\maximus");
5263 file
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, CREATE_NEW
, FILE_ATTRIBUTE_NORMAL
, NULL
);
5265 r
= MsiInstallProductA(msifile
, "REBOOT=ReallySuppress FULL=1");
5266 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
5268 skip("Not enough rights to perform tests\n");
5271 ok(r
== ERROR_SUCCESS_REBOOT_REQUIRED
, "Expected ERROR_SUCCESS_REBOOT_REQUIRED got %u\n", r
);
5272 ok(!file_matches_data(path
, "msitest\\maximus"), "Expected file not to match\n");
5274 ok(!file_matches_data(path
, "msitest\\maximus"), "Expected file not to match\n");
5276 process_pending_renames(hkey
);
5279 ok(file_matches_data(path
, "msitest\\maximus"), "Expected file to match\n");
5280 ok(delete_pf("msitest\\maximus", TRUE
), "File not present\n");
5281 ok(delete_pf("msitest", FALSE
), "Directory not present or not empty\n");
5283 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5284 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5289 delete_pf("msitest\\maximus", TRUE
);
5290 delete_pf("msitest", FALSE
);
5291 DeleteFileA("msitest\\maximus");
5292 delete_test_files();
5293 DeleteFileA(msifile
);
5296 static void test_file_in_use_cab(void)
5301 char path
[MAX_PATH
];
5303 if (is_process_limited())
5305 skip("process is limited\n");
5309 RegOpenKeyExA(HKEY_LOCAL_MACHINE
, session_manager
, 0, KEY_ALL_ACCESS
, &hkey
);
5311 CreateDirectoryA("msitest", NULL
);
5312 create_file("maximus", 500);
5313 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
5314 DeleteFileA("maximus");
5316 create_database(msifile
, fiuc_tables
, sizeof(fiuc_tables
) / sizeof(msi_table
));
5318 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5320 lstrcpyA(path
, PROG_FILES_DIR
);
5321 lstrcatA(path
, "\\msitest");
5322 CreateDirectoryA(path
, NULL
);
5324 lstrcatA(path
, "\\maximus");
5325 file
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, CREATE_NEW
, FILE_ATTRIBUTE_NORMAL
, NULL
);
5327 r
= MsiInstallProductA(msifile
, "REBOOT=ReallySuppress FULL=1");
5328 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
5330 skip("Not enough rights to perform tests\n");
5333 ok(r
== ERROR_SUCCESS_REBOOT_REQUIRED
, "Expected ERROR_SUCCESS_REBOOT_REQUIRED got %u\n", r
);
5334 ok(!file_matches_data(path
, "maximus"), "Expected file not to match\n");
5336 ok(!file_matches_data(path
, "maximus"), "Expected file not to match\n");
5338 process_pending_renames(hkey
);
5341 ok(file_matches_data(path
, "maximus"), "Expected file to match\n");
5342 ok(delete_pf("msitest\\maximus", TRUE
), "File not present\n");
5343 ok(delete_pf("msitest", FALSE
), "Directory not present or not empty\n");
5345 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5346 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5351 delete_pf("msitest\\maximus", TRUE
);
5352 delete_pf("msitest", FALSE
);
5353 DeleteFileA("msitest\\maximus");
5355 delete_test_files();
5356 DeleteFileA(msifile
);
5359 static void test_feature_override(void)
5362 REGSAM access
= KEY_ALL_ACCESS
;
5364 if (is_process_limited())
5366 skip("process is limited\n");
5370 create_test_files();
5371 create_file("msitest\\override.txt", 1000);
5372 create_file("msitest\\preselected.txt", 1000);
5373 create_file("msitest\\notpreselected.txt", 1000);
5374 create_database(msifile
, fo_tables
, sizeof(fo_tables
) / sizeof(msi_table
));
5377 access
|= KEY_WOW64_64KEY
;
5379 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5381 r
= MsiInstallProductA(msifile
, "ADDLOCAL=override");
5382 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
5384 skip("Not enough rights to perform tests\n");
5387 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5389 ok(pf_exists("msitest\\override.txt"), "file not installed\n");
5390 ok(!pf_exists("msitest\\preselected.txt"), "file installed\n");
5391 ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n");
5393 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5394 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5396 ok(!delete_pf("msitest\\override.txt", TRUE
), "file not removed\n");
5398 r
= MsiInstallProductA(msifile
, "preselect=1");
5399 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5401 ok(pf_exists("msitest\\override.txt"), "file not installed\n");
5402 ok(pf_exists("msitest\\preselected.txt"), "file not installed\n");
5403 ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n");
5405 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5406 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5408 ok(!delete_pf("msitest\\override.txt", TRUE
), "file not removed\n");
5410 ok(delete_pf("msitest\\preselected.txt", TRUE
), "file removed\n");
5411 ok(delete_pf("msitest", FALSE
), "directory removed\n");
5414 r
= MsiInstallProductA(msifile
, NULL
);
5415 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5417 ok(pf_exists("msitest\\override.txt"), "file not installed\n");
5418 ok(pf_exists("msitest\\preselected.txt"), "file not installed\n");
5419 ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n");
5421 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5422 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5424 ok(!delete_pf("msitest\\override.txt", TRUE
), "file not removed\n");
5426 ok(delete_pf("msitest\\preselected.txt", TRUE
), "file removed\n");
5427 ok(delete_pf("msitest", FALSE
), "directory removed\n");
5430 delete_key(HKEY_LOCAL_MACHINE
, "Software\\Wine\\msitest", access
);
5433 DeleteFileA("msitest\\override.txt");
5434 DeleteFileA("msitest\\preselected.txt");
5435 DeleteFileA("msitest\\notpreselected.txt");
5436 delete_test_files();
5437 DeleteFileA(msifile
);
5440 static void test_icon_table(void)
5442 MSIHANDLE hdb
= 0, record
;
5445 CHAR path
[MAX_PATH
];
5446 static const char prodcode
[] = "{7DF88A49-996F-4EC8-A022-BF956F9B2CBB}";
5448 if (is_process_limited())
5450 skip("process is limited\n");
5454 create_database(msifile
, icon_base_tables
, sizeof(icon_base_tables
) / sizeof(msi_table
));
5456 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5458 res
= MsiOpenDatabaseW(msifileW
, MSIDBOPEN_TRANSACT
, &hdb
);
5459 ok(res
== ERROR_SUCCESS
, "failed to open db: %d\n", res
);
5461 query
= "CREATE TABLE `Icon` (`Name` CHAR(72) NOT NULL, `Data` OBJECT NOT NULL PRIMARY KEY `Name`)";
5462 res
= run_query( hdb
, 0, query
);
5463 ok(res
== ERROR_SUCCESS
, "Can't create Icon table: %d\n", res
);
5465 create_file("icon.ico", 100);
5466 record
= MsiCreateRecord(1);
5467 res
= MsiRecordSetStreamA(record
, 1, "icon.ico");
5468 ok(res
== ERROR_SUCCESS
, "Failed to add stream data to record: %d\n", res
);
5470 query
= "INSERT INTO `Icon` (`Name`, `Data`) VALUES ('testicon', ?)";
5471 res
= run_query(hdb
, record
, query
);
5472 ok(res
== ERROR_SUCCESS
, "Insert into Icon table failed: %d\n", res
);
5474 res
= MsiCloseHandle(record
);
5475 ok(res
== ERROR_SUCCESS
, "Failed to close record handle: %d\n", res
);
5476 DeleteFileA("icon.ico");
5477 res
= MsiDatabaseCommit(hdb
);
5478 ok(res
== ERROR_SUCCESS
, "Failed to commit database: %d\n", res
);
5479 res
= MsiCloseHandle(hdb
);
5480 ok(res
== ERROR_SUCCESS
, "Failed to close database: %d\n", res
);
5483 res
= MsiInstallProductA(msifile
, "PUBLISH_PRODUCT=1");
5484 if (res
== ERROR_INSTALL_PACKAGE_REJECTED
)
5486 skip("Not enough rights to perform tests\n");
5487 DeleteFileA(msifile
);
5490 ok(res
== ERROR_SUCCESS
, "Failed to do per-user install: %d\n", res
);
5492 lstrcpyA(path
, APP_DATA_DIR
);
5493 lstrcatA(path
, "\\");
5494 lstrcatA(path
, "Microsoft\\Installer\\");
5495 lstrcatA(path
, prodcode
);
5496 lstrcatA(path
, "\\testicon");
5497 ok(file_exists(path
), "Per-user icon file isn't where it's expected (%s)\n", path
);
5499 res
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5500 ok(res
== ERROR_SUCCESS
, "Failed to uninstall per-user\n");
5501 ok(!file_exists(path
), "Per-user icon file not removed (%s)\n", path
);
5504 res
= MsiInstallProductA(msifile
, "PUBLISH_PRODUCT=1 ALLUSERS=1");
5505 ok(res
== ERROR_SUCCESS
, "Failed to system-wide install: %d\n", res
);
5507 lstrcpyA(path
, WINDOWS_DIR
);
5508 lstrcatA(path
, "\\");
5509 lstrcatA(path
, "Installer\\");
5510 lstrcatA(path
, prodcode
);
5511 lstrcatA(path
, "\\testicon");
5512 ok(file_exists(path
), "System-wide icon file isn't where it's expected (%s)\n", path
);
5514 res
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5515 ok(res
== ERROR_SUCCESS
, "Failed to uninstall system-wide\n");
5516 ok(!file_exists(path
), "System-wide icon file not removed (%s)\n", path
);
5518 delete_pfmsitest_files();
5519 DeleteFileA(msifile
);
5522 static void test_package_validation(void)
5526 if (is_process_limited())
5528 skip("process is limited\n");
5532 CreateDirectoryA("msitest", NULL
);
5533 create_file("msitest\\maximus", 500);
5534 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "Intel;1033");
5536 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5538 r
= MsiInstallProductA(msifile
, NULL
);
5539 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
5541 skip("Not enough rights to perform tests\n");
5544 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5545 ok(delete_pf("msitest\\maximus", TRUE
), "file does not exist\n");
5546 ok(delete_pf("msitest", FALSE
), "directory does not exist\n");
5548 DeleteFileA(msifile
);
5549 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 200, "Intel,9999;9999");
5551 r
= MsiInstallProductA(msifile
, NULL
);
5552 ok(r
== ERROR_INSTALL_LANGUAGE_UNSUPPORTED
, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r
);
5554 DeleteFileA(msifile
);
5555 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 200, "Intel,1033;9999");
5557 r
= MsiInstallProductA(msifile
, NULL
);
5558 ok(r
== ERROR_INSTALL_LANGUAGE_UNSUPPORTED
, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r
);
5560 DeleteFileA(msifile
);
5561 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 200, "Intel,9999;1033");
5563 r
= MsiInstallProductA(msifile
, NULL
);
5564 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5565 ok(delete_pf("msitest\\maximus", TRUE
), "file does not exist\n");
5566 ok(delete_pf("msitest", FALSE
), "directory does not exist\n");
5568 DeleteFileA(msifile
);
5569 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 200, "Intel64,9999;1033");
5571 r
= MsiInstallProductA(msifile
, NULL
);
5572 ok(r
== ERROR_INSTALL_PLATFORM_UNSUPPORTED
, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r
);
5574 DeleteFileA(msifile
);
5575 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 200, "Intel32,1033;1033");
5577 r
= MsiInstallProductA(msifile
, NULL
);
5578 ok(r
== ERROR_INSTALL_PLATFORM_UNSUPPORTED
, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r
);
5580 DeleteFileA(msifile
);
5581 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 200, "Intel32,9999;1033");
5583 r
= MsiInstallProductA(msifile
, NULL
);
5584 ok(r
== ERROR_INSTALL_PLATFORM_UNSUPPORTED
, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r
);
5586 DeleteFileA(msifile
);
5587 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "Intel;9999");
5589 r
= MsiInstallProductA(msifile
, NULL
);
5590 ok(r
== ERROR_INSTALL_LANGUAGE_UNSUPPORTED
, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r
);
5591 ok(!delete_pf("msitest\\maximus", TRUE
), "file exists\n");
5592 ok(!delete_pf("msitest", FALSE
), "directory exists\n");
5594 if (GetSystemDefaultLangID() == MAKELANGID( LANG_ENGLISH
, SUBLANG_ENGLISH_US
))
5596 DeleteFileA(msifile
);
5597 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "Intel;9");
5598 r
= MsiInstallProductA(msifile
, NULL
);
5599 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5600 ok(delete_pf("msitest\\maximus", TRUE
), "file does not exist\n");
5601 ok(delete_pf("msitest", FALSE
), "directory does not exist\n");
5603 DeleteFileA(msifile
);
5604 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "Intel;1024");
5605 r
= MsiInstallProductA(msifile
, NULL
);
5606 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5607 ok(delete_pf("msitest\\maximus", TRUE
), "file does not exist\n");
5608 ok(delete_pf("msitest", FALSE
), "directory does not exist\n");
5611 DeleteFileA(msifile
);
5612 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "Intel32;0");
5614 r
= MsiInstallProductA(msifile
, NULL
);
5615 ok(r
== ERROR_INSTALL_PLATFORM_UNSUPPORTED
, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r
);
5616 ok(!delete_pf("msitest\\maximus", TRUE
), "file exists\n");
5617 ok(!delete_pf("msitest", FALSE
), "directory exists\n");
5619 if (is_64bit
&& !is_wow64
)
5621 DeleteFileA(msifile
);
5622 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "Intel;0");
5624 r
= MsiInstallProductA(msifile
, NULL
);
5625 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5626 ok(delete_pf("msitest\\maximus", TRUE
), "file does not exist\n");
5627 ok(delete_pf("msitest", FALSE
), "directory does not exist\n");
5629 DeleteFileA(msifile
);
5630 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "x64;0");
5632 r
= MsiInstallProductA(msifile
, NULL
);
5633 ok(r
== ERROR_INSTALL_PACKAGE_INVALID
, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r
);
5634 ok(!delete_pf("msitest\\maximus", TRUE
), "file exists\n");
5635 ok(!delete_pf("msitest", FALSE
), "directory exists\n");
5637 DeleteFileA(msifile
);
5638 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 200, "x64;0");
5640 r
= MsiInstallProductA(msifile
, NULL
);
5641 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5642 ok(delete_pf("msitest\\maximus", TRUE
), "file does not exist\n");
5643 ok(delete_pf("msitest", FALSE
), "directory does not exist\n");
5647 DeleteFileA(msifile
);
5648 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "Intel;0");
5650 r
= MsiInstallProductA(msifile
, NULL
);
5651 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5652 ok(delete_pf("msitest\\maximus", TRUE
), "file does not exist\n");
5653 ok(delete_pf("msitest", FALSE
), "directory does not exist\n");
5655 DeleteFileA(msifile
);
5656 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "x64;0");
5658 r
= MsiInstallProductA(msifile
, NULL
);
5659 ok(r
== ERROR_INSTALL_PACKAGE_INVALID
, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r
);
5660 ok(!delete_pf_native("msitest\\maximus", TRUE
), "file exists\n");
5661 ok(!delete_pf_native("msitest", FALSE
), "directory exists\n");
5663 DeleteFileA(msifile
);
5664 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 200, "x64;0");
5666 r
= MsiInstallProductA(msifile
, NULL
);
5667 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5668 ok(delete_pf_native("msitest\\maximus", TRUE
), "file exists\n");
5669 ok(delete_pf_native("msitest", FALSE
), "directory exists\n");
5673 DeleteFileA(msifile
);
5674 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "Intel;0");
5676 r
= MsiInstallProductA(msifile
, NULL
);
5677 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5678 ok(delete_pf("msitest\\maximus", TRUE
), "file does not exist\n");
5679 ok(delete_pf("msitest", FALSE
), "directory does not exist\n");
5681 DeleteFileA(msifile
);
5682 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "Alpha,Beta,Intel;0");
5684 r
= MsiInstallProductA(msifile
, NULL
);
5685 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5686 ok(delete_pf("msitest\\maximus", TRUE
), "file does not exist\n");
5687 ok(delete_pf("msitest", FALSE
), "directory does not exist\n");
5689 DeleteFileA(msifile
);
5690 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 100, "x64;0");
5692 r
= MsiInstallProductA(msifile
, NULL
);
5693 ok(r
== ERROR_INSTALL_PLATFORM_UNSUPPORTED
, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r
);
5694 ok(!delete_pf("msitest\\maximus", TRUE
), "file exists\n");
5695 ok(!delete_pf("msitest", FALSE
), "directory exists\n");
5697 DeleteFileA(msifile
);
5698 create_database_template(msifile
, pv_tables
, sizeof(pv_tables
)/sizeof(msi_table
), 200, "x64;0");
5700 r
= MsiInstallProductA(msifile
, NULL
);
5701 ok(r
== ERROR_INSTALL_PLATFORM_UNSUPPORTED
, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r
);
5702 ok(!delete_pf("msitest\\maximus", TRUE
), "file exists\n");
5703 ok(!delete_pf("msitest", FALSE
), "directory exists\n");
5707 /* Delete the files in the temp (current) folder */
5708 DeleteFileA(msifile
);
5709 DeleteFileA("msitest\\maximus");
5710 RemoveDirectoryA("msitest");
5713 static void test_upgrade_code(void)
5717 if (is_process_limited())
5719 skip("process is limited\n");
5723 CreateDirectoryA("msitest", NULL
);
5724 create_file("msitest\\upgradecode.txt", 1000);
5725 create_database(msifile
, uc_tables
, sizeof(uc_tables
) / sizeof(msi_table
));
5727 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5729 r
= MsiInstallProductA(msifile
, NULL
);
5730 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5732 ok(pf_exists("msitest\\upgradecode.txt"), "file not installed\n");
5734 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5735 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5737 ok(!delete_pf("msitest\\upgradecode.txt", TRUE
), "file not removed\n");
5738 ok(!delete_pf("msitest", FALSE
), "directory not removed\n");
5740 DeleteFileA("msitest\\upgradecode.txt");
5741 RemoveDirectoryA("msitest");
5742 DeleteFileA(msifile
);
5745 static void test_mixed_package(void)
5750 char value
[MAX_PATH
];
5753 if (is_process_limited())
5755 skip("process is limited\n");
5758 if (!is_wow64
&& !is_64bit
)
5760 skip("this test must be run on 64-bit\n");
5763 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5764 create_database_template(msifile
, mixed_tables
, sizeof(mixed_tables
)/sizeof(msi_table
), 200, "x64;1033");
5766 r
= MsiInstallProductA(msifile
, NULL
);
5767 if (r
== ERROR_INSTALL_PACKAGE_REJECTED
)
5769 skip("Not enough rights to perform tests\n");
5772 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5774 res
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS
|KEY_WOW64_32KEY
, &hkey
);
5775 ok(!res
, "can't open 32-bit component key, got %d\n", res
);
5776 res
= RegQueryValueExA(hkey
, "test1", NULL
, NULL
, NULL
, NULL
);
5777 ok(!res
, "expected RegQueryValueEx to succeed, got %d\n", res
);
5778 res
= RegQueryValueExA(hkey
, "test2", NULL
, NULL
, NULL
, NULL
);
5779 ok(res
, "expected RegQueryValueEx to fail, got %d\n", res
);
5782 res
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS
|KEY_WOW64_64KEY
, &hkey
);
5783 ok(!res
, "can't open 64-bit component key, got %d\n", res
);
5784 res
= RegQueryValueExA(hkey
, "test1", NULL
, NULL
, NULL
, NULL
);
5785 ok(res
, "expected RegQueryValueEx to fail, got %d\n", res
);
5786 res
= RegQueryValueExA(hkey
, "test2", NULL
, NULL
, NULL
, NULL
);
5787 ok(!res
, "expected RegQueryValueEx to succeed, got %d\n", res
);
5790 res
= RegOpenKeyExA(HKEY_CLASSES_ROOT
,
5791 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32",
5792 0, KEY_ALL_ACCESS
|KEY_WOW64_32KEY
, &hkey
);
5793 ok(res
== ERROR_SUCCESS
, "can't open 32-bit CLSID key, got %d\n", res
);
5794 if (res
== ERROR_SUCCESS
) {
5795 size
= sizeof(value
);
5796 res
= RegQueryValueExA(hkey
, "", NULL
, NULL
, (LPBYTE
)value
, &size
);
5797 ok(!strcmp(value
, "winetest32.dll"), "got %s\n", value
);
5801 res
= RegOpenKeyExA(HKEY_CLASSES_ROOT
,
5802 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32",
5803 0, KEY_ALL_ACCESS
|KEY_WOW64_64KEY
, &hkey
);
5804 ok(res
== ERROR_SUCCESS
, "can't open 64-bit CLSID key, got %d\n", res
);
5805 if (res
== ERROR_SUCCESS
) {
5806 size
= sizeof(value
);
5807 res
= RegQueryValueExA(hkey
, "", NULL
, NULL
, (LPBYTE
)value
, &size
);
5808 ok(!strcmp(value
, "winetest64.dll"), "got %s\n", value
);
5812 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5813 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5815 res
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS
|KEY_WOW64_32KEY
, &hkey
);
5816 ok(res
== ERROR_FILE_NOT_FOUND
|| broken(!res
), "32-bit component key not removed\n");
5818 res
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS
|KEY_WOW64_64KEY
, &hkey
);
5819 ok(res
== ERROR_FILE_NOT_FOUND
, "64-bit component key not removed\n");
5821 res
= RegOpenKeyExA(HKEY_CLASSES_ROOT
,
5822 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}",
5823 0, KEY_ALL_ACCESS
|KEY_WOW64_32KEY
, &hkey
);
5824 ok(res
== ERROR_FILE_NOT_FOUND
, "32-bit CLSID key not removed\n");
5826 res
= RegOpenKeyExA(HKEY_CLASSES_ROOT
,
5827 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}",
5828 0, KEY_ALL_ACCESS
|KEY_WOW64_64KEY
, &hkey
);
5829 ok(res
== ERROR_FILE_NOT_FOUND
, "64-bit CLSID key not removed\n");
5831 DeleteFileA( msifile
);
5832 create_database_template(msifile
, mixed_tables
, sizeof(mixed_tables
)/sizeof(msi_table
), 200, "Intel;1033");
5834 r
= MsiInstallProductA(msifile
, NULL
);
5835 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5837 res
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS
|KEY_WOW64_32KEY
, &hkey
);
5838 ok(!res
, "can't open 32-bit component key, got %d\n", res
);
5839 res
= RegQueryValueExA(hkey
, "test1", NULL
, NULL
, NULL
, NULL
);
5840 ok(!res
, "expected RegQueryValueEx to succeed, got %d\n", res
);
5841 res
= RegQueryValueExA(hkey
, "test2", NULL
, NULL
, NULL
, NULL
);
5842 ok(res
, "expected RegQueryValueEx to fail, got %d\n", res
);
5845 res
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS
|KEY_WOW64_64KEY
, &hkey
);
5846 ok(!res
, "can't open 64-bit component key, got %d\n", res
);
5847 res
= RegQueryValueExA(hkey
, "test1", NULL
, NULL
, NULL
, NULL
);
5848 ok(res
, "expected RegQueryValueEx to fail, got %d\n", res
);
5849 res
= RegQueryValueExA(hkey
, "test2", NULL
, NULL
, NULL
, NULL
);
5850 ok(!res
, "expected RegQueryValueEx to succeed, got %d\n", res
);
5853 res
= RegOpenKeyExA(HKEY_CLASSES_ROOT
,
5854 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32",
5855 0, KEY_ALL_ACCESS
|KEY_WOW64_32KEY
, &hkey
);
5856 ok(res
== ERROR_SUCCESS
, "can't open 32-bit CLSID key, got %d\n", res
);
5857 if (res
== ERROR_SUCCESS
) {
5858 size
= sizeof(value
);
5859 res
= RegQueryValueExA(hkey
, "", NULL
, NULL
, (LPBYTE
)value
, &size
);
5860 ok(!strcmp(value
, "winetest32.dll"), "got %s\n", value
);
5864 res
= RegOpenKeyExA(HKEY_CLASSES_ROOT
,
5865 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32",
5866 0, KEY_ALL_ACCESS
|KEY_WOW64_64KEY
, &hkey
);
5867 ok(res
== ERROR_SUCCESS
, "can't open 64-bit CLSID key, got %d\n", res
);
5868 if (res
== ERROR_SUCCESS
) {
5869 size
= sizeof(value
);
5870 res
= RegQueryValueExA(hkey
, "", NULL
, NULL
, (LPBYTE
)value
, &size
);
5871 ok(!strcmp(value
, "winetest64.dll"), "got %s\n", value
);
5875 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5876 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5878 res
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS
|KEY_WOW64_32KEY
, &hkey
);
5879 ok(res
== ERROR_FILE_NOT_FOUND
|| broken(!res
), "32-bit component key not removed\n");
5881 res
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS
|KEY_WOW64_64KEY
, &hkey
);
5882 ok(res
== ERROR_FILE_NOT_FOUND
, "64-bit component key not removed\n");
5884 res
= RegOpenKeyExA(HKEY_CLASSES_ROOT
,
5885 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}",
5886 0, KEY_ALL_ACCESS
|KEY_WOW64_32KEY
, &hkey
);
5887 ok(res
== ERROR_FILE_NOT_FOUND
, "32-bit CLSID key not removed\n");
5889 res
= RegOpenKeyExA(HKEY_CLASSES_ROOT
,
5890 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}",
5891 0, KEY_ALL_ACCESS
|KEY_WOW64_64KEY
, &hkey
);
5892 ok(res
== ERROR_FILE_NOT_FOUND
, "64-bit CLSID key not removed\n");
5895 DeleteFileA( msifile
);
5898 static void test_volume_props(void)
5902 if (is_process_limited())
5904 skip("process is limited\n");
5907 CreateDirectoryA("msitest", NULL
);
5908 create_file("msitest\\volumeprop.txt", 1000);
5909 create_database(msifile
, vp_tables
, sizeof(vp_tables
)/sizeof(msi_table
));
5911 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5913 r
= MsiInstallProductA(msifile
, NULL
);
5914 ok(r
== ERROR_SUCCESS
, "got %u\n", r
);
5916 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5917 ok(r
== ERROR_SUCCESS
, "got %u\n", r
);
5919 DeleteFileA("msitest\\volumeprop.txt");
5920 RemoveDirectoryA("msitest");
5921 DeleteFileA(msifile
);
5924 static void test_shared_component(void)
5928 if (is_process_limited())
5930 skip("process is limited\n");
5933 CreateDirectoryA("msitest", NULL
);
5934 create_file("msitest\\sharedcomponent.txt", 1000);
5935 create_database_wordcount(msifile
, shc_tables
, sizeof(shc_tables
)/sizeof(shc_tables
[0]),
5936 100, 0, ";", "{A8826420-FD72-4E61-9E15-C1944CF4CBE1}");
5937 create_database_wordcount(msifile2
, shc2_tables
, sizeof(shc2_tables
)/sizeof(shc2_tables
[0]),
5938 100, 0, ";", "{A8B50B30-0E8A-4ACD-B3CF-1A5DC58B2739}");
5940 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5942 r
= MsiInstallProductA(msifile
, NULL
);
5943 ok(r
== ERROR_SUCCESS
, "got %u\n", r
);
5945 ok(pf_exists("msitest\\sharedcomponent.txt"), "file not installed\n");
5947 r
= MsiInstallProductA(msifile2
, NULL
);
5948 ok(r
== ERROR_SUCCESS
, "got %u\n", r
);
5950 ok(pf_exists("msitest\\sharedcomponent.txt"), "file not installed\n");
5952 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
5953 ok(r
== ERROR_SUCCESS
, "got %u\n", r
);
5955 ok(pf_exists("msitest\\sharedcomponent.txt"), "file removed\n");
5957 r
= MsiInstallProductA(msifile2
, "REMOVE=ALL");
5958 ok(r
== ERROR_SUCCESS
, "got %u\n", r
);
5960 ok(!pf_exists("msitest\\sharedcomponent.txt"), "file not removed\n");
5962 DeleteFileA("msitest\\sharedcomponent.txt");
5963 RemoveDirectoryA("msitest");
5964 DeleteFileA(msifile
);
5965 DeleteFileA(msifile2
);
5968 static void test_remove_upgrade_code(void)
5973 REGSAM access
= KEY_ALL_ACCESS
;
5977 if (is_process_limited())
5979 skip( "process is limited\n" );
5982 if (is_wow64
) access
|= KEY_WOW64_64KEY
;
5984 create_test_files();
5985 create_database( msifile
, icon_base_tables
, sizeof(icon_base_tables
)/sizeof(icon_base_tables
[0]) );
5987 MsiSetInternalUI( INSTALLUILEVEL_NONE
, NULL
);
5989 r
= MsiInstallProductA( msifile
, "FULL=1" );
5990 ok(r
== ERROR_SUCCESS
, "got %u\n", r
);
5992 res
= RegOpenKeyExA( HKEY_LOCAL_MACHINE
,
5993 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2",
5995 ok( res
== ERROR_SUCCESS
, "got %d\n", res
);
6000 res
= RegQueryValueExA( hkey
, "94A88FD7F6998CE40A22FB59F6B9C2BB", NULL
, &type
, (BYTE
*)buf
, &size
);
6001 ok( res
== ERROR_SUCCESS
, "got %d\n", res
);
6002 ok( type
== REG_SZ
, "got %u\n", type
);
6003 ok( size
== 1, "got %u\n", size
);
6004 ok( !buf
[0], "wrong data\n" );
6005 RegCloseKey( hkey
);
6007 r
= MsiInstallProductA( msifile
, "REMOVE=ALL" );
6008 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
6010 res
= RegOpenKeyExA( HKEY_LOCAL_MACHINE
,
6011 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2",
6013 ok( res
== ERROR_FILE_NOT_FOUND
, "got %d\n", res
);
6015 RemoveDirectoryA( "msitest" );
6016 DeleteFileA( msifile
);
6019 static void test_feature_tree(void)
6023 if (is_process_limited())
6025 skip( "process is limited\n" );
6029 create_file( "msitest\\featuretree.txt", 1000 );
6030 create_database( msifile
, ft_tables
, sizeof(ft_tables
)/sizeof(ft_tables
[0]) );
6032 MsiSetInternalUI( INSTALLUILEVEL_NONE
, NULL
);
6034 r
= MsiInstallProductA( msifile
, "INSTALLTYPE=\"0\"" );
6035 ok( r
== ERROR_INSTALL_FAILURE
, "got %u\n", r
);
6037 r
= MsiInstallProductA( msifile
, "INSTALLTYPE=\"1\"" );
6038 ok( r
== ERROR_SUCCESS
, "got %u\n", r
);
6040 r
= MsiInstallProductA( msifile
, "REMOVE=ALL" );
6041 ok( r
== ERROR_SUCCESS
, "got %u\n", r
);
6043 DeleteFileA( "msitest\\featuretree.txt" );
6044 RemoveDirectoryA( "msitest" );
6045 DeleteFileA( msifile
);
6051 char temp_path
[MAX_PATH
], prev_path
[MAX_PATH
], log_file
[MAX_PATH
];
6052 STATEMGRSTATUS status
;
6055 init_functionpointers();
6057 if (pIsWow64Process
)
6058 pIsWow64Process(GetCurrentProcess(), &is_wow64
);
6060 GetCurrentDirectoryA(MAX_PATH
, prev_path
);
6061 GetTempPathA(MAX_PATH
, temp_path
);
6062 SetCurrentDirectoryA(temp_path
);
6064 lstrcpyA(CURR_DIR
, temp_path
);
6065 len
= lstrlenA(CURR_DIR
);
6067 if(len
&& (CURR_DIR
[len
- 1] == '\\'))
6068 CURR_DIR
[len
- 1] = 0;
6070 ok(get_system_dirs(), "failed to retrieve system dirs\n");
6071 ok(get_user_dirs(), "failed to retrieve user dirs\n");
6073 /* Create a restore point ourselves so we circumvent the multitude of restore points
6074 * that would have been created by all the installation and removal tests.
6076 * This is not needed on version 5.0 where setting MSIFASTINSTALL prevents the
6077 * creation of restore points.
6079 if (pSRSetRestorePointA
&& !pMsiGetComponentPathExA
)
6081 memset(&status
, 0, sizeof(status
));
6082 ret
= notify_system_change(BEGIN_NESTED_SYSTEM_CHANGE
, &status
);
6085 /* Create only one log file and don't append. We have to pass something
6086 * for the log mode for this to work. The logfile needs to have an absolute
6087 * path otherwise we still end up with some extra logfiles as some tests
6088 * change the current directory.
6090 lstrcpyA(log_file
, temp_path
);
6091 lstrcatA(log_file
, "\\msitest.log");
6092 MsiEnableLogA(INSTALLLOGMODE_FATALEXIT
, log_file
, 0);
6094 if (pSRSetRestorePointA
) /* test has side-effects on win2k3 that cause failures in following tests */
6095 test_MsiInstallProduct();
6096 test_MsiSetComponentState();
6097 test_packagecoltypes();
6098 test_continuouscabs();
6101 test_samesequence();
6102 test_uiLevelFlags();
6103 test_readonlyfile();
6104 test_readonlyfile_cab();
6105 test_setdirproperty();
6106 test_cabisextracted();
6107 test_transformprop();
6108 test_currentworkingdir();
6112 test_sourcefolder();
6113 test_customaction51();
6114 test_installstate();
6116 test_missingcomponent();
6117 test_sourcedirprop();
6123 test_installed_prop();
6125 test_file_in_use_cab();
6126 test_allusers_prop();
6127 test_feature_override();
6129 test_package_validation();
6130 test_upgrade_code();
6131 test_mixed_package();
6132 test_volume_props();
6133 test_shared_component();
6134 test_remove_upgrade_code();
6135 test_feature_tree();
6137 DeleteFileA(log_file
);
6139 if (pSRSetRestorePointA
&& !pMsiGetComponentPathExA
&& ret
)
6141 ret
= notify_system_change(END_NESTED_SYSTEM_CHANGE
, &status
);
6143 remove_restore_point(status
.llSequenceNumber
);
6145 FreeLibrary(hsrclient
);
6147 SetCurrentDirectoryA(prev_path
);