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>
35 #include "wine/test.h"
37 static UINT (WINAPI *pMsiQueryComponentStateA)
38 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPCSTR, INSTALLSTATE*);
39 static UINT (WINAPI *pMsiSetExternalUIRecord)
40 (INSTALLUI_HANDLER_RECORD, DWORD, LPVOID, PINSTALLUI_HANDLER_RECORD);
41 static UINT (WINAPI *pMsiSourceListEnumSourcesA)
42 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD);
43 static UINT (WINAPI *pMsiSourceListGetInfoA)
44 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD);
45 static INSTALLSTATE (WINAPI *pMsiGetComponentPathExA)
46 (LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPSTR, LPDWORD);
48 static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
49 static BOOL (WINAPI *pGetTokenInformation)( HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD );
50 static BOOL (WINAPI *pOpenProcessToken)( HANDLE, DWORD, PHANDLE );
51 static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD);
52 static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
54 static HMODULE hsrclient = 0;
55 static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD);
56 static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*);
59 static const BOOL is_64bit = sizeof(void *) > sizeof(int);
61 static const char *msifile = "msitest.msi";
62 static const char *msifile2 = "winetest2.msi";
63 static const char *mstfile = "winetest.mst";
64 static CHAR CURR_DIR[MAX_PATH];
65 static CHAR PROG_FILES_DIR[MAX_PATH];
66 static CHAR PROG_FILES_DIR_NATIVE[MAX_PATH];
67 static CHAR COMMON_FILES_DIR[MAX_PATH];
68 static CHAR APP_DATA_DIR[MAX_PATH];
69 static CHAR WINDOWS_DIR[MAX_PATH];
71 /* msi database data */
73 static const CHAR component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
74 "s72\tS38\ts72\ti2\tS255\tS72\n"
75 "Component\tComponent\n"
76 "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n"
77 "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n"
78 "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\tNOT REINSTALL\tone.txt\n"
79 "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n"
80 "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n"
81 "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n"
82 "component\t\tMSITESTDIR\t0\t1\tfile\n"
83 "service_comp\t\tMSITESTDIR\t0\t1\tservice_file";
85 static const CHAR directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n"
87 "Directory\tDirectory\n"
88 "CABOUTDIR\tMSITESTDIR\tcabout\n"
89 "CHANGEDDIR\tMSITESTDIR\tchanged:second\n"
90 "FIRSTDIR\tMSITESTDIR\tfirst\n"
91 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
92 "NEWDIR\tCABOUTDIR\tnew\n"
93 "ProgramFilesFolder\tTARGETDIR\t.\n"
94 "TARGETDIR\t\tSourceDir";
96 static const CHAR feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
97 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
99 "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n"
100 "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n"
101 "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n"
102 "Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n"
103 "Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n"
104 "feature\t\t\t\t2\t1\tTARGETDIR\t0\n"
105 "service_feature\t\t\t\t2\t1\tTARGETDIR\t0";
107 static const CHAR feature_comp_dat[] = "Feature_\tComponent_\n"
109 "FeatureComponents\tFeature_\tComponent_\n"
115 "feature\tcomponent\n"
116 "service_feature\tservice_comp\n";
118 static const CHAR file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
119 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
121 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
122 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
123 "one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n"
124 "three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n"
125 "two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n"
126 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
127 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1";
129 static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
131 "InstallExecuteSequence\tAction\n"
132 "AllocateRegistrySpace\tNOT Installed\t1550\n"
133 "CostFinalize\t\t1000\n"
134 "CostInitialize\t\t800\n"
136 "ResolveSource\t\t950\n"
137 "MoveFiles\t\t1700\n"
138 "InstallFiles\t\t4000\n"
139 "DuplicateFiles\t\t4500\n"
140 "WriteEnvironmentStrings\t\t4550\n"
141 "CreateShortcuts\t\t4600\n"
142 "InstallServices\t\t5000\n"
143 "InstallFinalize\t\t6600\n"
144 "InstallInitialize\t\t1500\n"
145 "InstallValidate\t\t1400\n"
146 "LaunchConditions\t\t100\n"
147 "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000";
149 static const CHAR media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
150 "i2\ti4\tL64\tS255\tS32\tS72\n"
152 "1\t3\t\t\tDISK1\t\n"
153 "2\t5\t\tmsitest.cab\tDISK2\t\n";
155 static const CHAR property_dat[] = "Property\tValue\n"
157 "Property\tProperty\n"
158 "DefaultUIFont\tDlgFont8\n"
161 "InstallMode\tTypical\n"
162 "Manufacturer\tWine\n"
163 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
164 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
166 "ProductLanguage\t1033\n"
167 "ProductName\tMSITEST\n"
168 "ProductVersion\t1.1.1\n"
169 "PROMPTROLLBACKCOST\tP\n"
171 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
172 "AdminProperties\tPOSTADMIN\n"
174 "SERVNAME\tTestService\n"
175 "SERVDISP\tTestServiceDisp\n"
176 "MSIFASTINSTALL\t1\n";
178 static const CHAR aup_property_dat[] = "Property\tValue\n"
180 "Property\tProperty\n"
181 "DefaultUIFont\tDlgFont8\n"
185 "InstallMode\tTypical\n"
186 "Manufacturer\tWine\n"
187 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
188 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
190 "ProductLanguage\t1033\n"
191 "ProductName\tMSITEST\n"
192 "ProductVersion\t1.1.1\n"
193 "PROMPTROLLBACKCOST\tP\n"
195 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
196 "AdminProperties\tPOSTADMIN\n"
198 "SERVNAME\tTestService\n"
199 "SERVDISP\tTestServiceDisp\n"
200 "MSIFASTINSTALL\t1\n";
202 static const CHAR aup2_property_dat[] = "Property\tValue\n"
204 "Property\tProperty\n"
205 "DefaultUIFont\tDlgFont8\n"
209 "InstallMode\tTypical\n"
210 "Manufacturer\tWine\n"
211 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
212 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
214 "ProductLanguage\t1033\n"
215 "ProductName\tMSITEST\n"
216 "ProductVersion\t1.1.1\n"
217 "PROMPTROLLBACKCOST\tP\n"
219 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
220 "AdminProperties\tPOSTADMIN\n"
222 "SERVNAME\tTestService\n"
223 "SERVDISP\tTestServiceDisp\n"
224 "MSIFASTINSTALL\t1\n";
226 static const CHAR icon_property_dat[] = "Property\tValue\n"
228 "Property\tProperty\n"
229 "DefaultUIFont\tDlgFont8\n"
232 "InstallMode\tTypical\n"
233 "Manufacturer\tWine\n"
234 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
235 "ProductCode\t{7DF88A49-996F-4EC8-A022-BF956F9B2CBB}\n"
237 "ProductLanguage\t1033\n"
238 "ProductName\tMSITEST\n"
239 "ProductVersion\t1.1.1\n"
240 "PROMPTROLLBACKCOST\tP\n"
242 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
243 "AdminProperties\tPOSTADMIN\n"
245 "SERVNAME\tTestService\n"
246 "SERVDISP\tTestServiceDisp\n"
247 "MSIFASTINSTALL\t1\n";
249 static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"
250 "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n"
251 "Shortcut\tShortcut\n"
252 "Shortcut\tMSITESTDIR\tShortcut\tcomponent\tShortcut\t\tShortcut\t\t\t\t\t\n";
254 static const CHAR condition_dat[] = "Feature_\tLevel\tCondition\n"
256 "Condition\tFeature_\tLevel\n"
259 static const CHAR up_property_dat[] = "Property\tValue\n"
261 "Property\tProperty\n"
262 "DefaultUIFont\tDlgFont8\n"
265 "InstallMode\tTypical\n"
266 "Manufacturer\tWine\n"
267 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
268 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
270 "ProductLanguage\t1033\n"
271 "ProductName\tMSITEST\n"
272 "ProductVersion\t1.1.1\n"
273 "PROMPTROLLBACKCOST\tP\n"
275 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
276 "AdminProperties\tPOSTADMIN\n"
278 "SERVNAME\tTestService\n"
279 "SERVDISP\tTestServiceDisp\n"
280 "RemovePreviousVersions\t1\n"
281 "MSIFASTINSTALL\t1\n";
283 static const CHAR up2_property_dat[] = "Property\tValue\n"
285 "Property\tProperty\n"
286 "DefaultUIFont\tDlgFont8\n"
289 "InstallMode\tTypical\n"
290 "Manufacturer\tWine\n"
291 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
292 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
294 "ProductLanguage\t1033\n"
295 "ProductName\tMSITEST\n"
296 "ProductVersion\t1.1.2\n"
297 "PROMPTROLLBACKCOST\tP\n"
299 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
300 "AdminProperties\tPOSTADMIN\n"
302 "SERVNAME\tTestService\n"
303 "SERVDISP\tTestServiceDisp\n"
304 "MSIFASTINSTALL\t1\n";
306 static const CHAR up3_property_dat[] = "Property\tValue\n"
308 "Property\tProperty\n"
309 "DefaultUIFont\tDlgFont8\n"
312 "InstallMode\tTypical\n"
313 "Manufacturer\tWine\n"
314 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
315 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
317 "ProductLanguage\t1033\n"
318 "ProductName\tMSITEST\n"
319 "ProductVersion\t1.1.2\n"
320 "PROMPTROLLBACKCOST\tP\n"
322 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
323 "AdminProperties\tPOSTADMIN\n"
325 "SERVNAME\tTestService\n"
326 "SERVDISP\tTestServiceDisp\n"
327 "RemovePreviousVersions\t1\n"
328 "MSIFASTINSTALL\t1\n";
330 static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
331 "s72\ti2\tl255\tL255\tL0\ts72\n"
332 "Registry\tRegistry\n"
333 "Apples\t1\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n"
334 "Oranges\t1\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n"
335 "regdata\t1\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n"
336 "OrderTest\t1\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent";
338 static const CHAR service_install_dat[] = "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
339 "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n"
340 "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n"
341 "ServiceInstall\tServiceInstall\n"
342 "TestService\t[SERVNAME]\t[SERVDISP]\t2\t3\t0\t\t\tTestService\t\t\tservice_comp\t\t";
344 static const CHAR service_control_dat[] = "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
345 "s72\tl255\ti2\tL255\tI2\ts72\n"
346 "ServiceControl\tServiceControl\n"
347 "ServiceControl\tTestService\t8\t\t0\tservice_comp";
349 /* tables for test_continuouscabs */
350 static const CHAR cc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
351 "s72\tS38\ts72\ti2\tS255\tS72\n"
352 "Component\tComponent\n"
353 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
354 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
355 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
357 static const CHAR cc2_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
358 "s72\tS38\ts72\ti2\tS255\tS72\n"
359 "Component\tComponent\n"
360 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
361 "augustus\t\tMSITESTDIR\t0\t0\taugustus\n"
362 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
364 static const CHAR cc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
365 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
367 "feature\t\t\t\t2\t1\tTARGETDIR\t0";
369 static const CHAR cc_feature_comp_dat[] = "Feature_\tComponent_\n"
371 "FeatureComponents\tFeature_\tComponent_\n"
373 "feature\taugustus\n"
376 static const CHAR cc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
377 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
379 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
380 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
381 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
383 static const CHAR cc2_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
384 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
386 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
387 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
388 "tiberius\tmaximus\ttiberius\t500\t\t\t16384\t3\n"
389 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
391 static const CHAR cc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
392 "i2\ti4\tL64\tS255\tS32\tS72\n"
394 "1\t10\t\ttest1.cab\tDISK1\t\n"
395 "2\t2\t\ttest2.cab\tDISK2\t\n"
396 "3\t12\t\ttest3.cab\tDISK3\t\n";
398 static const CHAR co_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
399 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
401 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
402 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
403 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
405 static const CHAR co_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
406 "i2\ti4\tL64\tS255\tS32\tS72\n"
408 "1\t10\t\ttest1.cab\tDISK1\t\n"
409 "2\t2\t\ttest2.cab\tDISK2\t\n"
410 "3\t3\t\ttest3.cab\tDISK3\t\n";
412 static const CHAR co2_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
413 "i2\ti4\tL64\tS255\tS32\tS72\n"
415 "1\t10\t\ttest1.cab\tDISK1\t\n"
416 "2\t12\t\ttest3.cab\tDISK3\t\n"
417 "3\t2\t\ttest2.cab\tDISK2\t\n";
419 static const CHAR mm_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
420 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
422 "maximus\tmaximus\tmaximus\t500\t\t\t512\t1\n"
423 "augustus\taugustus\taugustus\t500\t\t\t512\t2\n"
424 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
426 static const CHAR mm_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
427 "i2\ti4\tL64\tS255\tS32\tS72\n"
429 "1\t3\t\ttest1.cab\tDISK1\t\n";
431 static const CHAR ss_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
432 "i2\ti4\tL64\tS255\tS32\tS72\n"
434 "1\t2\t\ttest1.cab\tDISK1\t\n"
435 "2\t2\t\ttest2.cab\tDISK2\t\n"
436 "3\t12\t\ttest3.cab\tDISK3\t\n";
438 /* tables for test_uiLevelFlags */
439 static const CHAR ui_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
440 "s72\tS38\ts72\ti2\tS255\tS72\n"
441 "Component\tComponent\n"
442 "maximus\t\tMSITESTDIR\t0\tHASUIRUN=1\tmaximus\n"
443 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
444 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
446 static const CHAR ui_install_ui_seq_dat[] = "Action\tCondition\tSequence\n"
448 "InstallUISequence\tAction\n"
449 "SetUIProperty\t\t5\n"
450 "ExecuteAction\t\t1100\n";
452 static const CHAR ui_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
453 "s72\ti2\tS64\tS0\tS255\n"
454 "CustomAction\tAction\n"
455 "SetUIProperty\t51\tHASUIRUN\t1\t\n";
457 static const CHAR rof_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
458 "s72\tS38\ts72\ti2\tS255\tS72\n"
459 "Component\tComponent\n"
460 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n";
462 static const CHAR rof_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
463 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
465 "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n"
466 "montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0";
468 static const CHAR rof_feature_comp_dat[] = "Feature_\tComponent_\n"
470 "FeatureComponents\tFeature_\tComponent_\n"
472 "montecristo\tmaximus";
474 static const CHAR rof_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
475 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
477 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1";
479 static const CHAR rof_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
480 "i2\ti4\tL64\tS255\tS32\tS72\n"
482 "1\t1\t\t\tDISK1\t\n";
484 static const CHAR rofc_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\t16384\t1";
489 static const CHAR rofc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
490 "i2\ti4\tL64\tS255\tS32\tS72\n"
492 "1\t1\t\ttest1.cab\tDISK1\t\n";
494 static const CHAR lus2_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
495 "i2\ti4\tL64\tS255\tS32\tS72\n"
497 "1\t1\t\t#test1.cab\tDISK1\t\n";
499 static const CHAR sdp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
501 "InstallExecuteSequence\tAction\n"
502 "AllocateRegistrySpace\tNOT Installed\t1550\n"
503 "CostFinalize\t\t1000\n"
504 "CostInitialize\t\t800\n"
506 "InstallFiles\t\t4000\n"
507 "InstallFinalize\t\t6600\n"
508 "InstallInitialize\t\t1500\n"
509 "InstallValidate\t\t1400\n"
510 "LaunchConditions\t\t100\n"
511 "SetDirProperty\t\t950";
513 static const CHAR sdp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
514 "s72\ti2\tS64\tS0\tS255\n"
515 "CustomAction\tAction\n"
516 "SetDirProperty\t51\tMSITESTDIR\t[CommonFilesFolder]msitest\\\t\n";
518 static const CHAR pv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
520 "InstallExecuteSequence\tAction\n"
521 "LaunchConditions\t\t100\n"
522 "CostInitialize\t\t800\n"
524 "CostFinalize\t\t1000\n"
525 "InstallValidate\t\t1400\n"
526 "InstallInitialize\t\t1500\n"
527 "InstallFiles\t\t4000\n"
528 "InstallFinalize\t\t6600\n";
530 static const CHAR cie_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
531 "s72\tS38\ts72\ti2\tS255\tS72\n"
532 "Component\tComponent\n"
533 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
534 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
535 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
536 "gaius\t\tMSITESTDIR\t0\t1\tgaius\n";
538 static const CHAR cie_feature_comp_dat[] = "Feature_\tComponent_\n"
540 "FeatureComponents\tFeature_\tComponent_\n"
542 "feature\taugustus\n"
546 static const CHAR cie_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
547 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
549 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
550 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
551 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12\n"
552 "gaius\tgaius\tgaius\t500\t\t\t8192\t11";
554 static const CHAR cie_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
555 "i2\ti4\tL64\tS255\tS32\tS72\n"
557 "1\t1\t\ttest1.cab\tDISK1\t\n"
558 "2\t2\t\ttest2.cab\tDISK2\t\n"
559 "3\t12\t\ttest3.cab\tDISK3\t\n";
561 static const CHAR ci_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
563 "InstallExecuteSequence\tAction\n"
564 "CostFinalize\t\t1000\n"
565 "CostInitialize\t\t800\n"
567 "InstallFiles\t\t4000\n"
568 "InstallServices\t\t5000\n"
569 "InstallFinalize\t\t6600\n"
570 "InstallInitialize\t\t1500\n"
571 "RunInstall\t\t1600\n"
572 "InstallValidate\t\t1400\n"
573 "LaunchConditions\t\t100";
575 static const CHAR ci_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
576 "s72\ti2\tS64\tS0\tS255\n"
577 "CustomAction\tAction\n"
578 "RunInstall\t87\tmsitest\\concurrent.msi\tMYPROP=[UILevel]\t\n";
580 static const CHAR ci_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
581 "s72\tS38\ts72\ti2\tS255\tS72\n"
582 "Component\tComponent\n"
583 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n";
585 static const CHAR ci2_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
586 "s72\tS38\ts72\ti2\tS255\tS72\n"
587 "Component\tComponent\n"
588 "augustus\t\tMSITESTDIR\t0\tUILevel=3 AND MYPROP=5\taugustus\n";
590 static const CHAR ci2_feature_comp_dat[] = "Feature_\tComponent_\n"
592 "FeatureComponents\tFeature_\tComponent_\n"
595 static const CHAR ci2_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
596 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
598 "augustus\taugustus\taugustus\t500\t\t\t8192\t1";
600 static const CHAR spf_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
601 "s72\ti2\tS64\tS0\tS255\n"
602 "CustomAction\tAction\n"
603 "SetFolderProp\t51\tMSITESTDIR\t[ProgramFilesFolder]\\msitest\\added\t\n";
605 static const CHAR spf_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
607 "InstallExecuteSequence\tAction\n"
608 "CostFinalize\t\t1000\n"
609 "CostInitialize\t\t800\n"
611 "SetFolderProp\t\t950\n"
612 "InstallFiles\t\t4000\n"
613 "InstallServices\t\t5000\n"
614 "InstallFinalize\t\t6600\n"
615 "InstallInitialize\t\t1500\n"
616 "InstallValidate\t\t1400\n"
617 "LaunchConditions\t\t100";
619 static const CHAR spf_install_ui_seq_dat[] = "Action\tCondition\tSequence\n"
621 "InstallUISequence\tAction\n"
622 "CostInitialize\t\t800\n"
624 "CostFinalize\t\t1000\n"
625 "ExecuteAction\t\t1100\n";
627 static const CHAR pp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
629 "InstallExecuteSequence\tAction\n"
630 "ValidateProductID\t\t700\n"
631 "CostInitialize\t\t800\n"
633 "CostFinalize\t\t1000\n"
634 "InstallValidate\t\t1400\n"
635 "InstallInitialize\t\t1500\n"
636 "ProcessComponents\tPROCESS_COMPONENTS=1 Or FULL=1\t1600\n"
637 "UnpublishFeatures\tUNPUBLISH_FEATURES=1 Or FULL=1\t1800\n"
638 "RemoveFiles\t\t3500\n"
639 "InstallFiles\t\t4000\n"
640 "RegisterUser\tREGISTER_USER=1 Or FULL=1\t6000\n"
641 "RegisterProduct\tREGISTER_PRODUCT=1 Or FULL=1\t6100\n"
642 "PublishFeatures\tPUBLISH_FEATURES=1 Or FULL=1\t6300\n"
643 "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n"
644 "InstallFinalize\t\t6600";
646 static const CHAR tp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
647 "s72\tS38\ts72\ti2\tS255\tS72\n"
648 "Component\tComponent\n"
649 "augustus\t\tMSITESTDIR\t0\tprop=\"val\"\taugustus\n";
651 static const CHAR cwd_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
652 "s72\tS38\ts72\ti2\tS255\tS72\n"
653 "Component\tComponent\n"
654 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
656 static const CHAR adm_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
657 "s72\tS38\ts72\ti2\tS255\tS72\n"
658 "Component\tComponent\n"
659 "augustus\t\tMSITESTDIR\t0\tPOSTADMIN=1\taugustus";
661 static const CHAR adm_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
662 "s72\ti2\tS64\tS0\tS255\n"
663 "CustomAction\tAction\n"
664 "SetPOSTADMIN\t51\tPOSTADMIN\t1\t\n";
666 static const CHAR adm_admin_exec_seq_dat[] = "Action\tCondition\tSequence\n"
668 "AdminExecuteSequence\tAction\n"
669 "CostFinalize\t\t1000\n"
670 "CostInitialize\t\t800\n"
672 "SetPOSTADMIN\t\t950\n"
673 "InstallFiles\t\t4000\n"
674 "InstallFinalize\t\t6600\n"
675 "InstallInitialize\t\t1500\n"
676 "InstallValidate\t\t1400\n"
677 "LaunchConditions\t\t100";
679 static const CHAR amp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
680 "s72\tS38\ts72\ti2\tS255\tS72\n"
681 "Component\tComponent\n"
682 "augustus\t\tMSITESTDIR\t0\tMYPROP=2718 and MyProp=42\taugustus\n";
684 static const CHAR rem_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
685 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
687 "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n"
688 "helium\thelium\thelium\t0\t\t\t8192\t1\n"
689 "lithium\tlithium\tlithium\t0\t\t\t8192\t1";
691 static const CHAR rem_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
693 "InstallExecuteSequence\tAction\n"
694 "ValidateProductID\t\t700\n"
695 "CostInitialize\t\t800\n"
697 "CostFinalize\t\t1000\n"
698 "InstallValidate\t\t1400\n"
699 "InstallInitialize\t\t1500\n"
700 "ProcessComponents\t\t1600\n"
701 "UnpublishFeatures\t\t1800\n"
702 "RemoveFiles\t\t3500\n"
703 "InstallFiles\t\t4000\n"
704 "RegisterProduct\t\t6100\n"
705 "PublishFeatures\t\t6300\n"
706 "PublishProduct\t\t6400\n"
707 "InstallFinalize\t\t6600";
709 static const CHAR mc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
710 "s72\tS38\ts72\ti2\tS255\tS72\n"
711 "Component\tComponent\n"
712 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
713 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
714 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
715 "gaius\t\tMSITESTDIR\t0\tGAIUS=1\tgaius\n"
716 "tiberius\t\tMSITESTDIR\t0\t\ttiberius\n";
718 static const CHAR mc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
719 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
721 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
722 "augustus\taugustus\taugustus\t500\t\t\t0\t2\n"
723 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3\n"
724 "gaius\tgaius\tgaius\t500\t\t\t16384\t4\n"
725 "tiberius\ttiberius\ttiberius\t500\t\t\t0\t5\n";
727 static const CHAR mc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
728 "i2\ti4\tL64\tS255\tS32\tS72\n"
730 "1\t1\t\ttest1.cab\tDISK1\t\n"
731 "2\t2\t\ttest2.cab\tDISK2\t\n"
732 "3\t3\t\ttest3.cab\tDISK3\t\n"
733 "4\t4\t\ttest3.cab\tDISK3\t\n"
734 "5\t5\t\ttest4.cab\tDISK4\t\n";
736 static const CHAR mc_file_hash_dat[] = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"
737 "s72\ti2\ti4\ti4\ti4\ti4\n"
738 "MsiFileHash\tFile_\n"
739 "caesar\t0\t850433704\t-241429251\t675791761\t-1221108824";
741 static const CHAR wrv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
742 "s72\tS38\ts72\ti2\tS255\tS72\n"
743 "Component\tComponent\n"
744 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
746 static const CHAR ca51_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
747 "s72\tS38\ts72\ti2\tS255\tS72\n"
748 "Component\tComponent\n"
749 "augustus\t\tMSITESTDIR\t0\tMYPROP=42\taugustus\n";
751 static const CHAR ca51_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
753 "InstallExecuteSequence\tAction\n"
754 "ValidateProductID\t\t700\n"
755 "GoodSetProperty\t\t725\n"
756 "BadSetProperty\t\t750\n"
757 "CostInitialize\t\t800\n"
758 "ResolveSource\t\t810\n"
760 "SetSourceDir\tSRCDIR\t910\n"
761 "CostFinalize\t\t1000\n"
762 "InstallValidate\t\t1400\n"
763 "InstallInitialize\t\t1500\n"
764 "InstallFiles\t\t4000\n"
765 "InstallFinalize\t\t6600";
767 static const CHAR ca51_custom_action_dat[] = "Action\tType\tSource\tTarget\n"
769 "CustomAction\tAction\n"
770 "GoodSetProperty\t51\tMYPROP\t42\n"
771 "BadSetProperty\t51\t\tMYPROP\n"
772 "SetSourceDir\t51\tSourceDir\t[SRCDIR]\n";
774 static const CHAR is_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
775 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
777 "one\t\t\t\t2\t1\t\t0\n" /* favorLocal */
778 "two\t\t\t\t2\t1\t\t1\n" /* favorSource */
779 "three\t\t\t\t2\t1\t\t4\n" /* favorAdvertise */
780 "four\t\t\t\t2\t0\t\t0"; /* disabled */
782 static const CHAR is_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
783 "s72\tS38\ts72\ti2\tS255\tS72\n"
784 "Component\tComponent\n"
785 "alpha\t\tMSITESTDIR\t0\t\talpha_file\n" /* favorLocal:Local */
786 "beta\t\tMSITESTDIR\t1\t\tbeta_file\n" /* favorLocal:Source */
787 "gamma\t\tMSITESTDIR\t2\t\tgamma_file\n" /* favorLocal:Optional */
788 "theta\t\tMSITESTDIR\t0\t\ttheta_file\n" /* favorSource:Local */
789 "delta\t\tMSITESTDIR\t1\t\tdelta_file\n" /* favorSource:Source */
790 "epsilon\t\tMSITESTDIR\t2\t\tepsilon_file\n" /* favorSource:Optional */
791 "zeta\t\tMSITESTDIR\t0\t\tzeta_file\n" /* favorAdvertise:Local */
792 "iota\t\tMSITESTDIR\t1\t\tiota_file\n" /* favorAdvertise:Source */
793 "eta\t\tMSITESTDIR\t2\t\teta_file\n" /* favorAdvertise:Optional */
794 "kappa\t\tMSITESTDIR\t0\t\tkappa_file\n" /* disabled:Local */
795 "lambda\t\tMSITESTDIR\t1\t\tlambda_file\n" /* disabled:Source */
796 "mu\t\tMSITESTDIR\t2\t\tmu_file\n"; /* disabled:Optional */
798 static const CHAR is_feature_comp_dat[] = "Feature_\tComponent_\n"
800 "FeatureComponents\tFeature_\tComponent_\n"
814 static const CHAR is_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
815 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
817 "alpha_file\talpha\talpha\t500\t\t\t8192\t1\n"
818 "beta_file\tbeta\tbeta\t500\t\t\t8291\t2\n"
819 "gamma_file\tgamma\tgamma\t500\t\t\t8192\t3\n"
820 "theta_file\ttheta\ttheta\t500\t\t\t8192\t4\n"
821 "delta_file\tdelta\tdelta\t500\t\t\t8192\t5\n"
822 "epsilon_file\tepsilon\tepsilon\t500\t\t\t8192\t6\n"
823 "zeta_file\tzeta\tzeta\t500\t\t\t8192\t7\n"
824 "iota_file\tiota\tiota\t500\t\t\t8192\t8\n"
825 "eta_file\teta\teta\t500\t\t\t8192\t9\n"
826 "kappa_file\tkappa\tkappa\t500\t\t\t8192\t10\n"
827 "lambda_file\tlambda\tlambda\t500\t\t\t8192\t11\n"
828 "mu_file\tmu\tmu\t500\t\t\t8192\t12";
830 static const CHAR is_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
831 "i2\ti4\tL64\tS255\tS32\tS72\n"
833 "1\t12\t\t\tDISK1\t\n";
835 static const CHAR sp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
836 "s72\tS38\ts72\ti2\tS255\tS72\n"
837 "Component\tComponent\n"
838 "augustus\t\tTWODIR\t0\t\taugustus\n";
840 static const CHAR sp_directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n"
842 "Directory\tDirectory\n"
843 "TARGETDIR\t\tSourceDir\n"
844 "ProgramFilesFolder\tTARGETDIR\t.\n"
845 "MSITESTDIR\tProgramFilesFolder\tmsitest:.\n"
846 "ONEDIR\tMSITESTDIR\t.:shortone|longone\n"
847 "TWODIR\tONEDIR\t.:shorttwo|longtwo";
849 static const CHAR mcp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
850 "s72\tS38\ts72\ti2\tS255\tS72\n"
851 "Component\tComponent\n"
852 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t2\t\thydrogen\n"
853 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t2\t\thelium\n"
854 "lithium\t{4AF28FFC-71C7-4307-BDE4-B77C5338F56F}\tMSITESTDIR\t2\tPROPVAR=42\tlithium\n";
856 static const CHAR mcp_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
857 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
859 "hydroxyl\t\thydroxyl\thydroxyl\t2\t1\tTARGETDIR\t0\n"
860 "heliox\t\theliox\theliox\t2\t5\tTARGETDIR\t0\n"
861 "lithia\t\tlithia\tlithia\t2\t10\tTARGETDIR\t0";
863 static const CHAR mcp_feature_comp_dat[] = "Feature_\tComponent_\n"
865 "FeatureComponents\tFeature_\tComponent_\n"
866 "hydroxyl\thydrogen\n"
870 static const CHAR mcomp_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
871 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
873 "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n"
874 "helium\thelium\thelium\t0\t\t\t8192\t1\n"
875 "lithium\tlithium\tlithium\t0\t\t\t8192\t1\n"
876 "beryllium\tmissingcomp\tberyllium\t0\t\t\t8192\t1";
878 static const CHAR ai_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
879 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
881 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
882 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
883 "one.txt\tOne\tone.txt\t1000\t\t\t16384\t1\n"
884 "three.txt\tThree\tthree.txt\t1000\t\t\t16384\t3\n"
885 "two.txt\tTwo\ttwo.txt\t1000\t\t\t16384\t2\n"
886 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
887 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1";
889 static const CHAR ip_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
891 "InstallExecuteSequence\tAction\n"
892 "CostFinalize\t\t1000\n"
893 "ValidateProductID\t\t700\n"
894 "CostInitialize\t\t800\n"
896 "RemoveFiles\t\t3500\n"
897 "InstallFiles\t\t4000\n"
898 "RegisterUser\t\t6000\n"
899 "RegisterProduct\t\t6100\n"
900 "PublishFeatures\t\t6300\n"
901 "PublishProduct\t\t6400\n"
902 "InstallFinalize\t\t6600\n"
903 "InstallInitialize\t\t1500\n"
904 "ProcessComponents\t\t1600\n"
905 "UnpublishFeatures\t\t1800\n"
906 "InstallValidate\t\t1400\n"
907 "LaunchConditions\t\t100\n"
908 "TestInstalledProp\tInstalled AND NOT REMOVE\t950\n";
910 static const CHAR ip_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
911 "s72\ti2\tS64\tS0\tS255\n"
912 "CustomAction\tAction\n"
913 "TestInstalledProp\t19\t\tTest failed\t\n";
915 static const CHAR aup_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
917 "InstallExecuteSequence\tAction\n"
918 "CostFinalize\t\t1000\n"
919 "ValidateProductID\t\t700\n"
920 "CostInitialize\t\t800\n"
922 "RemoveFiles\t\t3500\n"
923 "InstallFiles\t\t4000\n"
924 "RegisterUser\t\t6000\n"
925 "RegisterProduct\t\t6100\n"
926 "PublishFeatures\t\t6300\n"
927 "PublishProduct\t\t6400\n"
928 "InstallFinalize\t\t6600\n"
929 "InstallInitialize\t\t1500\n"
930 "ProcessComponents\t\t1600\n"
931 "UnpublishFeatures\t\t1800\n"
932 "InstallValidate\t\t1400\n"
933 "LaunchConditions\t\t100\n"
934 "TestAllUsersProp\tALLUSERS AND NOT REMOVE\t50\n";
936 static const CHAR aup2_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
938 "InstallExecuteSequence\tAction\n"
939 "CostFinalize\t\t1000\n"
940 "ValidateProductID\t\t700\n"
941 "CostInitialize\t\t800\n"
943 "RemoveFiles\t\t3500\n"
944 "InstallFiles\t\t4000\n"
945 "RegisterUser\t\t6000\n"
946 "RegisterProduct\t\t6100\n"
947 "PublishFeatures\t\t6300\n"
948 "PublishProduct\t\t6400\n"
949 "InstallFinalize\t\t6600\n"
950 "InstallInitialize\t\t1500\n"
951 "ProcessComponents\t\t1600\n"
952 "UnpublishFeatures\t\t1800\n"
953 "InstallValidate\t\t1400\n"
954 "LaunchConditions\t\t100\n"
955 "TestAllUsersProp\tALLUSERS=2 AND NOT REMOVE\t50\n";
957 static const CHAR aup3_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
959 "InstallExecuteSequence\tAction\n"
960 "CostFinalize\t\t1000\n"
961 "ValidateProductID\t\t700\n"
962 "CostInitialize\t\t800\n"
964 "RemoveFiles\t\t3500\n"
965 "InstallFiles\t\t4000\n"
966 "RegisterUser\t\t6000\n"
967 "RegisterProduct\t\t6100\n"
968 "PublishFeatures\t\t6300\n"
969 "PublishProduct\t\t6400\n"
970 "InstallFinalize\t\t6600\n"
971 "InstallInitialize\t\t1500\n"
972 "ProcessComponents\t\t1600\n"
973 "UnpublishFeatures\t\t1800\n"
974 "InstallValidate\t\t1400\n"
975 "LaunchConditions\t\t100\n"
976 "TestAllUsersProp\tALLUSERS=1 AND NOT REMOVE\t50\n";
978 static const CHAR aup_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
979 "s72\ti2\tS64\tS0\tS255\n"
980 "CustomAction\tAction\n"
981 "TestAllUsersProp\t19\t\tTest failed\t\n";
983 static const CHAR fo_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
984 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
986 "override.txt\toverride\toverride.txt\t1000\t\t\t8192\t1\n"
987 "preselected.txt\tpreselected\tpreselected.txt\t1000\t\t\t8192\t2\n"
988 "notpreselected.txt\tnotpreselected\tnotpreselected.txt\t1000\t\t\t8192\t3\n";
990 static const CHAR fo_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
991 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
993 "override\t\t\toverride feature\t1\t1\tMSITESTDIR\t0\n"
994 "preselected\t\t\tpreselected feature\t1\t1\tMSITESTDIR\t0\n"
995 "notpreselected\t\t\tnotpreselected feature\t1\t1\tMSITESTDIR\t0\n";
997 static const CHAR fo_condition_dat[] = "Feature_\tLevel\tCondition\n"
999 "Condition\tFeature_\tLevel\n"
1000 "preselected\t0\tPreselected\n"
1001 "notpreselected\t0\tNOT Preselected\n";
1003 static const CHAR fo_feature_comp_dat[] = "Feature_\tComponent_\n"
1005 "FeatureComponents\tFeature_\tComponent_\n"
1006 "override\toverride\n"
1007 "preselected\tpreselected\n"
1008 "notpreselected\tnotpreselected\n";
1010 static const CHAR fo_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1011 "s72\tS38\ts72\ti2\tS255\tS72\n"
1012 "Component\tComponent\n"
1013 "override\t{0A00FB1D-97B0-4B42-ADF0-BB8913416623}\tMSITESTDIR\t0\t\toverride.txt\n"
1014 "preselected\t{44E1DB75-605A-43DD-8CF5-CAB17F1BBD60}\tMSITESTDIR\t0\t\tpreselected.txt\n"
1015 "notpreselected\t{E1647733-5E75-400A-A92E-5E60B4D4EF9F}\tMSITESTDIR\t0\t\tnotpreselected.txt\n";
1017 static const CHAR fo_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
1018 "s72\ti2\tS64\tS0\tS255\n"
1019 "CustomAction\tAction\n"
1020 "SetPreselected\t51\tPreselected\t1\t\n";
1022 static const CHAR fo_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1024 "InstallExecuteSequence\tAction\n"
1025 "LaunchConditions\t\t100\n"
1026 "SetPreselected\tpreselect=1\t200\n"
1027 "CostInitialize\t\t800\n"
1029 "CostFinalize\t\t1000\n"
1030 "InstallValidate\t\t1400\n"
1031 "InstallInitialize\t\t1500\n"
1032 "ProcessComponents\t\t1600\n"
1033 "RemoveFiles\t\t1700\n"
1034 "InstallFiles\t\t2000\n"
1035 "RegisterProduct\t\t5000\n"
1036 "PublishFeatures\t\t5100\n"
1037 "PublishProduct\t\t5200\n"
1038 "InstallFinalize\t\t6000\n";
1040 static const CHAR sd_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1041 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1043 "sourcedir.txt\tsourcedir\tsourcedir.txt\t1000\t\t\t8192\t1\n";
1045 static const CHAR sd_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1046 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1047 "Feature\tFeature\n"
1048 "sourcedir\t\t\tsourcedir feature\t1\t2\tMSITESTDIR\t0\n";
1050 static const CHAR sd_feature_comp_dat[] = "Feature_\tComponent_\n"
1052 "FeatureComponents\tFeature_\tComponent_\n"
1053 "sourcedir\tsourcedir\n";
1055 static const CHAR sd_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1056 "s72\tS38\ts72\ti2\tS255\tS72\n"
1057 "Component\tComponent\n"
1058 "sourcedir\t{DD422F92-3ED8-49B5-A0B7-F266F98357DF}\tMSITESTDIR\t0\t\tsourcedir.txt\n";
1060 static const CHAR sd_install_ui_seq_dat[] = "Action\tCondition\tSequence\n"
1062 "InstallUISequence\tAction\n"
1063 "TestSourceDirProp1\tnot SourceDir and not SOURCEDIR and not Installed\t99\n"
1064 "AppSearch\t\t100\n"
1065 "TestSourceDirProp2\tnot SourceDir and not SOURCEDIR and not Installed\t101\n"
1066 "LaunchConditions\tnot Installed \t110\n"
1067 "TestSourceDirProp3\tnot SourceDir and not SOURCEDIR and not Installed\t111\n"
1068 "FindRelatedProducts\t\t120\n"
1069 "TestSourceDirProp4\tnot SourceDir and not SOURCEDIR and not Installed\t121\n"
1070 "CCPSearch\t\t130\n"
1071 "TestSourceDirProp5\tnot SourceDir and not SOURCEDIR and not Installed\t131\n"
1072 "RMCCPSearch\t\t140\n"
1073 "TestSourceDirProp6\tnot SourceDir and not SOURCEDIR and not Installed\t141\n"
1074 "ValidateProductID\t\t150\n"
1075 "TestSourceDirProp7\tnot SourceDir and not SOURCEDIR and not Installed\t151\n"
1076 "CostInitialize\t\t800\n"
1077 "TestSourceDirProp8\tnot SourceDir and not SOURCEDIR and not Installed\t801\n"
1079 "TestSourceDirProp9\tnot SourceDir and not SOURCEDIR and not Installed\t901\n"
1080 "IsolateComponents\t\t1000\n"
1081 "TestSourceDirProp10\tnot SourceDir and not SOURCEDIR and not Installed\t1001\n"
1082 "CostFinalize\t\t1100\n"
1083 "TestSourceDirProp11\tnot SourceDir and not SOURCEDIR and not Installed\t1101\n"
1084 "MigrateFeatureStates\t\t1200\n"
1085 "TestSourceDirProp12\tnot SourceDir and not SOURCEDIR and not Installed\t1201\n"
1086 "ExecuteAction\t\t1300\n"
1087 "TestSourceDirProp13\tnot SourceDir and not SOURCEDIR and not Installed\t1301\n";
1089 static const CHAR sd_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1091 "InstallExecuteSequence\tAction\n"
1092 "TestSourceDirProp14\tSourceDir and SOURCEDIR and not Installed\t99\n"
1093 "LaunchConditions\t\t100\n"
1094 "TestSourceDirProp15\tSourceDir and SOURCEDIR and not Installed\t101\n"
1095 "ValidateProductID\t\t700\n"
1096 "TestSourceDirProp16\tSourceDir and SOURCEDIR and not Installed\t701\n"
1097 "CostInitialize\t\t800\n"
1098 "TestSourceDirProp17\tSourceDir and SOURCEDIR and not Installed\t801\n"
1099 "ResolveSource\tResolveSource and not Installed\t850\n"
1100 "TestSourceDirProp18\tResolveSource and not SourceDir and not SOURCEDIR and not Installed\t851\n"
1101 "TestSourceDirProp19\tnot ResolveSource and SourceDir and SOURCEDIR and not Installed\t852\n"
1103 "TestSourceDirProp20\tSourceDir and SOURCEDIR and not Installed\t901\n"
1104 "IsolateComponents\t\t1000\n"
1105 "TestSourceDirProp21\tSourceDir and SOURCEDIR and not Installed\t1001\n"
1106 "CostFinalize\t\t1100\n"
1107 "TestSourceDirProp22\tSourceDir and SOURCEDIR and not Installed\t1101\n"
1108 "MigrateFeatureStates\t\t1200\n"
1109 "TestSourceDirProp23\tSourceDir and SOURCEDIR and not Installed\t1201\n"
1110 "InstallValidate\t\t1400\n"
1111 "TestSourceDirProp24\tSourceDir and SOURCEDIR and not Installed\t1401\n"
1112 "InstallInitialize\t\t1500\n"
1113 "TestSourceDirProp25\tSourceDir and SOURCEDIR and not Installed\t1501\n"
1114 "ProcessComponents\t\t1600\n"
1115 "TestSourceDirProp26\tnot SourceDir and not SOURCEDIR and not Installed\t1601\n"
1116 "UnpublishFeatures\t\t1800\n"
1117 "TestSourceDirProp27\tnot SourceDir and not SOURCEDIR and not Installed\t1801\n"
1118 "RemoveFiles\t\t3500\n"
1119 "TestSourceDirProp28\tnot SourceDir and not SOURCEDIR and not Installed\t3501\n"
1120 "InstallFiles\t\t4000\n"
1121 "TestSourceDirProp29\tnot SourceDir and not SOURCEDIR and not Installed\t4001\n"
1122 "RegisterUser\t\t6000\n"
1123 "TestSourceDirProp30\tnot SourceDir and not SOURCEDIR and not Installed\t6001\n"
1124 "RegisterProduct\t\t6100\n"
1125 "TestSourceDirProp31\tnot SourceDir and not SOURCEDIR and not Installed\t6101\n"
1126 "PublishFeatures\t\t6300\n"
1127 "TestSourceDirProp32\tnot SourceDir and not SOURCEDIR and not Installed\t6301\n"
1128 "PublishProduct\t\t6400\n"
1129 "TestSourceDirProp33\tnot SourceDir and not SOURCEDIR and not Installed\t6401\n"
1130 "InstallExecute\t\t6500\n"
1131 "TestSourceDirProp34\tnot SourceDir and not SOURCEDIR and not Installed\t6501\n"
1132 "InstallFinalize\t\t6600\n"
1133 "TestSourceDirProp35\tnot SourceDir and not SOURCEDIR and not Installed\t6601\n";
1135 static const CHAR sd_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
1136 "s72\ti2\tS64\tS0\tS255\n"
1137 "CustomAction\tAction\n"
1138 "TestSourceDirProp1\t19\t\tTest 1 failed\t\n"
1139 "TestSourceDirProp2\t19\t\tTest 2 failed\t\n"
1140 "TestSourceDirProp3\t19\t\tTest 3 failed\t\n"
1141 "TestSourceDirProp4\t19\t\tTest 4 failed\t\n"
1142 "TestSourceDirProp5\t19\t\tTest 5 failed\t\n"
1143 "TestSourceDirProp6\t19\t\tTest 6 failed\t\n"
1144 "TestSourceDirProp7\t19\t\tTest 7 failed\t\n"
1145 "TestSourceDirProp8\t19\t\tTest 8 failed\t\n"
1146 "TestSourceDirProp9\t19\t\tTest 9 failed\t\n"
1147 "TestSourceDirProp10\t19\t\tTest 10 failed\t\n"
1148 "TestSourceDirProp11\t19\t\tTest 11 failed\t\n"
1149 "TestSourceDirProp12\t19\t\tTest 12 failed\t\n"
1150 "TestSourceDirProp13\t19\t\tTest 13 failed\t\n"
1151 "TestSourceDirProp14\t19\t\tTest 14 failed\t\n"
1152 "TestSourceDirProp15\t19\t\tTest 15 failed\t\n"
1153 "TestSourceDirProp16\t19\t\tTest 16 failed\t\n"
1154 "TestSourceDirProp17\t19\t\tTest 17 failed\t\n"
1155 "TestSourceDirProp18\t19\t\tTest 18 failed\t\n"
1156 "TestSourceDirProp19\t19\t\tTest 19 failed\t\n"
1157 "TestSourceDirProp20\t19\t\tTest 20 failed\t\n"
1158 "TestSourceDirProp21\t19\t\tTest 21 failed\t\n"
1159 "TestSourceDirProp22\t19\t\tTest 22 failed\t\n"
1160 "TestSourceDirProp23\t19\t\tTest 23 failed\t\n"
1161 "TestSourceDirProp24\t19\t\tTest 24 failed\t\n"
1162 "TestSourceDirProp25\t19\t\tTest 25 failed\t\n"
1163 "TestSourceDirProp26\t19\t\tTest 26 failed\t\n"
1164 "TestSourceDirProp27\t19\t\tTest 27 failed\t\n"
1165 "TestSourceDirProp28\t19\t\tTest 28 failed\t\n"
1166 "TestSourceDirProp29\t19\t\tTest 29 failed\t\n"
1167 "TestSourceDirProp30\t19\t\tTest 30 failed\t\n"
1168 "TestSourceDirProp31\t19\t\tTest 31 failed\t\n"
1169 "TestSourceDirProp32\t19\t\tTest 32 failed\t\n"
1170 "TestSourceDirProp33\t19\t\tTest 33 failed\t\n"
1171 "TestSourceDirProp34\t19\t\tTest 34 failed\t\n"
1172 "TestSourceDirProp35\t19\t\tTest 35 failed\t\n";
1174 static const CHAR cl_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
1175 "s72\ti2\tS64\tS0\tS255\n"
1176 "CustomAction\tAction\n"
1177 "TestCommandlineProp\t19\t\tTest1\t\n";
1179 static const CHAR cl_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1181 "InstallExecuteSequence\tAction\n"
1182 "LaunchConditions\t\t100\n"
1183 "ValidateProductID\t\t700\n"
1184 "CostInitialize\t\t800\n"
1186 "CostFinalize\t\t1000\n"
1187 "TestCommandlineProp\tP=\"one\"\t1100\n"
1188 "InstallInitialize\t\t1500\n"
1189 "ProcessComponents\t\t1600\n"
1190 "InstallValidate\t\t1400\n"
1191 "InstallFinalize\t\t5000\n";
1193 static const CHAR uc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1194 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1196 "upgradecode.txt\tupgradecode\tupgradecode.txt\t1000\t\t\t8192\t1\n";
1198 static const CHAR uc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1199 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1200 "Feature\tFeature\n"
1201 "upgradecode\t\t\tupgradecode feature\t1\t2\tMSITESTDIR\t0\n";
1203 static const CHAR uc_feature_comp_dat[] = "Feature_\tComponent_\n"
1205 "FeatureComponents\tFeature_\tComponent_\n"
1206 "upgradecode\tupgradecode\n";
1208 static const CHAR uc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1209 "s72\tS38\ts72\ti2\tS255\tS72\n"
1210 "Component\tComponent\n"
1211 "upgradecode\t{6952B732-2FCB-4E47-976F-989FCBD7EDFB}\tMSITESTDIR\t0\t\tupgradecode.txt\n";
1213 static const CHAR uc_property_dat[] = "Property\tValue\n"
1215 "Property\tProperty\n"
1217 "ProductCode\t{E5FB1241-F547-4BA7-A60E-8E75797268D4}\n"
1218 "ProductName\tMSITEST\n"
1219 "ProductVersion\t1.1.1\n"
1220 "UpgradeCode\t#UPGEADECODE#\n"
1221 "MSIFASTINSTALL\t1\n";
1223 static const CHAR uc_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
1225 "InstallExecuteSequence\tAction\n"
1226 "LaunchConditions\t\t100\n"
1227 "CostInitialize\t\t200\n"
1229 "CostFinalize\t\t400\n"
1230 "InstallInitialize\t\t500\n"
1231 "ProcessComponents\t\t600\n"
1232 "InstallValidate\t\t700\n"
1233 "RemoveFiles\t\t800\n"
1234 "InstallFiles\t\t900\n"
1235 "RegisterProduct\t\t1000\n"
1236 "PublishFeatures\t\t1100\n"
1237 "PublishProduct\t\t1200\n"
1238 "InstallFinalize\t\t1300\n";
1240 typedef struct _msi_table
1242 const CHAR *filename;
1247 #define ADD_TABLE(x) {#x".idt", x##_dat, sizeof(x##_dat)}
1249 static const msi_table tables[] =
1251 ADD_TABLE(component),
1252 ADD_TABLE(directory),
1254 ADD_TABLE(feature_comp),
1256 ADD_TABLE(install_exec_seq),
1258 ADD_TABLE(property),
1259 ADD_TABLE(registry),
1260 ADD_TABLE(service_install),
1261 ADD_TABLE(service_control)
1264 static const msi_table sc_tables[] =
1266 ADD_TABLE(component),
1267 ADD_TABLE(directory),
1269 ADD_TABLE(feature_comp),
1271 ADD_TABLE(install_exec_seq),
1273 ADD_TABLE(property),
1277 static const msi_table ps_tables[] =
1279 ADD_TABLE(component),
1280 ADD_TABLE(directory),
1282 ADD_TABLE(feature_comp),
1284 ADD_TABLE(install_exec_seq),
1286 ADD_TABLE(property),
1287 ADD_TABLE(condition)
1290 static const msi_table up_tables[] =
1292 ADD_TABLE(component),
1293 ADD_TABLE(directory),
1295 ADD_TABLE(feature_comp),
1297 ADD_TABLE(install_exec_seq),
1299 ADD_TABLE(up_property),
1300 ADD_TABLE(registry),
1301 ADD_TABLE(service_install),
1302 ADD_TABLE(service_control)
1305 static const msi_table up2_tables[] =
1307 ADD_TABLE(component),
1308 ADD_TABLE(directory),
1310 ADD_TABLE(feature_comp),
1312 ADD_TABLE(install_exec_seq),
1314 ADD_TABLE(up2_property),
1315 ADD_TABLE(registry),
1316 ADD_TABLE(service_install),
1317 ADD_TABLE(service_control)
1320 static const msi_table up3_tables[] =
1322 ADD_TABLE(component),
1323 ADD_TABLE(directory),
1325 ADD_TABLE(feature_comp),
1327 ADD_TABLE(install_exec_seq),
1329 ADD_TABLE(up3_property),
1330 ADD_TABLE(registry),
1331 ADD_TABLE(service_install),
1332 ADD_TABLE(service_control)
1335 static const msi_table up4_tables[] =
1337 ADD_TABLE(component),
1338 ADD_TABLE(directory),
1340 ADD_TABLE(feature_comp),
1342 ADD_TABLE(pp_install_exec_seq),
1344 ADD_TABLE(property),
1345 ADD_TABLE(registry),
1346 ADD_TABLE(service_install),
1347 ADD_TABLE(service_control)
1350 static const msi_table up5_tables[] =
1352 ADD_TABLE(component),
1353 ADD_TABLE(directory),
1355 ADD_TABLE(feature_comp),
1357 ADD_TABLE(pp_install_exec_seq),
1359 ADD_TABLE(up_property),
1360 ADD_TABLE(registry),
1361 ADD_TABLE(service_install),
1362 ADD_TABLE(service_control)
1365 static const msi_table up6_tables[] =
1367 ADD_TABLE(component),
1368 ADD_TABLE(directory),
1370 ADD_TABLE(feature_comp),
1372 ADD_TABLE(pp_install_exec_seq),
1374 ADD_TABLE(up2_property),
1375 ADD_TABLE(registry),
1376 ADD_TABLE(service_install),
1377 ADD_TABLE(service_control)
1380 static const msi_table up7_tables[] =
1382 ADD_TABLE(component),
1383 ADD_TABLE(directory),
1385 ADD_TABLE(feature_comp),
1387 ADD_TABLE(pp_install_exec_seq),
1389 ADD_TABLE(up3_property),
1390 ADD_TABLE(registry),
1391 ADD_TABLE(service_install),
1392 ADD_TABLE(service_control)
1395 static const msi_table cc_tables[] =
1397 ADD_TABLE(cc_component),
1398 ADD_TABLE(directory),
1399 ADD_TABLE(cc_feature),
1400 ADD_TABLE(cc_feature_comp),
1402 ADD_TABLE(install_exec_seq),
1403 ADD_TABLE(cc_media),
1404 ADD_TABLE(property),
1407 static const msi_table cc2_tables[] =
1409 ADD_TABLE(cc2_component),
1410 ADD_TABLE(directory),
1411 ADD_TABLE(cc_feature),
1412 ADD_TABLE(cc_feature_comp),
1413 ADD_TABLE(cc2_file),
1414 ADD_TABLE(install_exec_seq),
1415 ADD_TABLE(cc_media),
1416 ADD_TABLE(property),
1419 static const msi_table co_tables[] =
1421 ADD_TABLE(cc_component),
1422 ADD_TABLE(directory),
1423 ADD_TABLE(cc_feature),
1424 ADD_TABLE(cc_feature_comp),
1426 ADD_TABLE(install_exec_seq),
1427 ADD_TABLE(co_media),
1428 ADD_TABLE(property),
1431 static const msi_table co2_tables[] =
1433 ADD_TABLE(cc_component),
1434 ADD_TABLE(directory),
1435 ADD_TABLE(cc_feature),
1436 ADD_TABLE(cc_feature_comp),
1438 ADD_TABLE(install_exec_seq),
1439 ADD_TABLE(co2_media),
1440 ADD_TABLE(property),
1443 static const msi_table mm_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(mm_media),
1452 ADD_TABLE(property),
1455 static const msi_table ss_tables[] =
1457 ADD_TABLE(cc_component),
1458 ADD_TABLE(directory),
1459 ADD_TABLE(cc_feature),
1460 ADD_TABLE(cc_feature_comp),
1462 ADD_TABLE(install_exec_seq),
1463 ADD_TABLE(ss_media),
1464 ADD_TABLE(property),
1467 static const msi_table ui_tables[] =
1469 ADD_TABLE(ui_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(ui_install_ui_seq),
1476 ADD_TABLE(ui_custom_action),
1477 ADD_TABLE(cc_media),
1478 ADD_TABLE(property),
1481 static const msi_table rof_tables[] =
1483 ADD_TABLE(rof_component),
1484 ADD_TABLE(directory),
1485 ADD_TABLE(rof_feature),
1486 ADD_TABLE(rof_feature_comp),
1487 ADD_TABLE(rof_file),
1488 ADD_TABLE(install_exec_seq),
1489 ADD_TABLE(rof_media),
1490 ADD_TABLE(property),
1493 static const msi_table rofc_tables[] =
1495 ADD_TABLE(rof_component),
1496 ADD_TABLE(directory),
1497 ADD_TABLE(rof_feature),
1498 ADD_TABLE(rof_feature_comp),
1499 ADD_TABLE(rofc_file),
1500 ADD_TABLE(install_exec_seq),
1501 ADD_TABLE(rofc_media),
1502 ADD_TABLE(property),
1505 static const msi_table sdp_tables[] =
1507 ADD_TABLE(rof_component),
1508 ADD_TABLE(directory),
1509 ADD_TABLE(rof_feature),
1510 ADD_TABLE(rof_feature_comp),
1511 ADD_TABLE(rof_file),
1512 ADD_TABLE(sdp_install_exec_seq),
1513 ADD_TABLE(sdp_custom_action),
1514 ADD_TABLE(rof_media),
1515 ADD_TABLE(property),
1518 static const msi_table cie_tables[] =
1520 ADD_TABLE(cie_component),
1521 ADD_TABLE(directory),
1522 ADD_TABLE(cc_feature),
1523 ADD_TABLE(cie_feature_comp),
1524 ADD_TABLE(cie_file),
1525 ADD_TABLE(install_exec_seq),
1526 ADD_TABLE(cie_media),
1527 ADD_TABLE(property),
1530 static const msi_table ci_tables[] =
1532 ADD_TABLE(ci_component),
1533 ADD_TABLE(directory),
1534 ADD_TABLE(rof_feature),
1535 ADD_TABLE(rof_feature_comp),
1536 ADD_TABLE(rof_file),
1537 ADD_TABLE(ci_install_exec_seq),
1538 ADD_TABLE(rof_media),
1539 ADD_TABLE(property),
1540 ADD_TABLE(ci_custom_action),
1543 static const msi_table ci2_tables[] =
1545 ADD_TABLE(ci2_component),
1546 ADD_TABLE(directory),
1547 ADD_TABLE(rof_feature),
1548 ADD_TABLE(ci2_feature_comp),
1549 ADD_TABLE(ci2_file),
1550 ADD_TABLE(install_exec_seq),
1551 ADD_TABLE(rof_media),
1552 ADD_TABLE(property),
1555 static const msi_table spf_tables[] =
1557 ADD_TABLE(ci_component),
1558 ADD_TABLE(directory),
1559 ADD_TABLE(rof_feature),
1560 ADD_TABLE(rof_feature_comp),
1561 ADD_TABLE(rof_file),
1562 ADD_TABLE(spf_install_exec_seq),
1563 ADD_TABLE(rof_media),
1564 ADD_TABLE(property),
1565 ADD_TABLE(spf_custom_action),
1566 ADD_TABLE(spf_install_ui_seq),
1569 static const msi_table lus0_tables[] =
1571 ADD_TABLE(ci_component),
1572 ADD_TABLE(directory),
1573 ADD_TABLE(rof_feature),
1574 ADD_TABLE(rof_feature_comp),
1575 ADD_TABLE(rof_file),
1576 ADD_TABLE(pp_install_exec_seq),
1577 ADD_TABLE(rof_media),
1578 ADD_TABLE(property),
1581 static const msi_table lus1_tables[] =
1583 ADD_TABLE(ci_component),
1584 ADD_TABLE(directory),
1585 ADD_TABLE(rof_feature),
1586 ADD_TABLE(rof_feature_comp),
1587 ADD_TABLE(rof_file),
1588 ADD_TABLE(pp_install_exec_seq),
1589 ADD_TABLE(rofc_media),
1590 ADD_TABLE(property),
1593 static const msi_table lus2_tables[] =
1595 ADD_TABLE(ci_component),
1596 ADD_TABLE(directory),
1597 ADD_TABLE(rof_feature),
1598 ADD_TABLE(rof_feature_comp),
1599 ADD_TABLE(rof_file),
1600 ADD_TABLE(pp_install_exec_seq),
1601 ADD_TABLE(lus2_media),
1602 ADD_TABLE(property),
1605 static const msi_table tp_tables[] =
1607 ADD_TABLE(tp_component),
1608 ADD_TABLE(directory),
1609 ADD_TABLE(rof_feature),
1610 ADD_TABLE(ci2_feature_comp),
1611 ADD_TABLE(ci2_file),
1612 ADD_TABLE(install_exec_seq),
1613 ADD_TABLE(rof_media),
1614 ADD_TABLE(property),
1617 static const msi_table cwd_tables[] =
1619 ADD_TABLE(cwd_component),
1620 ADD_TABLE(directory),
1621 ADD_TABLE(rof_feature),
1622 ADD_TABLE(ci2_feature_comp),
1623 ADD_TABLE(ci2_file),
1624 ADD_TABLE(install_exec_seq),
1625 ADD_TABLE(rof_media),
1626 ADD_TABLE(property),
1629 static const msi_table adm_tables[] =
1631 ADD_TABLE(adm_component),
1632 ADD_TABLE(directory),
1633 ADD_TABLE(rof_feature),
1634 ADD_TABLE(ci2_feature_comp),
1635 ADD_TABLE(ci2_file),
1636 ADD_TABLE(install_exec_seq),
1637 ADD_TABLE(rof_media),
1638 ADD_TABLE(property),
1639 ADD_TABLE(adm_custom_action),
1640 ADD_TABLE(adm_admin_exec_seq),
1643 static const msi_table amp_tables[] =
1645 ADD_TABLE(amp_component),
1646 ADD_TABLE(directory),
1647 ADD_TABLE(rof_feature),
1648 ADD_TABLE(ci2_feature_comp),
1649 ADD_TABLE(ci2_file),
1650 ADD_TABLE(install_exec_seq),
1651 ADD_TABLE(rof_media),
1652 ADD_TABLE(property),
1655 static const msi_table mc_tables[] =
1657 ADD_TABLE(mc_component),
1658 ADD_TABLE(directory),
1659 ADD_TABLE(cc_feature),
1660 ADD_TABLE(cie_feature_comp),
1662 ADD_TABLE(install_exec_seq),
1663 ADD_TABLE(mc_media),
1664 ADD_TABLE(property),
1665 ADD_TABLE(mc_file_hash),
1668 static const msi_table sf_tables[] =
1670 ADD_TABLE(wrv_component),
1671 ADD_TABLE(directory),
1672 ADD_TABLE(rof_feature),
1673 ADD_TABLE(ci2_feature_comp),
1674 ADD_TABLE(ci2_file),
1675 ADD_TABLE(install_exec_seq),
1676 ADD_TABLE(rof_media),
1677 ADD_TABLE(property),
1680 static const msi_table ca51_tables[] =
1682 ADD_TABLE(ca51_component),
1683 ADD_TABLE(directory),
1684 ADD_TABLE(rof_feature),
1685 ADD_TABLE(ci2_feature_comp),
1686 ADD_TABLE(ci2_file),
1687 ADD_TABLE(ca51_install_exec_seq),
1688 ADD_TABLE(rof_media),
1689 ADD_TABLE(property),
1690 ADD_TABLE(ca51_custom_action),
1693 static const msi_table is_tables[] =
1695 ADD_TABLE(is_component),
1696 ADD_TABLE(directory),
1697 ADD_TABLE(is_feature),
1698 ADD_TABLE(is_feature_comp),
1700 ADD_TABLE(install_exec_seq),
1701 ADD_TABLE(is_media),
1702 ADD_TABLE(property),
1705 static const msi_table sp_tables[] =
1707 ADD_TABLE(sp_component),
1708 ADD_TABLE(sp_directory),
1709 ADD_TABLE(rof_feature),
1710 ADD_TABLE(ci2_feature_comp),
1711 ADD_TABLE(ci2_file),
1712 ADD_TABLE(install_exec_seq),
1713 ADD_TABLE(rof_media),
1714 ADD_TABLE(property),
1717 static const msi_table mcp_tables[] =
1719 ADD_TABLE(mcp_component),
1720 ADD_TABLE(directory),
1721 ADD_TABLE(mcp_feature),
1722 ADD_TABLE(mcp_feature_comp),
1723 ADD_TABLE(rem_file),
1724 ADD_TABLE(rem_install_exec_seq),
1725 ADD_TABLE(rof_media),
1726 ADD_TABLE(property),
1729 static const msi_table mcomp_tables[] =
1731 ADD_TABLE(mcp_component),
1732 ADD_TABLE(directory),
1733 ADD_TABLE(mcp_feature),
1734 ADD_TABLE(mcp_feature_comp),
1735 ADD_TABLE(mcomp_file),
1736 ADD_TABLE(rem_install_exec_seq),
1737 ADD_TABLE(rof_media),
1738 ADD_TABLE(property),
1741 static const msi_table ai_tables[] =
1743 ADD_TABLE(component),
1744 ADD_TABLE(directory),
1746 ADD_TABLE(feature_comp),
1748 ADD_TABLE(install_exec_seq),
1753 static const msi_table pc_tables[] =
1755 ADD_TABLE(ca51_component),
1756 ADD_TABLE(directory),
1757 ADD_TABLE(rof_feature),
1758 ADD_TABLE(ci2_feature_comp),
1759 ADD_TABLE(ci2_file),
1760 ADD_TABLE(install_exec_seq),
1761 ADD_TABLE(rof_media),
1765 static const msi_table ip_tables[] =
1767 ADD_TABLE(component),
1768 ADD_TABLE(directory),
1770 ADD_TABLE(feature_comp),
1772 ADD_TABLE(ip_install_exec_seq),
1773 ADD_TABLE(ip_custom_action),
1778 static const msi_table aup_tables[] =
1780 ADD_TABLE(component),
1781 ADD_TABLE(directory),
1783 ADD_TABLE(feature_comp),
1785 ADD_TABLE(aup_install_exec_seq),
1786 ADD_TABLE(aup_custom_action),
1791 static const msi_table aup2_tables[] =
1793 ADD_TABLE(component),
1794 ADD_TABLE(directory),
1796 ADD_TABLE(feature_comp),
1798 ADD_TABLE(aup2_install_exec_seq),
1799 ADD_TABLE(aup_custom_action),
1801 ADD_TABLE(aup_property)
1804 static const msi_table aup3_tables[] =
1806 ADD_TABLE(component),
1807 ADD_TABLE(directory),
1809 ADD_TABLE(feature_comp),
1811 ADD_TABLE(aup2_install_exec_seq),
1812 ADD_TABLE(aup_custom_action),
1814 ADD_TABLE(aup2_property)
1817 static const msi_table aup4_tables[] =
1819 ADD_TABLE(component),
1820 ADD_TABLE(directory),
1822 ADD_TABLE(feature_comp),
1824 ADD_TABLE(aup3_install_exec_seq),
1825 ADD_TABLE(aup_custom_action),
1827 ADD_TABLE(aup2_property)
1830 static const msi_table fiu_tables[] =
1832 ADD_TABLE(rof_component),
1833 ADD_TABLE(directory),
1834 ADD_TABLE(rof_feature),
1835 ADD_TABLE(rof_feature_comp),
1836 ADD_TABLE(rof_file),
1837 ADD_TABLE(pp_install_exec_seq),
1838 ADD_TABLE(rof_media),
1839 ADD_TABLE(property),
1842 static const msi_table fiuc_tables[] =
1844 ADD_TABLE(rof_component),
1845 ADD_TABLE(directory),
1846 ADD_TABLE(rof_feature),
1847 ADD_TABLE(rof_feature_comp),
1848 ADD_TABLE(rofc_file),
1849 ADD_TABLE(pp_install_exec_seq),
1850 ADD_TABLE(rofc_media),
1851 ADD_TABLE(property),
1854 static const msi_table sd_tables[] =
1856 ADD_TABLE(directory),
1857 ADD_TABLE(sd_component),
1858 ADD_TABLE(sd_feature),
1859 ADD_TABLE(sd_feature_comp),
1861 ADD_TABLE(sd_install_exec_seq),
1862 ADD_TABLE(sd_install_ui_seq),
1863 ADD_TABLE(sd_custom_action),
1868 static const msi_table fo_tables[] =
1870 ADD_TABLE(directory),
1872 ADD_TABLE(fo_component),
1873 ADD_TABLE(fo_feature),
1874 ADD_TABLE(fo_condition),
1875 ADD_TABLE(fo_feature_comp),
1876 ADD_TABLE(fo_custom_action),
1877 ADD_TABLE(fo_install_exec_seq),
1882 static const msi_table icon_base_tables[] =
1884 ADD_TABLE(ci_component),
1885 ADD_TABLE(directory),
1886 ADD_TABLE(rof_feature),
1887 ADD_TABLE(rof_feature_comp),
1888 ADD_TABLE(rof_file),
1889 ADD_TABLE(pp_install_exec_seq),
1890 ADD_TABLE(rof_media),
1891 ADD_TABLE(icon_property),
1894 static const msi_table pv_tables[] =
1896 ADD_TABLE(rof_component),
1897 ADD_TABLE(directory),
1898 ADD_TABLE(rof_feature),
1899 ADD_TABLE(rof_feature_comp),
1900 ADD_TABLE(rof_file),
1901 ADD_TABLE(pv_install_exec_seq),
1902 ADD_TABLE(rof_media),
1906 static const msi_table cl_tables[] =
1908 ADD_TABLE(component),
1909 ADD_TABLE(directory),
1911 ADD_TABLE(feature_comp),
1913 ADD_TABLE(cl_custom_action),
1914 ADD_TABLE(cl_install_exec_seq),
1919 static const msi_table uc_tables[] =
1921 ADD_TABLE(directory),
1922 ADD_TABLE(uc_component),
1923 ADD_TABLE(uc_feature),
1924 ADD_TABLE(uc_feature_comp),
1926 ADD_TABLE(uc_install_exec_seq),
1928 ADD_TABLE(uc_property)
1931 /* cabinet definitions */
1933 /* make the max size large so there is only one cab file */
1934 #define MEDIA_SIZE 0x7FFFFFFF
1935 #define FOLDER_THRESHOLD 900000
1937 /* the FCI callbacks */
1939 static void * CDECL mem_alloc(ULONG cb)
1941 return HeapAlloc(GetProcessHeap(), 0, cb);
1944 static void CDECL mem_free(void *memory)
1946 HeapFree(GetProcessHeap(), 0, memory);
1949 static BOOL CDECL get_next_cabinet(PCCAB pccab, ULONG cbPrevCab, void *pv)
1951 sprintf(pccab->szCab, pv, pccab->iCab);
1955 static LONG CDECL progress(UINT typeStatus, ULONG cb1, ULONG cb2, void *pv)
1960 static int CDECL file_placed(PCCAB pccab, char *pszFile, LONG cbFile,
1961 BOOL fContinuation, void *pv)
1966 static INT_PTR CDECL fci_open(char *pszFile, int oflag, int pmode, int *err, void *pv)
1970 DWORD dwShareMode = 0;
1971 DWORD dwCreateDisposition = OPEN_EXISTING;
1973 dwAccess = GENERIC_READ | GENERIC_WRITE;
1974 /* FILE_SHARE_DELETE is not supported by Windows Me/98/95 */
1975 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
1977 if (GetFileAttributesA(pszFile) != INVALID_FILE_ATTRIBUTES)
1978 dwCreateDisposition = OPEN_EXISTING;
1980 dwCreateDisposition = CREATE_NEW;
1982 handle = CreateFileA(pszFile, dwAccess, dwShareMode, NULL,
1983 dwCreateDisposition, 0, NULL);
1985 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszFile);
1987 return (INT_PTR)handle;
1990 static UINT CDECL fci_read(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
1992 HANDLE handle = (HANDLE)hf;
1996 res = ReadFile(handle, memory, cb, &dwRead, NULL);
1997 ok(res, "Failed to ReadFile\n");
2002 static UINT CDECL fci_write(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
2004 HANDLE handle = (HANDLE)hf;
2008 res = WriteFile(handle, memory, cb, &dwWritten, NULL);
2009 ok(res, "Failed to WriteFile\n");
2014 static int CDECL fci_close(INT_PTR hf, int *err, void *pv)
2016 HANDLE handle = (HANDLE)hf;
2017 ok(CloseHandle(handle), "Failed to CloseHandle\n");
2022 static LONG CDECL fci_seek(INT_PTR hf, LONG dist, int seektype, int *err, void *pv)
2024 HANDLE handle = (HANDLE)hf;
2027 ret = SetFilePointer(handle, dist, NULL, seektype);
2028 ok(ret != INVALID_SET_FILE_POINTER, "Failed to SetFilePointer\n");
2033 static int CDECL fci_delete(char *pszFile, int *err, void *pv)
2035 BOOL ret = DeleteFileA(pszFile);
2036 ok(ret, "Failed to DeleteFile %s\n", pszFile);
2041 static void init_functionpointers(void)
2043 HMODULE hmsi = GetModuleHandleA("msi.dll");
2044 HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
2045 HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
2047 #define GET_PROC(mod, func) \
2048 p ## func = (void*)GetProcAddress(mod, #func); \
2050 trace("GetProcAddress(%s) failed\n", #func);
2052 GET_PROC(hmsi, MsiQueryComponentStateA);
2053 GET_PROC(hmsi, MsiSetExternalUIRecord);
2054 GET_PROC(hmsi, MsiSourceListEnumSourcesA);
2055 GET_PROC(hmsi, MsiSourceListGetInfoA);
2056 GET_PROC(hmsi, MsiGetComponentPathExA);
2058 GET_PROC(hadvapi32, ConvertSidToStringSidA);
2059 GET_PROC(hadvapi32, GetTokenInformation);
2060 GET_PROC(hadvapi32, OpenProcessToken);
2061 GET_PROC(hadvapi32, RegDeleteKeyExA)
2062 GET_PROC(hkernel32, IsWow64Process)
2064 hsrclient = LoadLibraryA("srclient.dll");
2065 GET_PROC(hsrclient, SRRemoveRestorePoint);
2066 GET_PROC(hsrclient, SRSetRestorePointA);
2071 static BOOL is_process_limited(void)
2075 if (!pOpenProcessToken || !pGetTokenInformation) return FALSE;
2077 if (pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token))
2080 TOKEN_ELEVATION_TYPE type = TokenElevationTypeDefault;
2083 ret = pGetTokenInformation(token, TokenElevationType, &type, sizeof(type), &size);
2085 return (ret && type == TokenElevationTypeLimited);
2090 static BOOL check_record(MSIHANDLE rec, UINT field, LPCSTR val)
2097 r = MsiRecordGetString(rec, field, buffer, &sz);
2098 return (r == ERROR_SUCCESS ) && !strcmp(val, buffer);
2101 static BOOL CDECL get_temp_file(char *pszTempName, int cbTempName, void *pv)
2105 tempname = HeapAlloc(GetProcessHeap(), 0, MAX_PATH);
2106 GetTempFileNameA(".", "xx", 0, tempname);
2108 if (tempname && (strlen(tempname) < (unsigned)cbTempName))
2110 lstrcpyA(pszTempName, tempname);
2111 HeapFree(GetProcessHeap(), 0, tempname);
2115 HeapFree(GetProcessHeap(), 0, tempname);
2120 static INT_PTR CDECL get_open_info(char *pszName, USHORT *pdate, USHORT *ptime,
2121 USHORT *pattribs, int *err, void *pv)
2123 BY_HANDLE_FILE_INFORMATION finfo;
2129 handle = CreateFile(pszName, GENERIC_READ, FILE_SHARE_READ, NULL,
2130 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
2132 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszName);
2134 res = GetFileInformationByHandle(handle, &finfo);
2135 ok(res, "Expected GetFileInformationByHandle to succeed\n");
2137 FileTimeToLocalFileTime(&finfo.ftLastWriteTime, &filetime);
2138 FileTimeToDosDateTime(&filetime, pdate, ptime);
2140 attrs = GetFileAttributes(pszName);
2141 ok(attrs != INVALID_FILE_ATTRIBUTES, "Failed to GetFileAttributes\n");
2143 return (INT_PTR)handle;
2146 static BOOL add_file(HFCI hfci, const char *file, TCOMP compress)
2148 char path[MAX_PATH];
2149 char filename[MAX_PATH];
2151 lstrcpyA(path, CURR_DIR);
2152 lstrcatA(path, "\\");
2153 lstrcatA(path, file);
2155 lstrcpyA(filename, file);
2157 return FCIAddFile(hfci, path, filename, FALSE, get_next_cabinet,
2158 progress, get_open_info, compress);
2161 static void set_cab_parameters(PCCAB pCabParams, const CHAR *name, DWORD max_size)
2163 ZeroMemory(pCabParams, sizeof(CCAB));
2165 pCabParams->cb = max_size;
2166 pCabParams->cbFolderThresh = FOLDER_THRESHOLD;
2167 pCabParams->setID = 0xbeef;
2168 pCabParams->iCab = 1;
2169 lstrcpyA(pCabParams->szCabPath, CURR_DIR);
2170 lstrcatA(pCabParams->szCabPath, "\\");
2171 lstrcpyA(pCabParams->szCab, name);
2174 static void create_cab_file(const CHAR *name, DWORD max_size, const CHAR *files)
2182 set_cab_parameters(&cabParams, name, max_size);
2184 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open,
2185 fci_read, fci_write, fci_close, fci_seek, fci_delete,
2186 get_temp_file, &cabParams, NULL);
2188 ok(hfci != NULL, "Failed to create an FCI context\n");
2193 res = add_file(hfci, ptr, tcompTYPE_MSZIP);
2194 ok(res, "Failed to add file: %s\n", ptr);
2195 ptr += lstrlen(ptr) + 1;
2198 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress);
2199 ok(res, "Failed to flush the cabinet\n");
2201 res = FCIDestroy(hfci);
2202 ok(res, "Failed to destroy the cabinet\n");
2205 static BOOL get_user_dirs(void)
2210 if(RegOpenKey(HKEY_CURRENT_USER,
2211 "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
2216 if(RegQueryValueExA(hkey, "AppData", 0, &type, (LPBYTE)APP_DATA_DIR, &size)){
2225 static BOOL get_system_dirs(void)
2230 if (RegOpenKey(HKEY_LOCAL_MACHINE,
2231 "Software\\Microsoft\\Windows\\CurrentVersion", &hkey))
2235 if (RegQueryValueExA(hkey, "ProgramFilesDir (x86)", 0, &type, (LPBYTE)PROG_FILES_DIR, &size) &&
2236 RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR, &size)) {
2242 if (RegQueryValueExA(hkey, "CommonFilesDir (x86)", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size) &&
2243 RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size)) {
2249 if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR_NATIVE, &size)) {
2256 if(!GetWindowsDirectoryA(WINDOWS_DIR, MAX_PATH))
2262 static void create_file_data(LPCSTR name, LPCSTR data, DWORD size)
2267 file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
2268 if (file == INVALID_HANDLE_VALUE)
2271 WriteFile(file, data, strlen(data), &written, NULL);
2275 SetFilePointer(file, size, NULL, FILE_BEGIN);
2282 #define create_file(name, size) create_file_data(name, name, size)
2284 static void create_test_files(void)
2286 CreateDirectoryA("msitest", NULL);
2287 create_file("msitest\\one.txt", 100);
2288 CreateDirectoryA("msitest\\first", NULL);
2289 create_file("msitest\\first\\two.txt", 100);
2290 CreateDirectoryA("msitest\\second", NULL);
2291 create_file("msitest\\second\\three.txt", 100);
2293 create_file("four.txt", 100);
2294 create_file("five.txt", 100);
2295 create_cab_file("msitest.cab", MEDIA_SIZE, "four.txt\0five.txt\0");
2297 create_file("msitest\\filename", 100);
2298 create_file("msitest\\service.exe", 100);
2300 DeleteFileA("four.txt");
2301 DeleteFileA("five.txt");
2304 static BOOL delete_pf(const CHAR *rel_path, BOOL is_file)
2306 CHAR path[MAX_PATH];
2308 lstrcpyA(path, PROG_FILES_DIR);
2309 lstrcatA(path, "\\");
2310 lstrcatA(path, rel_path);
2313 return DeleteFileA(path);
2315 return RemoveDirectoryA(path);
2318 static BOOL delete_pf_native(const CHAR *rel_path, BOOL is_file)
2320 CHAR path[MAX_PATH];
2322 lstrcpyA(path, PROG_FILES_DIR_NATIVE);
2323 lstrcatA(path, "\\");
2324 lstrcatA(path, rel_path);
2327 return DeleteFileA(path);
2329 return RemoveDirectoryA(path);
2332 static BOOL delete_cf(const CHAR *rel_path, BOOL is_file)
2334 CHAR path[MAX_PATH];
2336 lstrcpyA(path, COMMON_FILES_DIR);
2337 lstrcatA(path, "\\");
2338 lstrcatA(path, rel_path);
2341 return DeleteFileA(path);
2343 return RemoveDirectoryA(path);
2346 static BOOL compare_pf_data(const char *filename, const char *data, DWORD size)
2351 char *buffer, path[MAX_PATH];
2353 lstrcpyA(path, PROG_FILES_DIR);
2354 lstrcatA(path, "\\");
2355 lstrcatA(path, filename);
2357 handle = CreateFileA(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
2358 buffer = HeapAlloc(GetProcessHeap(), 0, size);
2361 ReadFile(handle, buffer, size, &read, NULL);
2362 if (read == size && !memcmp(data, buffer, size)) ret = TRUE;
2363 HeapFree(GetProcessHeap(), 0, buffer);
2365 CloseHandle(handle);
2369 static void delete_test_files(void)
2371 DeleteFileA("msitest.msi");
2372 DeleteFileA("msitest.cab");
2373 DeleteFileA("msitest\\second\\three.txt");
2374 DeleteFileA("msitest\\first\\two.txt");
2375 DeleteFileA("msitest\\one.txt");
2376 DeleteFileA("msitest\\service.exe");
2377 DeleteFileA("msitest\\filename");
2378 RemoveDirectoryA("msitest\\second");
2379 RemoveDirectoryA("msitest\\first");
2380 RemoveDirectoryA("msitest");
2383 static void write_file(const CHAR *filename, const char *data, int data_size)
2387 HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL,
2388 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2390 WriteFile(hf, data, data_size, &size, NULL);
2394 static void write_msi_summary_info(MSIHANDLE db, INT version, INT wordcount, const char *template)
2399 r = MsiGetSummaryInformationA(db, NULL, 5, &summary);
2400 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2402 r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, template);
2403 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2405 r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL,
2406 "{004757CA-5092-49c2-AD20-28E1CE0DF5F2}");
2407 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2409 r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, version, NULL, NULL);
2410 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2412 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, wordcount, NULL, NULL);
2413 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2415 r = MsiSummaryInfoSetPropertyA(summary, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
2416 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2418 /* write the summary changes back to the stream */
2419 r = MsiSummaryInfoPersist(summary);
2420 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2422 MsiCloseHandle(summary);
2425 #define create_database(name, tables, num_tables) \
2426 create_database_wordcount(name, tables, num_tables, 100, 0, ";1033");
2428 #define create_database_template(name, tables, num_tables, version, template) \
2429 create_database_wordcount(name, tables, num_tables, version, 0, template);
2431 static void create_database_wordcount(const CHAR *name, const msi_table *tables,
2432 int num_tables, INT version, INT wordcount,
2433 const char *template)
2439 r = MsiOpenDatabaseA(name, MSIDBOPEN_CREATE, &db);
2440 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2442 /* import the tables into the database */
2443 for (j = 0; j < num_tables; j++)
2445 const msi_table *table = &tables[j];
2447 write_file(table->filename, table->data, (table->size - 1) * sizeof(char));
2449 r = MsiDatabaseImportA(db, CURR_DIR, table->filename);
2450 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2452 DeleteFileA(table->filename);
2455 write_msi_summary_info(db, version, wordcount, template);
2457 r = MsiDatabaseCommit(db);
2458 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2463 static void check_service_is_installed(void)
2465 SC_HANDLE scm, service;
2468 scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
2469 ok(scm != NULL, "Failed to open the SC Manager\n");
2471 service = OpenService(scm, "TestService", SC_MANAGER_ALL_ACCESS);
2472 ok(service != NULL, "Failed to open TestService\n");
2474 res = DeleteService(service);
2475 ok(res, "Failed to delete TestService\n");
2477 CloseServiceHandle(service);
2478 CloseServiceHandle(scm);
2481 static BOOL notify_system_change(DWORD event_type, STATEMGRSTATUS *status)
2483 RESTOREPOINTINFOA spec;
2485 spec.dwEventType = event_type;
2486 spec.dwRestorePtType = APPLICATION_INSTALL;
2487 spec.llSequenceNumber = status->llSequenceNumber;
2488 lstrcpyA(spec.szDescription, "msitest restore point");
2490 return pSRSetRestorePointA(&spec, status);
2493 static void remove_restore_point(DWORD seq_number)
2497 res = pSRRemoveRestorePoint(seq_number);
2498 if (res != ERROR_SUCCESS)
2499 trace("Failed to remove the restore point : %08x\n", res);
2502 static LONG delete_key( HKEY key, LPCSTR subkey, REGSAM access )
2504 if (pRegDeleteKeyExA)
2505 return pRegDeleteKeyExA( key, subkey, access, 0 );
2506 return RegDeleteKeyA( key, subkey );
2509 static void test_MsiInstallProduct(void)
2512 CHAR path[MAX_PATH];
2515 DWORD num, size, type;
2516 REGSAM access = KEY_ALL_ACCESS;
2518 if (is_process_limited())
2520 skip("process is limited\n");
2525 access |= KEY_WOW64_64KEY;
2527 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
2529 /* szPackagePath is NULL */
2530 r = MsiInstallProductA(NULL, "INSTALL=ALL");
2531 ok(r == ERROR_INVALID_PARAMETER,
2532 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
2534 /* both szPackagePath and szCommandLine are NULL */
2535 r = MsiInstallProductA(NULL, NULL);
2536 ok(r == ERROR_INVALID_PARAMETER,
2537 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
2539 /* szPackagePath is empty */
2540 r = MsiInstallProductA("", "INSTALL=ALL");
2541 ok(r == ERROR_PATH_NOT_FOUND,
2542 "Expected ERROR_PATH_NOT_FOUND, got %d\n", r);
2544 create_test_files();
2545 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
2547 /* install, don't publish */
2548 r = MsiInstallProductA(msifile, NULL);
2549 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
2551 skip("Not enough rights to perform tests\n");
2554 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2556 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2557 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
2558 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2559 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
2560 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2561 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
2562 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2563 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
2564 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2565 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2566 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
2567 ok(delete_pf("msitest", FALSE), "File not installed\n");
2569 res = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", 0, access, &hkey);
2570 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2574 res = RegQueryValueExA(hkey, "Name", NULL, &type, (LPBYTE)path, &size);
2575 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2576 ok(!lstrcmpA(path, "imaname"), "Expected imaname, got %s\n", path);
2580 res = RegQueryValueExA(hkey, "blah", NULL, &type, (LPBYTE)path, &size);
2581 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2585 res = RegQueryValueExA(hkey, "number", NULL, &type, (LPBYTE)&num, &size);
2586 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2587 ok(num == 314, "Expected 314, got %d\n", num);
2591 res = RegQueryValueExA(hkey, "OrderTestName", NULL, &type, (LPBYTE)path, &size);
2592 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2593 ok(!lstrcmpA(path, "OrderTestValue"), "Expected OrderTestValue, got %s\n", path);
2595 check_service_is_installed();
2597 delete_key(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", access);
2599 /* not published, reinstall */
2600 r = MsiInstallProductA(msifile, NULL);
2601 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2603 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2604 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
2605 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2606 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
2607 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2608 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
2609 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2610 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
2611 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2612 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2613 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
2614 ok(delete_pf("msitest", FALSE), "File not installed\n");
2616 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2617 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2618 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
2620 create_database(msifile, up_tables, sizeof(up_tables) / sizeof(msi_table));
2622 /* not published, RemovePreviousVersions set */
2623 r = MsiInstallProductA(msifile, NULL);
2624 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2626 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2627 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
2628 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2629 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
2630 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2631 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
2632 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2633 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
2634 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2635 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2636 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
2637 ok(delete_pf("msitest", FALSE), "File not installed\n");
2639 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2640 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2641 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
2643 create_database(msifile, up2_tables, sizeof(up2_tables) / sizeof(msi_table));
2645 /* not published, version number bumped */
2646 r = MsiInstallProductA(msifile, NULL);
2647 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2649 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2650 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
2651 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2652 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
2653 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2654 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
2655 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2656 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
2657 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2658 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2659 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
2660 ok(delete_pf("msitest", FALSE), "File not installed\n");
2662 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2663 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2664 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
2666 create_database(msifile, up3_tables, sizeof(up3_tables) / sizeof(msi_table));
2668 /* not published, RemovePreviousVersions set and version number bumped */
2669 r = MsiInstallProductA(msifile, NULL);
2670 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2672 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2673 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
2674 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2675 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
2676 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2677 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
2678 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2679 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
2680 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2681 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2682 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
2683 ok(delete_pf("msitest", FALSE), "File not installed\n");
2685 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2686 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2687 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest");
2689 create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table));
2691 /* install, publish product */
2692 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
2693 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2695 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2696 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
2697 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2698 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
2699 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2700 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
2701 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2702 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
2703 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2704 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2705 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
2706 ok(delete_pf("msitest", FALSE), "File not installed\n");
2708 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2709 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2711 create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table));
2713 /* published, reinstall */
2714 r = MsiInstallProductA(msifile, NULL);
2715 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2717 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2718 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
2719 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2720 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
2721 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2722 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
2723 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2724 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
2725 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2726 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2727 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
2728 ok(delete_pf("msitest", FALSE), "File not installed\n");
2730 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2731 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2733 create_database(msifile, up5_tables, sizeof(up5_tables) / sizeof(msi_table));
2735 /* published product, RemovePreviousVersions set */
2736 r = MsiInstallProductA(msifile, NULL);
2737 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2739 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2740 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
2741 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2742 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
2743 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2744 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
2745 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2746 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
2747 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2748 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2749 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
2750 ok(delete_pf("msitest", FALSE), "File not installed\n");
2752 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2753 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2755 create_database(msifile, up6_tables, sizeof(up6_tables) / sizeof(msi_table));
2757 /* published product, version number bumped */
2758 r = MsiInstallProductA(msifile, NULL);
2759 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2761 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2762 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
2763 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2764 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
2765 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2766 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
2767 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2768 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
2769 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2770 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2771 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
2772 ok(delete_pf("msitest", FALSE), "File not installed\n");
2774 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2775 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2777 create_database(msifile, up7_tables, sizeof(up7_tables) / sizeof(msi_table));
2779 /* published product, RemovePreviousVersions set and version number bumped */
2780 r = MsiInstallProductA(msifile, NULL);
2781 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2783 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
2784 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
2785 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
2786 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
2787 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
2788 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
2789 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
2790 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
2791 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
2792 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
2793 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
2794 ok(delete_pf("msitest", FALSE), "File not installed\n");
2796 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey);
2797 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2799 r = MsiInstallProductA(msifile, "REMOVE=ALL");
2800 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2803 delete_test_files();
2804 DeleteFileA(msifile);
2807 static void test_MsiSetComponentState(void)
2809 INSTALLSTATE installed, action;
2811 char path[MAX_PATH];
2814 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
2818 lstrcpy(path, CURR_DIR);
2819 lstrcat(path, "\\");
2820 lstrcat(path, msifile);
2822 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
2824 r = MsiOpenPackage(path, &package);
2825 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
2827 skip("Not enough rights to perform tests\n");
2830 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2832 r = MsiDoAction(package, "CostInitialize");
2833 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2835 r = MsiDoAction(package, "FileCost");
2836 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2838 r = MsiDoAction(package, "CostFinalize");
2839 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2841 r = MsiGetComponentState(package, "dangler", &installed, &action);
2842 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2843 ok(installed == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", installed);
2844 ok(action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2846 r = MsiSetComponentState(package, "dangler", INSTALLSTATE_SOURCE);
2847 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2849 MsiCloseHandle(package);
2853 DeleteFileA(msifile);
2856 static void test_packagecoltypes(void)
2858 MSIHANDLE hdb, view, rec;
2859 char path[MAX_PATH];
2863 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
2867 lstrcpy(path, CURR_DIR);
2868 lstrcat(path, "\\");
2869 lstrcat(path, msifile);
2871 r = MsiOpenDatabase(path, MSIDBOPEN_READONLY, &hdb);
2872 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2874 query = "SELECT * FROM `Media`";
2875 r = MsiDatabaseOpenView( hdb, query, &view );
2876 ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
2878 r = MsiViewGetColumnInfo( view, MSICOLINFO_NAMES, &rec );
2879 count = MsiRecordGetFieldCount( rec );
2880 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n");
2881 ok(count == 6, "Expected 6, got %d\n", count);
2882 ok(check_record(rec, 1, "DiskId"), "wrong column label\n");
2883 ok(check_record(rec, 2, "LastSequence"), "wrong column label\n");
2884 ok(check_record(rec, 3, "DiskPrompt"), "wrong column label\n");
2885 ok(check_record(rec, 4, "Cabinet"), "wrong column label\n");
2886 ok(check_record(rec, 5, "VolumeLabel"), "wrong column label\n");
2887 ok(check_record(rec, 6, "Source"), "wrong column label\n");
2888 MsiCloseHandle(rec);
2890 r = MsiViewGetColumnInfo( view, MSICOLINFO_TYPES, &rec );
2891 count = MsiRecordGetFieldCount( rec );
2892 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n");
2893 ok(count == 6, "Expected 6, got %d\n", count);
2894 ok(check_record(rec, 1, "i2"), "wrong column label\n");
2895 ok(check_record(rec, 2, "i4"), "wrong column label\n");
2896 ok(check_record(rec, 3, "L64"), "wrong column label\n");
2897 ok(check_record(rec, 4, "S255"), "wrong column label\n");
2898 ok(check_record(rec, 5, "S32"), "wrong column label\n");
2899 ok(check_record(rec, 6, "S72"), "wrong column label\n");
2901 MsiCloseHandle(rec);
2902 MsiCloseHandle(view);
2903 MsiCloseHandle(hdb);
2906 DeleteFile(msifile);
2909 static void create_cc_test_files(void)
2914 static CHAR cab_context[] = "test%d.cab";
2917 create_file("maximus", 500);
2918 create_file("augustus", 50000);
2919 create_file("tiberius", 500);
2920 create_file("caesar", 500);
2922 set_cab_parameters(&cabParams, "test1.cab", 40000);
2924 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open,
2925 fci_read, fci_write, fci_close, fci_seek, fci_delete,
2926 get_temp_file, &cabParams, cab_context);
2927 ok(hfci != NULL, "Failed to create an FCI context\n");
2929 res = add_file(hfci, "maximus", tcompTYPE_NONE);
2930 ok(res, "Failed to add file maximus\n");
2932 res = add_file(hfci, "augustus", tcompTYPE_NONE);
2933 ok(res, "Failed to add file augustus\n");
2935 res = add_file(hfci, "tiberius", tcompTYPE_NONE);
2936 ok(res, "Failed to add file tiberius\n");
2938 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress);
2939 ok(res, "Failed to flush the cabinet\n");
2941 res = FCIDestroy(hfci);
2942 ok(res, "Failed to destroy the cabinet\n");
2944 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
2946 DeleteFile("maximus");
2947 DeleteFile("augustus");
2948 DeleteFile("tiberius");
2949 DeleteFile("caesar");
2952 static void delete_cab_files(void)
2954 SHFILEOPSTRUCT shfl;
2955 CHAR path[MAX_PATH+10];
2957 lstrcpyA(path, CURR_DIR);
2958 lstrcatA(path, "\\*.cab");
2959 path[strlen(path) + 1] = '\0';
2962 shfl.wFunc = FO_DELETE;
2965 shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT;
2967 SHFileOperation(&shfl);
2970 static void test_continuouscabs(void)
2974 if (is_process_limited())
2976 skip("process is limited\n");
2980 create_cc_test_files();
2981 create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table));
2983 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
2985 r = MsiInstallProductA(msifile, NULL);
2986 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2987 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
2988 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
2989 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2990 ok(delete_pf("msitest", FALSE), "File not installed\n");
2993 DeleteFile(msifile);
2995 create_cc_test_files();
2996 create_database(msifile, cc2_tables, sizeof(cc2_tables) / sizeof(msi_table));
2998 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3000 r = MsiInstallProductA(msifile, NULL);
3001 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3003 skip("Not enough rights to perform tests\n");
3006 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3007 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3008 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3009 ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n");
3010 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3011 ok(delete_pf("msitest", FALSE), "File not installed\n");
3015 DeleteFile(msifile);
3018 static void test_caborder(void)
3022 create_file("imperator", 100);
3023 create_file("maximus", 500);
3024 create_file("augustus", 50000);
3025 create_file("caesar", 500);
3027 create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table));
3029 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3031 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
3032 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0");
3033 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
3035 r = MsiInstallProductA(msifile, NULL);
3036 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3038 skip("Not enough rights to perform tests\n");
3041 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
3042 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
3043 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
3046 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
3047 ok(!delete_pf("msitest", FALSE), "File is installed\n");
3052 create_cab_file("test1.cab", MEDIA_SIZE, "imperator\0");
3053 create_cab_file("test2.cab", MEDIA_SIZE, "maximus\0augustus\0");
3054 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
3056 r = MsiInstallProductA(msifile, NULL);
3057 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
3058 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
3059 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
3060 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
3061 ok(!delete_pf("msitest", FALSE), "File is installed\n");
3064 DeleteFile(msifile);
3066 create_cc_test_files();
3067 create_database(msifile, co_tables, sizeof(co_tables) / sizeof(msi_table));
3069 r = MsiInstallProductA(msifile, NULL);
3070 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
3071 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
3072 ok(!delete_pf("msitest", FALSE), "File is installed\n");
3075 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
3076 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
3080 DeleteFile(msifile);
3082 create_cc_test_files();
3083 create_database(msifile, co2_tables, sizeof(co2_tables) / sizeof(msi_table));
3085 r = MsiInstallProductA(msifile, NULL);
3086 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
3087 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
3090 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
3091 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
3092 ok(!delete_pf("msitest", FALSE), "File is installed\n");
3097 DeleteFile("imperator");
3098 DeleteFile("maximus");
3099 DeleteFile("augustus");
3100 DeleteFile("caesar");
3101 DeleteFile(msifile);
3104 static void test_mixedmedia(void)
3108 if (is_process_limited())
3110 skip("process is limited\n");
3114 CreateDirectoryA("msitest", NULL);
3115 create_file("msitest\\maximus", 500);
3116 create_file("msitest\\augustus", 500);
3117 create_file("caesar", 500);
3119 create_database(msifile, mm_tables, sizeof(mm_tables) / sizeof(msi_table));
3121 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3123 create_cab_file("test1.cab", MEDIA_SIZE, "caesar\0");
3125 r = MsiInstallProductA(msifile, NULL);
3126 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3128 skip("Not enough rights to perform tests\n");
3131 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3132 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3133 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3134 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3135 ok(delete_pf("msitest", FALSE), "File not installed\n");
3138 /* Delete the files in the temp (current) folder */
3139 DeleteFile("msitest\\maximus");
3140 DeleteFile("msitest\\augustus");
3141 RemoveDirectory("msitest");
3142 DeleteFile("caesar");
3143 DeleteFile("test1.cab");
3144 DeleteFile(msifile);
3147 static void test_samesequence(void)
3151 create_cc_test_files();
3152 create_database(msifile, ss_tables, sizeof(ss_tables) / sizeof(msi_table));
3154 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3156 r = MsiInstallProductA(msifile, NULL);
3157 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3158 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3159 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3160 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3161 ok(delete_pf("msitest", FALSE), "File not installed\n");
3164 DeleteFile(msifile);
3167 static void test_uiLevelFlags(void)
3171 create_cc_test_files();
3172 create_database(msifile, ui_tables, sizeof(ui_tables) / sizeof(msi_table));
3174 MsiSetInternalUI(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY, NULL);
3176 r = MsiInstallProductA(msifile, NULL);
3177 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3178 ok(!delete_pf("msitest\\maximus", TRUE), "UI install occurred, but execute-only was requested.\n");
3179 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3180 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3181 ok(delete_pf("msitest", FALSE), "File not installed\n");
3184 DeleteFile(msifile);
3187 static BOOL file_matches(LPSTR path)
3193 file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
3194 NULL, OPEN_EXISTING, 0, NULL);
3196 ZeroMemory(buf, MAX_PATH);
3197 ReadFile(file, buf, 15, &size, NULL);
3200 return !lstrcmp(buf, "msitest\\maximus");
3203 static void test_readonlyfile(void)
3208 CHAR path[MAX_PATH];
3210 if (is_process_limited())
3212 skip("process is limited\n");
3216 CreateDirectoryA("msitest", NULL);
3217 create_file("msitest\\maximus", 500);
3218 create_database(msifile, rof_tables, sizeof(rof_tables) / sizeof(msi_table));
3220 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3222 lstrcpy(path, PROG_FILES_DIR);
3223 lstrcat(path, "\\msitest");
3224 CreateDirectory(path, NULL);
3226 lstrcat(path, "\\maximus");
3227 file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
3228 NULL, CREATE_NEW, FILE_ATTRIBUTE_READONLY, NULL);
3230 WriteFile(file, "readonlyfile", strlen("readonlyfile"), &size, NULL);
3233 r = MsiInstallProductA(msifile, NULL);
3234 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3236 skip("Not enough rights to perform tests\n");
3239 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3240 ok(file_matches(path), "Expected file to be overwritten\n");
3241 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3242 ok(delete_pf("msitest", FALSE), "File not installed\n");
3245 /* Delete the files in the temp (current) folder */
3246 DeleteFile("msitest\\maximus");
3247 RemoveDirectory("msitest");
3248 DeleteFile(msifile);
3251 static void test_readonlyfile_cab(void)
3256 CHAR path[MAX_PATH];
3259 if (is_process_limited())
3261 skip("process is limited\n");
3265 CreateDirectoryA("msitest", NULL);
3266 create_file("maximus", 500);
3267 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
3268 DeleteFile("maximus");
3270 create_database(msifile, rofc_tables, sizeof(rofc_tables) / sizeof(msi_table));
3272 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3274 lstrcpy(path, PROG_FILES_DIR);
3275 lstrcat(path, "\\msitest");
3276 CreateDirectory(path, NULL);
3278 lstrcat(path, "\\maximus");
3279 file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
3280 NULL, CREATE_NEW, FILE_ATTRIBUTE_READONLY, NULL);
3282 WriteFile(file, "readonlyfile", strlen("readonlyfile"), &size, NULL);
3285 r = MsiInstallProductA(msifile, NULL);
3286 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3288 skip("Not enough rights to perform tests\n");
3291 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3293 memset( buf, 0, sizeof(buf) );
3294 if ((file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
3295 NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE)
3297 ReadFile(file, buf, sizeof(buf) - 1, &size, NULL);
3300 ok(!memcmp( buf, "maximus", sizeof("maximus")-1 ), "Expected file to be overwritten, got '%s'\n", buf);
3301 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3302 ok(delete_pf("msitest", FALSE), "File not installed\n");
3305 /* Delete the files in the temp (current) folder */
3307 DeleteFile("msitest\\maximus");
3308 RemoveDirectory("msitest");
3309 DeleteFile(msifile);
3312 static BOOL add_cabinet_storage(LPCSTR db, LPCSTR cabinet)
3314 WCHAR dbW[MAX_PATH], cabinetW[MAX_PATH];
3320 MultiByteToWideChar(CP_ACP, 0, db, -1, dbW, MAX_PATH);
3321 hr = StgOpenStorage(dbW, NULL, STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, NULL, 0, &stg);
3325 MultiByteToWideChar(CP_ACP, 0, cabinet, -1, cabinetW, MAX_PATH);
3326 hr = IStorage_CreateStream(stg, cabinetW, STGM_WRITE|STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3329 IStorage_Release(stg);
3333 handle = CreateFileW(cabinetW, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
3334 if (handle != INVALID_HANDLE_VALUE)
3338 if (ReadFile(handle, buffer, sizeof(buffer), &count, NULL))
3339 IStream_Write(stm, buffer, count, &count);
3340 CloseHandle(handle);
3343 IStream_Release(stm);
3344 IStorage_Release(stg);
3349 static void test_lastusedsource(void)
3351 static char prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
3354 char value[MAX_PATH], path[MAX_PATH];
3357 if (!pMsiSourceListGetInfoA)
3359 win_skip("MsiSourceListGetInfoA is not available\n");
3363 CreateDirectoryA("msitest", NULL);
3364 create_file("maximus", 500);
3365 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
3366 DeleteFile("maximus");
3368 create_database("msifile0.msi", lus0_tables, sizeof(lus0_tables) / sizeof(msi_table));
3369 create_database("msifile1.msi", lus1_tables, sizeof(lus1_tables) / sizeof(msi_table));
3370 create_database("msifile2.msi", lus2_tables, sizeof(lus2_tables) / sizeof(msi_table));
3372 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3374 /* no cabinet file */
3377 lstrcpyA(value, "aaa");
3378 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3379 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3380 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %u\n", r);
3381 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
3383 r = MsiInstallProductA("msifile0.msi", "PUBLISH_PRODUCT=1");
3384 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3386 skip("Not enough rights to perform tests\n");
3389 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3391 lstrcpyA(path, CURR_DIR);
3392 lstrcatA(path, "\\");
3395 lstrcpyA(value, "aaa");
3396 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3397 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3398 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3399 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3400 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3402 r = MsiInstallProductA("msifile0.msi", "REMOVE=ALL");
3403 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3405 /* separate cabinet file */
3408 lstrcpyA(value, "aaa");
3409 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3410 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3411 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %u\n", r);
3412 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
3414 r = MsiInstallProductA("msifile1.msi", "PUBLISH_PRODUCT=1");
3415 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3417 lstrcpyA(path, CURR_DIR);
3418 lstrcatA(path, "\\");
3421 lstrcpyA(value, "aaa");
3422 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3423 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3424 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3425 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3426 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3428 r = MsiInstallProductA("msifile1.msi", "REMOVE=ALL");
3429 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3432 lstrcpyA(value, "aaa");
3433 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3434 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3435 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %u\n", r);
3436 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
3438 /* embedded cabinet stream */
3440 add_cabinet_storage("msifile2.msi", "test1.cab");
3442 r = MsiInstallProductA("msifile2.msi", "PUBLISH_PRODUCT=1");
3443 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3446 lstrcpyA(value, "aaa");
3447 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3448 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3449 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3450 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3451 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3453 r = MsiInstallProductA("msifile2.msi", "REMOVE=ALL");
3454 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3457 lstrcpyA(value, "aaa");
3458 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3459 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3460 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %u\n", r);
3461 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
3464 /* Delete the files in the temp (current) folder */
3466 DeleteFile("msitest\\maximus");
3467 RemoveDirectory("msitest");
3468 DeleteFile("msifile0.msi");
3469 DeleteFile("msifile1.msi");
3470 DeleteFile("msifile2.msi");
3473 static void test_setdirproperty(void)
3477 if (is_process_limited())
3479 skip("process is limited\n");
3483 CreateDirectoryA("msitest", NULL);
3484 create_file("msitest\\maximus", 500);
3485 create_database(msifile, sdp_tables, sizeof(sdp_tables) / sizeof(msi_table));
3487 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3489 r = MsiInstallProductA(msifile, NULL);
3490 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3492 skip("Not enough rights to perform tests\n");
3495 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3496 ok(delete_cf("msitest\\maximus", TRUE), "File not installed\n");
3497 ok(delete_cf("msitest", FALSE), "File not installed\n");
3500 /* Delete the files in the temp (current) folder */
3501 DeleteFile(msifile);
3502 DeleteFile("msitest\\maximus");
3503 RemoveDirectory("msitest");
3506 static void test_cabisextracted(void)
3510 if (is_process_limited())
3512 skip("process is limited\n");
3516 CreateDirectoryA("msitest", NULL);
3517 create_file("msitest\\gaius", 500);
3518 create_file("maximus", 500);
3519 create_file("augustus", 500);
3520 create_file("caesar", 500);
3522 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
3523 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0");
3524 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
3526 create_database(msifile, cie_tables, sizeof(cie_tables) / sizeof(msi_table));
3528 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3530 r = MsiInstallProductA(msifile, NULL);
3531 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3533 skip("Not enough rights to perform tests\n");
3536 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3537 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3538 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3539 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
3540 ok(delete_pf("msitest\\gaius", TRUE), "File not installed\n");
3541 ok(delete_pf("msitest", FALSE), "File not installed\n");
3544 /* Delete the files in the temp (current) folder */
3546 DeleteFile(msifile);
3547 DeleteFile("maximus");
3548 DeleteFile("augustus");
3549 DeleteFile("caesar");
3550 DeleteFile("msitest\\gaius");
3551 RemoveDirectory("msitest");
3554 static void test_concurrentinstall(void)
3557 CHAR path[MAX_PATH];
3559 if (is_process_limited())
3561 skip("process is limited\n");
3565 CreateDirectoryA("msitest", NULL);
3566 CreateDirectoryA("msitest\\msitest", NULL);
3567 create_file("msitest\\maximus", 500);
3568 create_file("msitest\\msitest\\augustus", 500);
3570 create_database(msifile, ci_tables, sizeof(ci_tables) / sizeof(msi_table));
3572 lstrcpyA(path, CURR_DIR);
3573 lstrcatA(path, "\\msitest\\concurrent.msi");
3574 create_database(path, ci2_tables, sizeof(ci2_tables) / sizeof(msi_table));
3576 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
3578 r = MsiInstallProductA(msifile, NULL);
3579 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3581 skip("Not enough rights to perform tests\n");
3585 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3586 if (!delete_pf("msitest\\augustus", TRUE))
3587 trace("concurrent installs not supported\n");
3588 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3589 ok(delete_pf("msitest", FALSE), "File not installed\n");
3593 r = MsiInstallProductA(msifile, NULL);
3594 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3595 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3596 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3597 ok(delete_pf("msitest", FALSE), "File not installed\n");
3600 DeleteFile(msifile);
3601 DeleteFile("msitest\\msitest\\augustus");
3602 DeleteFile("msitest\\maximus");
3603 RemoveDirectory("msitest\\msitest");
3604 RemoveDirectory("msitest");
3607 static void test_setpropertyfolder(void)
3610 CHAR path[MAX_PATH];
3613 if (is_process_limited())
3615 skip("process is limited\n");
3619 lstrcpyA(path, PROG_FILES_DIR);
3620 lstrcatA(path, "\\msitest\\added");
3622 CreateDirectoryA("msitest", NULL);
3623 create_file("msitest\\maximus", 500);
3625 create_database(msifile, spf_tables, sizeof(spf_tables) / sizeof(msi_table));
3627 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
3629 r = MsiInstallProductA(msifile, NULL);
3630 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3632 skip("Not enough rights to perform tests\n");
3635 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3636 attr = GetFileAttributesA(path);
3637 if (attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY))
3639 ok(delete_pf("msitest\\added\\maximus", TRUE), "File not installed\n");
3640 ok(delete_pf("msitest\\added", FALSE), "File not installed\n");
3641 ok(delete_pf("msitest", FALSE), "File not installed\n");
3645 trace("changing folder property not supported\n");
3646 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3647 ok(delete_pf("msitest", FALSE), "File not installed\n");
3651 /* Delete the files in the temp (current) folder */
3652 DeleteFile(msifile);
3653 DeleteFile("msitest\\maximus");
3654 RemoveDirectory("msitest");
3657 static BOOL file_exists(LPCSTR file)
3659 return GetFileAttributes(file) != INVALID_FILE_ATTRIBUTES;
3662 static BOOL pf_exists(LPCSTR file)
3664 CHAR path[MAX_PATH];
3666 lstrcpyA(path, PROG_FILES_DIR);
3667 lstrcatA(path, "\\");
3668 lstrcatA(path, file);
3670 return file_exists(path);
3673 static void delete_pfmsitest_files(void)
3675 SHFILEOPSTRUCT shfl;
3676 CHAR path[MAX_PATH+11];
3678 lstrcpyA(path, PROG_FILES_DIR);
3679 lstrcatA(path, "\\msitest\\*");
3680 path[strlen(path) + 1] = '\0';
3683 shfl.wFunc = FO_DELETE;
3686 shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT | FOF_NOERRORUI;
3688 SHFileOperation(&shfl);
3690 lstrcpyA(path, PROG_FILES_DIR);
3691 lstrcatA(path, "\\msitest");
3692 RemoveDirectoryA(path);
3695 static UINT run_query(MSIHANDLE hdb, MSIHANDLE hrec, const char *query)
3697 MSIHANDLE hview = 0;
3700 r = MsiDatabaseOpenView(hdb, query, &hview);
3701 if(r != ERROR_SUCCESS)
3704 r = MsiViewExecute(hview, hrec);
3705 if(r == ERROR_SUCCESS)
3706 r = MsiViewClose(hview);
3707 MsiCloseHandle(hview);
3711 static void set_transform_summary_info(void)
3714 MSIHANDLE suminfo = 0;
3716 /* build summary info */
3717 r = MsiGetSummaryInformation(0, mstfile, 3, &suminfo);
3718 ok(r == ERROR_SUCCESS , "Failed to open summaryinfo\n");
3720 r = MsiSummaryInfoSetProperty(suminfo, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
3721 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3723 r = MsiSummaryInfoSetProperty(suminfo, PID_REVNUMBER, VT_LPSTR, 0, NULL,
3724 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3725 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3726 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}");
3727 ok(r == ERROR_SUCCESS , "Failed to set summary info\n");
3729 r = MsiSummaryInfoSetProperty(suminfo, PID_PAGECOUNT, VT_I4, 100, NULL, NULL);
3730 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3732 r = MsiSummaryInfoPersist(suminfo);
3733 ok(r == ERROR_SUCCESS , "Failed to make summary info persist\n");
3735 r = MsiCloseHandle(suminfo);
3736 ok(r == ERROR_SUCCESS , "Failed to close suminfo\n");
3739 static void generate_transform(void)
3741 MSIHANDLE hdb1, hdb2;
3745 /* start with two identical databases */
3746 CopyFile(msifile, msifile2, FALSE);
3748 r = MsiOpenDatabase(msifile2, MSIDBOPEN_TRANSACT, &hdb1);
3749 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3751 r = MsiDatabaseCommit(hdb1);
3752 ok(r == ERROR_SUCCESS , "Failed to commit database\n");
3754 r = MsiOpenDatabase(msifile, MSIDBOPEN_READONLY, &hdb2);
3755 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3757 query = "INSERT INTO `Property` ( `Property`, `Value` ) VALUES ( 'prop', 'val' )";
3758 r = run_query(hdb1, 0, query);
3759 ok(r == ERROR_SUCCESS, "failed to add property\n");
3761 /* database needs to be committed */
3762 MsiDatabaseCommit(hdb1);
3764 r = MsiDatabaseGenerateTransform(hdb1, hdb2, mstfile, 0, 0);
3765 ok(r == ERROR_SUCCESS, "return code %d, should be ERROR_SUCCESS\n", r);
3767 #if 0 /* not implemented in wine yet */
3768 r = MsiCreateTransformSummaryInfo(hdb2, hdb2, mstfile, 0, 0);
3769 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3772 MsiCloseHandle(hdb1);
3773 MsiCloseHandle(hdb2);
3776 /* data for generating a transform */
3778 /* tables transform names - encoded as they would be in an msi database file */
3779 static const WCHAR name1[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */
3780 static const WCHAR name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */
3781 static const WCHAR name3[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */
3783 /* data in each table */
3784 static const char data1[] = /* _StringData */
3785 "propval"; /* all the strings squashed together */
3787 static const WCHAR data2[] = { /* _StringPool */
3789 0, 0, /* string 0 '' */
3790 4, 1, /* string 1 'prop' */
3791 3, 1, /* string 2 'val' */
3794 static const WCHAR data3[] = { /* Property */
3795 0x0201, 0x0001, 0x0002,
3798 static const struct {
3802 } table_transform_data[] =
3804 { name1, data1, sizeof data1 - 1 },
3805 { name2, data2, sizeof data2 },
3806 { name3, data3, sizeof data3 },
3809 #define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0])
3811 static void generate_transform_manual(void)
3813 IStorage *stg = NULL;
3818 const DWORD mode = STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE;
3820 const CLSID CLSID_MsiTransform = { 0xc1082,0,0,{0xc0,0,0,0,0,0,0,0x46}};
3822 MultiByteToWideChar(CP_ACP, 0, mstfile, -1, name, 0x20);
3824 r = StgCreateDocfile(name, mode, 0, &stg);
3825 ok(r == S_OK, "failed to create storage\n");
3829 r = IStorage_SetClass(stg, &CLSID_MsiTransform);
3830 ok(r == S_OK, "failed to set storage type\n");
3832 for (i=0; i<NUM_TRANSFORM_TABLES; i++)
3834 r = IStorage_CreateStream(stg, table_transform_data[i].name,
3835 STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3838 ok(0, "failed to create stream %08x\n", r);
3842 r = IStream_Write(stm, table_transform_data[i].data,
3843 table_transform_data[i].size, &count);
3844 if (FAILED(r) || count != table_transform_data[i].size)
3845 ok(0, "failed to write stream\n");
3846 IStream_Release(stm);
3849 IStorage_Release(stg);
3851 set_transform_summary_info();
3854 static void test_transformprop(void)
3858 if (is_process_limited())
3860 skip("process is limited\n");
3864 CreateDirectoryA("msitest", NULL);
3865 create_file("msitest\\augustus", 500);
3867 create_database(msifile, tp_tables, sizeof(tp_tables) / sizeof(msi_table));
3869 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3871 r = MsiInstallProductA(msifile, NULL);
3872 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3874 skip("Not enough rights to perform tests\n");
3877 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3878 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3879 ok(!delete_pf("msitest", FALSE), "File installed\n");
3882 generate_transform();
3884 generate_transform_manual();
3886 r = MsiInstallProductA(msifile, "TRANSFORMS=winetest.mst");
3887 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3888 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3889 ok(delete_pf("msitest", FALSE), "File not installed\n");
3892 /* Delete the files in the temp (current) folder */
3893 DeleteFile(msifile);
3894 DeleteFile(msifile2);
3895 DeleteFile(mstfile);
3896 DeleteFile("msitest\\augustus");
3897 RemoveDirectory("msitest");
3900 static void test_currentworkingdir(void)
3903 CHAR drive[MAX_PATH], path[MAX_PATH];
3906 if (is_process_limited())
3908 skip("process is limited\n");
3912 CreateDirectoryA("msitest", NULL);
3913 create_file("msitest\\augustus", 500);
3915 create_database(msifile, cwd_tables, sizeof(cwd_tables) / sizeof(msi_table));
3917 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3919 CreateDirectoryA("diffdir", NULL);
3920 SetCurrentDirectoryA("diffdir");
3922 sprintf(path, "..\\%s", msifile);
3923 r = MsiInstallProductA(path, NULL);
3926 ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
3927 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3928 ok(!delete_pf("msitest", FALSE), "File installed\n");
3931 sprintf(path, "%s\\%s", CURR_DIR, msifile);
3932 r = MsiInstallProductA(path, NULL);
3933 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
3935 skip("Not enough rights to perform tests\n");
3938 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3939 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3940 ok(delete_pf("msitest", FALSE), "File not installed\n");
3942 lstrcpyA(drive, CURR_DIR);
3945 SetCurrentDirectoryA(drive);
3947 lstrcpy(path, CURR_DIR);
3948 if (path[lstrlenA(path) - 1] != '\\')
3949 lstrcatA(path, "\\");
3950 lstrcatA(path, msifile);
3951 ptr = strchr(path, ':');
3954 r = MsiInstallProductA(ptr, NULL);
3955 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3956 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3957 ok(delete_pf("msitest", FALSE), "File not installed\n");
3960 SetCurrentDirectoryA(CURR_DIR);
3961 DeleteFile(msifile);
3962 DeleteFile("msitest\\augustus");
3963 RemoveDirectory("msitest");
3964 RemoveDirectory("diffdir");
3967 static void set_admin_summary_info(const CHAR *name)
3969 MSIHANDLE db, summary;
3972 r = MsiOpenDatabaseA(name, MSIDBOPEN_DIRECT, &db);
3973 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3975 r = MsiGetSummaryInformationA(db, NULL, 1, &summary);
3976 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3978 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, 5, NULL, NULL);
3979 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3981 /* write the summary changes back to the stream */
3982 r = MsiSummaryInfoPersist(summary);
3983 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3985 MsiCloseHandle(summary);
3987 r = MsiDatabaseCommit(db);
3988 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3993 static void test_admin(void)
3997 CreateDirectoryA("msitest", NULL);
3998 create_file("msitest\\augustus", 500);
4000 create_database(msifile, adm_tables, sizeof(adm_tables) / sizeof(msi_table));
4001 set_admin_summary_info(msifile);
4003 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4005 r = MsiInstallProductA(msifile, NULL);
4006 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
4008 skip("Not enough rights to perform tests\n");
4011 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4012 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4013 ok(!delete_pf("msitest", FALSE), "File installed\n");
4014 ok(!DeleteFile("c:\\msitest\\augustus"), "File installed\n");
4015 ok(!RemoveDirectory("c:\\msitest"), "File installed\n");
4017 r = MsiInstallProductA(msifile, "ACTION=ADMIN");
4018 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4019 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4020 ok(!delete_pf("msitest", FALSE), "File installed\n");
4023 ok(DeleteFile("c:\\msitest\\augustus"), "File not installed\n");
4024 ok(RemoveDirectory("c:\\msitest"), "File not installed\n");
4028 DeleteFile(msifile);
4029 DeleteFile("msitest\\augustus");
4030 RemoveDirectory("msitest");
4033 static void set_admin_property_stream(LPCSTR file)
4037 WCHAR fileW[MAX_PATH];
4040 const DWORD mode = STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE;
4042 /* AdminProperties */
4043 static const WCHAR stmname[] = {0x41ca,0x4330,0x3e71,0x44b5,0x4233,0x45f5,0x422c,0x4836,0};
4044 static const WCHAR data[] = {'M','Y','P','R','O','P','=','2','7','1','8',' ',
4045 'M','y','P','r','o','p','=','4','2',0};
4047 MultiByteToWideChar(CP_ACP, 0, file, -1, fileW, MAX_PATH);
4049 hr = StgOpenStorage(fileW, NULL, mode, NULL, 0, &stg);
4050 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
4054 hr = IStorage_CreateStream(stg, stmname, STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
4055 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
4057 hr = IStream_Write(stm, data, sizeof(data), &count);
4058 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
4060 IStream_Release(stm);
4061 IStorage_Release(stg);
4064 static void test_adminprops(void)
4068 if (is_process_limited())
4070 skip("process is limited\n");
4074 CreateDirectoryA("msitest", NULL);
4075 create_file("msitest\\augustus", 500);
4077 create_database(msifile, amp_tables, sizeof(amp_tables) / sizeof(msi_table));
4078 set_admin_summary_info(msifile);
4079 set_admin_property_stream(msifile);
4081 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4083 r = MsiInstallProductA(msifile, NULL);
4084 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
4086 skip("Not enough rights to perform tests\n");
4089 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4090 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
4091 ok(delete_pf("msitest", FALSE), "File installed\n");
4094 DeleteFile(msifile);
4095 DeleteFile("msitest\\augustus");
4096 RemoveDirectory("msitest");
4099 static void create_pf_data(LPCSTR file, LPCSTR data, BOOL is_file)
4101 CHAR path[MAX_PATH];
4103 lstrcpyA(path, PROG_FILES_DIR);
4104 lstrcatA(path, "\\");
4105 lstrcatA(path, file);
4108 create_file_data(path, data, 500);
4110 CreateDirectoryA(path, NULL);
4113 #define create_pf(file, is_file) create_pf_data(file, file, is_file)
4115 static void test_missingcab(void)
4119 if (is_process_limited())
4121 skip("process is limited\n");
4125 CreateDirectoryA("msitest", NULL);
4126 create_file("msitest\\augustus", 500);
4127 create_file("maximus", 500);
4128 create_file("tiberius", 500);
4130 create_database(msifile, mc_tables, sizeof(mc_tables) / sizeof(msi_table));
4132 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4134 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
4135 create_cab_file("test4.cab", MEDIA_SIZE, "tiberius\0");
4137 create_pf("msitest", FALSE);
4138 create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
4139 create_pf_data("msitest\\tiberius", "abcdefgh", TRUE);
4141 r = MsiInstallProductA(msifile, NULL);
4142 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
4144 skip("Not enough rights to perform tests\n");
4147 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4148 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
4149 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
4150 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
4151 ok(compare_pf_data("msitest\\tiberius", "abcdefgh", sizeof("abcdefgh")), "Wrong file contents\n");
4152 ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n");
4153 ok(!delete_pf("msitest\\gaius", TRUE), "File installed\n");
4154 ok(delete_pf("msitest", FALSE), "Directory not created\n");
4156 create_pf("msitest", FALSE);
4157 create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
4158 create_pf_data("msitest\\tiberius", "abcdefgh", TRUE);
4159 create_pf("msitest\\gaius", TRUE);
4161 r = MsiInstallProductA(msifile, "GAIUS=1");
4162 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4165 ok(!delete_pf("msitest\\maximus", TRUE), "File installed\n");
4166 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4168 ok(delete_pf("msitest\\caesar", TRUE), "File removed\n");
4169 ok(compare_pf_data("msitest\\tiberius", "abcdefgh", sizeof("abcdefgh")), "Wrong file contents\n");
4170 ok(delete_pf("msitest\\tiberius", TRUE), "File removed\n");
4171 ok(delete_pf("msitest\\gaius", TRUE), "File removed\n");
4172 ok(delete_pf("msitest", FALSE), "Directory not created\n");
4175 delete_pf("msitest", FALSE);
4176 DeleteFile("msitest\\augustus");
4177 RemoveDirectory("msitest");
4178 DeleteFile("maximus");
4179 DeleteFile("tiberius");
4180 DeleteFile("test1.cab");
4181 DeleteFile("test4.cab");
4182 DeleteFile(msifile);
4185 static void test_sourcefolder(void)
4189 if (is_process_limited())
4191 skip("process is limited\n");
4195 CreateDirectoryA("msitest", NULL);
4196 create_file("augustus", 500);
4198 create_database(msifile, sf_tables, sizeof(sf_tables) / sizeof(msi_table));
4200 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4202 r = MsiInstallProductA(msifile, NULL);
4203 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
4205 skip("Not enough rights to perform tests\n");
4208 ok(r == ERROR_INSTALL_FAILURE,
4209 "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4210 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4213 ok(!delete_pf("msitest", FALSE), "File installed\n");
4216 RemoveDirectoryA("msitest");
4218 r = MsiInstallProductA(msifile, NULL);
4219 ok(r == ERROR_INSTALL_FAILURE,
4220 "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4221 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4224 ok(!delete_pf("msitest", FALSE), "File installed\n");
4228 DeleteFile(msifile);
4229 DeleteFile("augustus");
4232 static void test_customaction51(void)
4236 if (is_process_limited())
4238 skip("process is limited\n");
4242 CreateDirectoryA("msitest", NULL);
4243 create_file("msitest\\augustus", 500);
4245 create_database(msifile, ca51_tables, sizeof(ca51_tables) / sizeof(msi_table));
4247 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4249 r = MsiInstallProductA(msifile, NULL);
4250 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
4252 skip("Not enough rights to perform tests\n");
4255 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4256 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
4257 ok(delete_pf("msitest", FALSE), "File installed\n");
4260 DeleteFile(msifile);
4261 DeleteFile("msitest\\augustus");
4262 RemoveDirectory("msitest");
4265 static void test_installstate(void)
4269 if (is_process_limited())
4271 skip("process is limited\n");
4275 CreateDirectoryA("msitest", NULL);
4276 create_file("msitest\\alpha", 500);
4277 create_file("msitest\\beta", 500);
4278 create_file("msitest\\gamma", 500);
4279 create_file("msitest\\theta", 500);
4280 create_file("msitest\\delta", 500);
4281 create_file("msitest\\epsilon", 500);
4282 create_file("msitest\\zeta", 500);
4283 create_file("msitest\\iota", 500);
4284 create_file("msitest\\eta", 500);
4285 create_file("msitest\\kappa", 500);
4286 create_file("msitest\\lambda", 500);
4287 create_file("msitest\\mu", 500);
4289 create_database(msifile, is_tables, sizeof(is_tables) / sizeof(msi_table));
4291 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4293 r = MsiInstallProductA(msifile, NULL);
4294 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
4296 skip("Not enough rights to perform tests\n");
4299 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4300 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4301 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4302 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n");
4303 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4304 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4305 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4306 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n");
4307 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4308 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4309 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4310 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4311 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4312 ok(delete_pf("msitest", FALSE), "File not installed\n");
4314 r = MsiInstallProductA(msifile, "ADDLOCAL=\"one,two,three,four\"");
4315 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4316 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4317 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4318 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n");
4319 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4320 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4321 ok(delete_pf("msitest\\epsilon", TRUE), "File not installed\n");
4322 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n");
4323 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4324 ok(delete_pf("msitest\\eta", TRUE), "File not installed\n");
4325 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4326 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4327 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4328 ok(delete_pf("msitest", FALSE), "File not installed\n");
4330 r = MsiInstallProductA(msifile, "ADDSOURCE=\"one,two,three,four\"");
4331 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4332 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4333 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4334 ok(!delete_pf("msitest\\gamma", TRUE), "File installed\n");
4335 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4336 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4337 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4338 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n");
4339 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4340 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4341 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4342 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4343 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4344 ok(delete_pf("msitest", FALSE), "File not installed\n");
4346 r = MsiInstallProductA(msifile, "REMOVE=\"one,two,three,four\"");
4347 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4348 ok(!delete_pf("msitest\\alpha", TRUE), "File installed\n");
4349 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4350 ok(!delete_pf("msitest\\gamma", TRUE), "File installed\n");
4351 ok(!delete_pf("msitest\\theta", TRUE), "File installed\n");
4352 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4353 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4354 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n");
4355 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4356 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4357 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4358 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4359 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4360 ok(!delete_pf("msitest", FALSE), "File installed\n");
4363 DeleteFile(msifile);
4364 DeleteFile("msitest\\alpha");
4365 DeleteFile("msitest\\beta");
4366 DeleteFile("msitest\\gamma");
4367 DeleteFile("msitest\\theta");
4368 DeleteFile("msitest\\delta");
4369 DeleteFile("msitest\\epsilon");
4370 DeleteFile("msitest\\zeta");
4371 DeleteFile("msitest\\iota");
4372 DeleteFile("msitest\\eta");
4373 DeleteFile("msitest\\kappa");
4374 DeleteFile("msitest\\lambda");
4375 DeleteFile("msitest\\mu");
4376 RemoveDirectory("msitest");
4379 static const struct sourcepathmap
4381 BOOL sost; /* shortone\shorttwo */
4382 BOOL solt; /* shortone\longtwo */
4383 BOOL lost; /* longone\shorttwo */
4384 BOOL lolt; /* longone\longtwo */
4385 BOOL soste; /* shortone\shorttwo source exists */
4386 BOOL solte; /* shortone\longtwo source exists */
4387 BOOL loste; /* longone\shorttwo source exists */
4388 BOOL lolte; /* longone\longtwo source exists */
4393 {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4394 {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4395 {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4396 {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4397 {TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4398 {TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4399 {TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4400 {TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4401 {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4402 {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4403 {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4404 {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4405 {TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4406 {TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4407 {TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4408 {TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4409 {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4410 {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4411 {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4412 {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4413 {TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4414 {TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4415 {TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4416 {TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4417 {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4418 {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4419 {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4420 {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4421 {TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4422 {TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4423 {TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4424 {TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4425 {TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4426 {TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4427 {TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4428 {TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4429 {TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4430 {TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4431 {TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4432 {TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4433 {TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4434 {TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4435 {TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4436 {TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4437 {TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4438 {TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4439 {TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4440 {TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4441 {TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4442 {TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4443 {TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4444 {TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4445 {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4446 {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4447 {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4448 {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4449 {TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4450 {TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4451 {TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4452 {TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4453 {TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4454 {TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4455 {TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4456 {TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4457 {TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4458 {TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4459 {TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4460 {TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4461 {TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4462 {TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4463 {TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4464 {TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4465 {TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4466 {TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4467 {TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4468 {TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4469 {TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4470 {TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4471 {TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4472 {TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4473 {TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4474 {TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4475 {TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4476 {TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4477 {TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4478 {TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4479 {TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4480 {TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4481 {TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4482 {TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4483 {TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4484 {TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4485 {TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4486 {TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4487 {TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4488 {TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4489 {TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4490 {TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4491 {TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4492 {TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4493 {TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4494 {TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4495 {TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4496 {TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4497 {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4498 {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4499 {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4500 {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4501 {TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4502 {TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4503 {TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4504 {TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4505 {TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4506 {TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4507 {TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4508 {TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4509 {TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4510 {TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4511 {TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4512 {TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4513 {TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4514 {TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4515 {TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4516 {TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4517 {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4518 {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4519 {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4520 {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4521 {FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4522 {FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4523 {FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4524 {FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4525 {FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4526 {FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4527 {FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4528 {FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4529 {FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4530 {FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4531 {FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4532 {FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4533 {FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4534 {FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4535 {FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4536 {FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4537 {FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4538 {FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4539 {FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4540 {FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4541 {FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4542 {FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4543 {FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4544 {FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4545 {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4546 {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4547 {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4548 {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4549 {FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4550 {FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4551 {FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4552 {FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4553 {FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4554 {FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4555 {FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4556 {FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4557 {FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4558 {FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4559 {FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4560 {FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4561 {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4562 {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4563 {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4564 {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4565 {FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4566 {FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4567 {FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4568 {FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4569 {FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4570 {FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4571 {FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4572 {FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4573 {FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4574 {FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4575 {FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4576 {FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4577 {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4578 {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4579 {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4580 {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4581 {FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4582 {FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4583 {FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4584 {FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4585 {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4586 {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4587 {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4588 {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4589 {FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4590 {FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4591 {FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4592 {FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4593 {FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4594 {FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4595 {FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4596 {FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4597 {FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4598 {FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4599 {FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4600 {FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4601 {FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4602 {FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4603 {FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4604 {FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4605 {FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4606 {FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4607 {FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4608 {FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4609 {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4610 {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4611 {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4612 {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4613 {FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4614 {FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4615 {FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4616 {FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4617 {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4618 {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4619 {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4620 {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4621 {FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4622 {FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4623 {FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4624 {FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4625 {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200},
4626 {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4627 {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200},
4628 {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4629 {FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200},
4630 {FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4631 {FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200},
4632 {FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4633 {FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4634 {FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4635 {FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4636 {FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4637 {FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4638 {FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4639 {FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4640 {FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4641 {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4642 {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4643 {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4644 {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4645 {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0},
4646 {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0},
4647 {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0},
4648 {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0},
4651 static DWORD get_pf_file_size(LPCSTR file)
4653 CHAR path[MAX_PATH];
4657 lstrcpyA(path, PROG_FILES_DIR);
4658 lstrcatA(path, "\\");
4659 lstrcatA(path, file);
4661 hfile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
4662 if (hfile == INVALID_HANDLE_VALUE)
4663 return INVALID_FILE_SIZE;
4665 size = GetFileSize(hfile, NULL);
4670 static void test_sourcepath(void)
4674 if (!winetest_interactive)
4676 skip("Run in interactive mode to run source path tests.\n");
4680 create_database(msifile, sp_tables, sizeof(sp_tables) / sizeof(msi_table));
4682 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4684 for (i = 0; i < sizeof(spmap) / sizeof(spmap[0]); i++)
4688 CreateDirectoryA("shortone", NULL);
4689 CreateDirectoryA("shortone\\shorttwo", NULL);
4694 CreateDirectoryA("shortone", NULL);
4695 CreateDirectoryA("shortone\\longtwo", NULL);
4700 CreateDirectoryA("longone", NULL);
4701 CreateDirectoryA("longone\\shorttwo", NULL);
4706 CreateDirectoryA("longone", NULL);
4707 CreateDirectoryA("longone\\longtwo", NULL);
4711 create_file("shortone\\shorttwo\\augustus", 50);
4713 create_file("shortone\\longtwo\\augustus", 100);
4715 create_file("longone\\shorttwo\\augustus", 150);
4717 create_file("longone\\longtwo\\augustus", 200);
4719 r = MsiInstallProductA(msifile, NULL);
4720 ok(r == spmap[i].err, "%d: Expected %d, got %d\n", i, spmap[i].err, r);
4721 ok(get_pf_file_size("msitest\\augustus") == spmap[i].size,
4722 "%d: Expected %d, got %d\n", i, spmap[i].size,
4723 get_pf_file_size("msitest\\augustus"));
4725 if (r == ERROR_SUCCESS)
4727 ok(delete_pf("msitest\\augustus", TRUE), "%d: File not installed\n", i);
4728 ok(delete_pf("msitest", FALSE), "%d: File not installed\n", i);
4732 ok(!delete_pf("msitest\\augustus", TRUE), "%d: File installed\n", i);
4733 todo_wine ok(!delete_pf("msitest", FALSE), "%d: File installed\n", i);
4736 DeleteFileA("shortone\\shorttwo\\augustus");
4737 DeleteFileA("shortone\\longtwo\\augustus");
4738 DeleteFileA("longone\\shorttwo\\augustus");
4739 DeleteFileA("longone\\longtwo\\augustus");
4740 RemoveDirectoryA("shortone\\shorttwo");
4741 RemoveDirectoryA("shortone\\longtwo");
4742 RemoveDirectoryA("longone\\shorttwo");
4743 RemoveDirectoryA("longone\\longtwo");
4744 RemoveDirectoryA("shortone");
4745 RemoveDirectoryA("longone");
4748 DeleteFileA(msifile);
4751 static void test_MsiConfigureProductEx(void)
4757 CHAR keypath[MAX_PATH * 2], localpackage[MAX_PATH], packagename[MAX_PATH];
4758 REGSAM access = KEY_ALL_ACCESS;
4760 if (is_process_limited())
4762 skip("process is limited\n");
4766 CreateDirectoryA("msitest", NULL);
4767 create_file("msitest\\hydrogen", 500);
4768 create_file("msitest\\helium", 500);
4769 create_file("msitest\\lithium", 500);
4771 create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table));
4774 access |= KEY_WOW64_64KEY;
4776 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4778 /* NULL szProduct */
4779 r = MsiConfigureProductExA(NULL, INSTALLLEVEL_DEFAULT,
4780 INSTALLSTATE_DEFAULT, "PROPVAR=42");
4781 ok(r == ERROR_INVALID_PARAMETER,
4782 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
4784 /* empty szProduct */
4785 r = MsiConfigureProductExA("", INSTALLLEVEL_DEFAULT,
4786 INSTALLSTATE_DEFAULT, "PROPVAR=42");
4787 ok(r == ERROR_INVALID_PARAMETER,
4788 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
4790 /* garbage szProduct */
4791 r = MsiConfigureProductExA("garbage", INSTALLLEVEL_DEFAULT,
4792 INSTALLSTATE_DEFAULT, "PROPVAR=42");
4793 ok(r == ERROR_INVALID_PARAMETER,
4794 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
4796 /* guid without brackets */
4797 r = MsiConfigureProductExA("6700E8CF-95AB-4D9C-BC2C-15840DEA7A5D",
4798 INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT,
4800 ok(r == ERROR_INVALID_PARAMETER,
4801 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
4803 /* guid with brackets */
4804 r = MsiConfigureProductExA("{6700E8CF-95AB-4D9C-BC2C-15840DEA7A5D}",
4805 INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT,
4807 ok(r == ERROR_UNKNOWN_PRODUCT,
4808 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4810 /* same length as guid, but random */
4811 r = MsiConfigureProductExA("A938G02JF-2NF3N93-VN3-2NNF-3KGKALDNF93",
4812 INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT,
4814 ok(r == ERROR_UNKNOWN_PRODUCT,
4815 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4817 /* product not installed yet */
4818 r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
4819 INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT,
4821 ok(r == ERROR_UNKNOWN_PRODUCT,
4822 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4824 /* install the product, per-user unmanaged */
4825 r = MsiInstallProductA(msifile, "INSTALLLEVEL=10 PROPVAR=42");
4826 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
4828 skip("Not enough rights to perform tests\n");
4831 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4832 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4833 ok(pf_exists("msitest\\helium"), "File not installed\n");
4834 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4835 ok(pf_exists("msitest"), "File not installed\n");
4837 /* product is installed per-user managed, remove it */
4838 r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
4839 INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT,
4841 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4842 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
4843 ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
4844 ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
4845 ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
4847 /* product has been removed */
4848 r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
4849 INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT,
4851 ok(r == ERROR_UNKNOWN_PRODUCT,
4852 "Expected ERROR_UNKNOWN_PRODUCT, got %u\n", r);
4854 /* install the product, machine */
4855 r = MsiInstallProductA(msifile, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
4856 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4857 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4858 ok(pf_exists("msitest\\helium"), "File not installed\n");
4859 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4860 ok(pf_exists("msitest"), "File not installed\n");
4862 /* product is installed machine, remove it */
4863 r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
4864 INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT,
4866 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4867 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
4868 ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
4869 ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
4870 ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
4872 /* product has been removed */
4873 r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
4874 INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT,
4876 ok(r == ERROR_UNKNOWN_PRODUCT,
4877 "Expected ERROR_UNKNOWN_PRODUCT, got %u\n", r);
4879 /* install the product, machine */
4880 r = MsiInstallProductA(msifile, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
4881 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4882 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4883 ok(pf_exists("msitest\\helium"), "File not installed\n");
4884 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4885 ok(pf_exists("msitest"), "File not installed\n");
4887 DeleteFileA(msifile);
4889 /* msifile is removed */
4890 r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
4891 INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT,
4893 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4894 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
4895 ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
4896 ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
4897 ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
4899 create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table));
4901 /* install the product, machine */
4902 r = MsiInstallProductA(msifile, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
4903 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4904 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4905 ok(pf_exists("msitest\\helium"), "File not installed\n");
4906 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4907 ok(pf_exists("msitest"), "File not installed\n");
4909 DeleteFileA(msifile);
4911 lstrcpyA(keypath, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\");
4912 lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\");
4913 lstrcatA(keypath, "84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties");
4915 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &props);
4916 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4920 res = RegQueryValueExA(props, "LocalPackage", NULL, &type,
4921 (LPBYTE)localpackage, &size);
4922 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4924 res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ,
4925 (const BYTE *)"C:\\idontexist.msi", 18);
4926 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4928 /* LocalPackage is used to find the cached msi package */
4929 r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
4930 INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT,
4932 ok(r == ERROR_INSTALL_SOURCE_ABSENT,
4933 "Expected ERROR_INSTALL_SOURCE_ABSENT, got %d\n", r);
4934 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4935 ok(pf_exists("msitest\\helium"), "File not installed\n");
4936 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4937 ok(pf_exists("msitest"), "File not installed\n");
4940 create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table));
4942 /* LastUsedSource can be used as a last resort */
4943 r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
4944 INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT,
4946 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4947 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
4948 ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
4949 ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
4950 ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
4951 DeleteFileA( localpackage );
4953 /* install the product, machine */
4954 r = MsiInstallProductA(msifile, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
4955 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4956 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4957 ok(pf_exists("msitest\\helium"), "File not installed\n");
4958 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4959 ok(pf_exists("msitest"), "File not installed\n");
4961 lstrcpyA(keypath, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\");
4962 lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\");
4963 lstrcatA(keypath, "84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties");
4965 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &props);
4966 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4970 res = RegQueryValueExA(props, "LocalPackage", NULL, &type,
4971 (LPBYTE)localpackage, &size);
4972 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4974 res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ,
4975 (const BYTE *)"C:\\idontexist.msi", 18);
4976 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4978 lstrcpyA(keypath, "SOFTWARE\\Classes\\Installer\\Products\\");
4979 lstrcatA(keypath, "84A88FD7F6998CE40A22FB59F6B9C2BB\\SourceList");
4981 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &source);
4982 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4986 res = RegQueryValueExA(source, "PackageName", NULL, &type,
4987 (LPBYTE)packagename, &size);
4988 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4990 res = RegSetValueExA(source, "PackageName", 0, REG_SZ,
4991 (const BYTE *)"idontexist.msi", 15);
4992 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4994 /* SourceList is altered */
4995 r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
4996 INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT,
4998 ok(r == ERROR_INSTALL_SOURCE_ABSENT,
4999 "Expected ERROR_INSTALL_SOURCE_ABSENT, got %d\n", r);
5000 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
5001 ok(pf_exists("msitest\\helium"), "File not installed\n");
5002 ok(pf_exists("msitest\\lithium"), "File not installed\n");
5003 ok(pf_exists("msitest"), "File not installed\n");
5005 /* restore PackageName */
5006 res = RegSetValueExA(source, "PackageName", 0, REG_SZ,
5007 (const BYTE *)packagename, lstrlenA(packagename) + 1);
5008 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
5010 /* restore LocalPackage */
5011 res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ,
5012 (const BYTE *)localpackage, lstrlenA(localpackage) + 1);
5013 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
5015 /* finally remove the product */
5016 r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5017 INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT,
5019 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5020 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
5021 ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
5022 ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
5023 ok(!delete_pf("msitest", FALSE), "File not removed\n");
5025 RegCloseKey(source);
5029 DeleteFileA("msitest\\hydrogen");
5030 DeleteFileA("msitest\\helium");
5031 DeleteFileA("msitest\\lithium");
5032 RemoveDirectoryA("msitest");
5033 DeleteFileA(msifile);
5036 static void test_missingcomponent(void)
5040 if (is_process_limited())
5042 skip("process is limited\n");
5046 CreateDirectoryA("msitest", NULL);
5047 create_file("msitest\\hydrogen", 500);
5048 create_file("msitest\\helium", 500);
5049 create_file("msitest\\lithium", 500);
5050 create_file("beryllium", 500);
5052 create_database(msifile, mcomp_tables, sizeof(mcomp_tables) / sizeof(msi_table));
5054 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5056 r = MsiInstallProductA(msifile, "INSTALLLEVEL=10 PROPVAR=42");
5057 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5059 skip("Not enough rights to perform tests\n");
5062 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5063 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
5064 ok(pf_exists("msitest\\helium"), "File not installed\n");
5065 ok(pf_exists("msitest\\lithium"), "File not installed\n");
5066 ok(!pf_exists("msitest\\beryllium"), "File installed\n");
5067 ok(pf_exists("msitest"), "File not installed\n");
5069 r = MsiInstallProductA(msifile, "REMOVE=ALL INSTALLLEVEL=10 PROPVAR=42");
5070 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5071 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
5072 ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
5073 ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
5074 ok(!pf_exists("msitest\\beryllium"), "File installed\n");
5075 ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
5078 DeleteFileA(msifile);
5079 DeleteFileA("msitest\\hydrogen");
5080 DeleteFileA("msitest\\helium");
5081 DeleteFileA("msitest\\lithium");
5082 DeleteFileA("beryllium");
5083 RemoveDirectoryA("msitest");
5086 static void test_sourcedirprop(void)
5089 CHAR props[MAX_PATH];
5091 if (is_process_limited())
5093 skip("process is limited\n");
5097 CreateDirectoryA("msitest", NULL);
5098 create_file("msitest\\augustus", 500);
5100 create_database(msifile, ca51_tables, sizeof(ca51_tables) / sizeof(msi_table));
5102 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5104 r = MsiInstallProductA(msifile, NULL);
5105 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5107 skip("Not enough rights to perform tests\n");
5110 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5111 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
5112 ok(delete_pf("msitest", FALSE), "File installed\n");
5114 DeleteFile("msitest\\augustus");
5115 RemoveDirectory("msitest");
5117 CreateDirectoryA("altsource", NULL);
5118 CreateDirectoryA("altsource\\msitest", NULL);
5119 create_file("altsource\\msitest\\augustus", 500);
5121 sprintf(props, "SRCDIR=%s\\altsource\\", CURR_DIR);
5123 r = MsiInstallProductA(msifile, props);
5124 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5125 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
5126 ok(delete_pf("msitest", FALSE), "File installed\n");
5128 DeleteFile("altsource\\msitest\\augustus");
5129 RemoveDirectory("altsource\\msitest");
5130 RemoveDirectory("altsource");
5133 DeleteFile("msitest\\augustus");
5134 RemoveDirectory("msitest");
5135 DeleteFile(msifile);
5138 static void test_adminimage(void)
5142 if (is_process_limited())
5144 skip("process is limited\n");
5148 CreateDirectoryA("msitest", NULL);
5149 CreateDirectoryA("msitest\\first", NULL);
5150 CreateDirectoryA("msitest\\second", NULL);
5151 CreateDirectoryA("msitest\\cabout", NULL);
5152 CreateDirectoryA("msitest\\cabout\\new", NULL);
5153 create_file("msitest\\one.txt", 100);
5154 create_file("msitest\\first\\two.txt", 100);
5155 create_file("msitest\\second\\three.txt", 100);
5156 create_file("msitest\\cabout\\four.txt", 100);
5157 create_file("msitest\\cabout\\new\\five.txt", 100);
5158 create_file("msitest\\filename", 100);
5159 create_file("msitest\\service.exe", 100);
5161 create_database_wordcount(msifile, ai_tables,
5162 sizeof(ai_tables) / sizeof(msi_table),
5163 100, msidbSumInfoSourceTypeAdminImage, ";1033");
5165 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5167 r = MsiInstallProductA(msifile, NULL);
5168 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5170 skip("Not enough rights to perform tests\n");
5173 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5175 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
5176 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
5177 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
5178 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
5179 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
5180 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
5181 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
5182 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
5183 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
5184 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
5185 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
5186 ok(delete_pf("msitest", FALSE), "File not installed\n");
5189 DeleteFileA("msifile");
5190 DeleteFileA("msitest\\cabout\\new\\five.txt");
5191 DeleteFileA("msitest\\cabout\\four.txt");
5192 DeleteFileA("msitest\\second\\three.txt");
5193 DeleteFileA("msitest\\first\\two.txt");
5194 DeleteFileA("msitest\\one.txt");
5195 DeleteFileA("msitest\\service.exe");
5196 DeleteFileA("msitest\\filename");
5197 RemoveDirectoryA("msitest\\cabout\\new");
5198 RemoveDirectoryA("msitest\\cabout");
5199 RemoveDirectoryA("msitest\\second");
5200 RemoveDirectoryA("msitest\\first");
5201 RemoveDirectoryA("msitest");
5204 static void test_propcase(void)
5208 if (is_process_limited())
5210 skip("process is limited\n");
5214 CreateDirectoryA("msitest", NULL);
5215 create_file("msitest\\augustus", 500);
5217 create_database(msifile, pc_tables, sizeof(pc_tables) / sizeof(msi_table));
5219 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5221 r = MsiInstallProductA(msifile, "MyProp=42");
5222 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5224 skip("Not enough rights to perform tests\n");
5227 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5228 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
5229 ok(delete_pf("msitest", FALSE), "File not installed\n");
5232 DeleteFile(msifile);
5233 DeleteFile("msitest\\augustus");
5234 RemoveDirectory("msitest");
5237 static void test_int_widths( void )
5239 static const char int0[] = "int0\ni0\nint0\tint0\n1";
5240 static const char int1[] = "int1\ni1\nint1\tint1\n1";
5241 static const char int2[] = "int2\ni2\nint2\tint2\n1";
5242 static const char int3[] = "int3\ni3\nint3\tint3\n1";
5243 static const char int4[] = "int4\ni4\nint4\tint4\n1";
5244 static const char int5[] = "int5\ni5\nint5\tint5\n1";
5245 static const char int8[] = "int8\ni8\nint8\tint8\n1";
5255 { int0, sizeof(int0) - 1, ERROR_SUCCESS },
5256 { int1, sizeof(int1) - 1, ERROR_SUCCESS },
5257 { int2, sizeof(int2) - 1, ERROR_SUCCESS },
5258 { int3, sizeof(int3) - 1, ERROR_FUNCTION_FAILED },
5259 { int4, sizeof(int4) - 1, ERROR_SUCCESS },
5260 { int5, sizeof(int5) - 1, ERROR_FUNCTION_FAILED },
5261 { int8, sizeof(int8) - 1, ERROR_FUNCTION_FAILED }
5264 char tmpdir[MAX_PATH], msitable[MAX_PATH], msidb[MAX_PATH];
5268 GetTempPathA(MAX_PATH, tmpdir);
5269 CreateDirectoryA(tmpdir, NULL);
5271 strcpy(msitable, tmpdir);
5272 strcat(msitable, "\\msitable.idt");
5274 strcpy(msidb, tmpdir);
5275 strcat(msidb, "\\msitest.msi");
5277 r = MsiOpenDatabaseA(msidb, MSIDBOPEN_CREATE, &db);
5278 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5280 for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
5282 write_file(msitable, tests[i].data, tests[i].size);
5284 r = MsiDatabaseImportA(db, tmpdir, "msitable.idt");
5285 ok(r == tests[i].ret, " %u expected %u, got %u\n", i, tests[i].ret, r);
5287 r = MsiDatabaseCommit(db);
5288 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5289 DeleteFileA(msitable);
5294 RemoveDirectoryA(tmpdir);
5297 static void test_shortcut(void)
5302 if (is_process_limited())
5304 skip("process is limited\n");
5308 create_test_files();
5309 create_database(msifile, sc_tables, sizeof(sc_tables) / sizeof(msi_table));
5311 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5313 r = MsiInstallProductA(msifile, NULL);
5314 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5316 skip("Not enough rights to perform tests\n");
5319 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5321 hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
5322 ok(SUCCEEDED(hr), "CoInitialize failed 0x%08x\n", hr);
5324 r = MsiInstallProductA(msifile, NULL);
5325 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5329 hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
5330 ok(SUCCEEDED(hr), "CoInitialize failed 0x%08x\n", hr);
5332 r = MsiInstallProductA(msifile, NULL);
5333 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5337 delete_pf("msitest\\cabout\\new\\five.txt", TRUE);
5338 delete_pf("msitest\\cabout\\new", FALSE);
5339 delete_pf("msitest\\cabout\\four.txt", TRUE);
5340 delete_pf("msitest\\cabout", FALSE);
5341 delete_pf("msitest\\changed\\three.txt", TRUE);
5342 delete_pf("msitest\\changed", FALSE);
5343 delete_pf("msitest\\first\\two.txt", TRUE);
5344 delete_pf("msitest\\first", FALSE);
5345 delete_pf("msitest\\filename", TRUE);
5346 delete_pf("msitest\\one.txt", TRUE);
5347 delete_pf("msitest\\service.exe", TRUE);
5348 delete_pf("msitest\\Shortcut.lnk", TRUE);
5349 delete_pf("msitest", FALSE);
5352 delete_test_files();
5353 DeleteFile(msifile);
5356 static void test_preselected(void)
5360 if (is_process_limited())
5362 skip("process is limited\n");
5366 create_test_files();
5367 create_database(msifile, ps_tables, sizeof(ps_tables) / sizeof(msi_table));
5369 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5371 r = MsiInstallProductA(msifile, "ADDLOCAL=One");
5372 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5374 skip("Not enough rights to perform tests\n");
5377 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5379 ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n");
5380 ok(!delete_pf("msitest\\cabout\\new", FALSE), "File installed\n");
5381 ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n");
5382 ok(!delete_pf("msitest\\cabout", FALSE), "File installed\n");
5383 ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n");
5384 ok(!delete_pf("msitest\\changed", FALSE), "File installed\n");
5385 ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n");
5386 ok(!delete_pf("msitest\\first", FALSE), "File installed\n");
5387 ok(!delete_pf("msitest\\filename", TRUE), "File installed\n");
5388 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
5389 ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n");
5390 ok(delete_pf("msitest", FALSE), "File not installed\n");
5392 r = MsiInstallProductA(msifile, NULL);
5393 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5395 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
5396 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
5397 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
5398 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
5399 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
5400 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
5401 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
5402 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
5403 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
5404 ok(!delete_pf("msitest\\one.txt", TRUE), "File installed\n");
5405 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
5406 ok(delete_pf("msitest", FALSE), "File not installed\n");
5409 delete_test_files();
5410 DeleteFile(msifile);
5413 static void test_installed_prop(void)
5415 static char prodcode[] = "{7df88a48-996f-4ec8-a022-bf956f9b2cbb}";
5418 if (is_process_limited())
5420 skip("process is limited\n");
5424 create_test_files();
5425 create_database(msifile, ip_tables, sizeof(ip_tables) / sizeof(msi_table));
5427 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5429 r = MsiInstallProductA(msifile, "FULL=1");
5430 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5432 skip("Not enough rights to perform tests\n");
5435 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5437 r = MsiInstallProductA(msifile, "FULL=1");
5438 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
5440 r = MsiConfigureProductExA(prodcode, INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT, "FULL=1");
5441 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
5443 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
5444 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
5445 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
5446 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
5447 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
5448 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
5449 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
5450 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
5451 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
5452 ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n");
5453 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
5454 ok(delete_pf("msitest", FALSE), "File not installed\n");
5456 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5457 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5460 delete_test_files();
5461 DeleteFile(msifile);
5464 static void test_allusers_prop(void)
5468 if (is_process_limited())
5470 skip("process is limited\n");
5474 create_test_files();
5475 create_database(msifile, aup_tables, sizeof(aup_tables) / sizeof(msi_table));
5477 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5479 /* ALLUSERS property unset */
5480 r = MsiInstallProductA(msifile, "FULL=1");
5481 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5483 skip("Not enough rights to perform tests\n");
5486 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5488 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
5489 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
5490 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
5491 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
5492 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
5493 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
5494 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
5495 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
5496 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
5497 ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n");
5498 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
5499 ok(delete_pf("msitest", FALSE), "File not installed\n");
5501 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5502 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5504 delete_test_files();
5506 create_test_files();
5507 create_database(msifile, aup2_tables, sizeof(aup2_tables) / sizeof(msi_table));
5509 /* ALLUSERS property set to 1 */
5510 r = MsiInstallProductA(msifile, "FULL=1");
5511 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5513 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
5514 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
5515 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
5516 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
5517 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
5518 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
5519 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
5520 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
5521 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
5522 ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n");
5523 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
5524 ok(delete_pf("msitest", FALSE), "File not installed\n");
5526 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5527 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5529 delete_test_files();
5531 create_test_files();
5532 create_database(msifile, aup3_tables, sizeof(aup3_tables) / sizeof(msi_table));
5534 /* ALLUSERS property set to 2 */
5535 r = MsiInstallProductA(msifile, "FULL=1");
5536 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5538 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
5539 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
5540 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
5541 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
5542 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
5543 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
5544 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
5545 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
5546 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
5547 ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n");
5548 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
5549 ok(delete_pf("msitest", FALSE), "File not installed\n");
5551 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5552 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5554 delete_test_files();
5556 create_test_files();
5557 create_database(msifile, aup4_tables, sizeof(aup4_tables) / sizeof(msi_table));
5559 /* ALLUSERS property set to 2, conditioned on ALLUSERS = 1 */
5560 r = MsiInstallProductA(msifile, "FULL=1");
5561 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
5564 delete_test_files();
5565 DeleteFile(msifile);
5568 static char session_manager[] = "System\\CurrentControlSet\\Control\\Session Manager";
5569 static char rename_ops[] = "PendingFileRenameOperations";
5571 static void process_pending_renames(HKEY hkey)
5573 char *buf, *src, *dst, *buf2, *buf2ptr;
5578 ret = RegQueryValueExA(hkey, rename_ops, NULL, NULL, NULL, &size);
5579 ok(!ret, "RegQueryValueExA failed %d\n", ret);
5581 buf = HeapAlloc(GetProcessHeap(), 0, size + 1);
5582 buf2ptr = buf2 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size + 1);
5584 ret = RegQueryValueExA(hkey, rename_ops, NULL, NULL, (LPBYTE)buf, &size);
5586 ok(!ret, "RegQueryValueExA failed %d\n", ret);
5589 for (src = buf; *src; src = dst + strlen(dst) + 1)
5591 DWORD flags = MOVEFILE_COPY_ALLOWED;
5594 dst = src + strlen(src) + 1;
5596 if (!strstr(src, "msitest"))
5598 lstrcpyA(buf2ptr, src);
5599 buf2ptr += strlen(src) + 1;
5602 lstrcpyA(buf2ptr, dst);
5603 buf2ptr += strlen(dst) + 1;
5613 flags |= MOVEFILE_REPLACE_EXISTING;
5616 if (src[0] == '\\' && src[1] == '?' && src[2] == '?' && src[3] == '\\') src += 4;
5619 if (dst[0] == '\\' && dst[1] == '?' && dst[2] == '?' && dst[3] == '\\') dst += 4;
5620 fileret = MoveFileExA(src, dst, flags);
5621 ok(fileret, "Failed to move file %s -> %s (%u)\n", src, dst, GetLastError());
5625 fileret = DeleteFileA(src);
5626 ok(fileret, "Failed to delete file %s (%u)\n", src, GetLastError());
5630 ok(found, "Expected a 'msitest' entry\n");
5633 RegSetValueExA(hkey, rename_ops, 0, REG_MULTI_SZ, (LPBYTE)buf2, buf2ptr + 1 - buf2);
5635 RegDeleteValueA(hkey, rename_ops);
5637 HeapFree(GetProcessHeap(), 0, buf);
5638 HeapFree(GetProcessHeap(), 0, buf2);
5641 static BOOL file_matches_data(LPCSTR file, LPCSTR data)
5643 DWORD len, data_len = strlen(data);
5647 handle = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
5648 ok(handle != INVALID_HANDLE_VALUE, "failed to open %s (%u)\n", file, GetLastError());
5650 if (ReadFile(handle, buf, sizeof(buf), &len, NULL) && len >= data_len)
5652 CloseHandle(handle);
5653 return !memcmp(buf, data, data_len);
5655 CloseHandle(handle);
5659 static void test_file_in_use(void)
5664 char path[MAX_PATH];
5666 if (is_process_limited())
5668 skip("process is limited\n");
5672 RegOpenKeyExA(HKEY_LOCAL_MACHINE, session_manager, 0, KEY_ALL_ACCESS, &hkey);
5674 CreateDirectoryA("msitest", NULL);
5675 create_file("msitest\\maximus", 500);
5676 create_database(msifile, fiu_tables, sizeof(fiu_tables) / sizeof(msi_table));
5678 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5680 lstrcpy(path, PROG_FILES_DIR);
5681 lstrcat(path, "\\msitest");
5682 CreateDirectoryA(path, NULL);
5684 lstrcat(path, "\\maximus");
5685 file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
5687 r = MsiInstallProductA(msifile, "REBOOT=ReallySuppress FULL=1");
5688 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5690 skip("Not enough rights to perform tests\n");
5693 ok(r == ERROR_SUCCESS_REBOOT_REQUIRED, "Expected ERROR_SUCCESS_REBOOT_REQUIRED got %u\n", r);
5694 ok(!file_matches_data(path, "msitest\\maximus"), "Expected file not to match\n");
5696 ok(!file_matches_data(path, "msitest\\maximus"), "Expected file not to match\n");
5698 process_pending_renames(hkey);
5701 ok(file_matches_data(path, "msitest\\maximus"), "Expected file to match\n");
5702 ok(delete_pf("msitest\\maximus", TRUE), "File not present\n");
5703 ok(delete_pf("msitest", FALSE), "Directory not present or not empty\n");
5705 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5706 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5711 delete_pf("msitest\\maximus", TRUE);
5712 delete_pf("msitest", FALSE);
5713 DeleteFileA("msitest\\maximus");
5714 delete_test_files();
5715 DeleteFile(msifile);
5718 static void test_file_in_use_cab(void)
5723 char path[MAX_PATH];
5725 if (is_process_limited())
5727 skip("process is limited\n");
5731 RegOpenKeyExA(HKEY_LOCAL_MACHINE, session_manager, 0, KEY_ALL_ACCESS, &hkey);
5733 CreateDirectoryA("msitest", NULL);
5734 create_file("maximus", 500);
5735 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
5736 DeleteFile("maximus");
5738 create_database(msifile, fiuc_tables, sizeof(fiuc_tables) / sizeof(msi_table));
5740 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5742 lstrcpy(path, PROG_FILES_DIR);
5743 lstrcat(path, "\\msitest");
5744 CreateDirectoryA(path, NULL);
5746 lstrcat(path, "\\maximus");
5747 file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
5749 r = MsiInstallProductA(msifile, "REBOOT=ReallySuppress FULL=1");
5750 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5752 skip("Not enough rights to perform tests\n");
5755 ok(r == ERROR_SUCCESS_REBOOT_REQUIRED, "Expected ERROR_SUCCESS_REBOOT_REQUIRED got %u\n", r);
5756 ok(!file_matches_data(path, "maximus"), "Expected file not to match\n");
5758 ok(!file_matches_data(path, "maximus"), "Expected file not to match\n");
5760 process_pending_renames(hkey);
5763 ok(file_matches_data(path, "maximus"), "Expected file to match\n");
5764 ok(delete_pf("msitest\\maximus", TRUE), "File not present\n");
5765 ok(delete_pf("msitest", FALSE), "Directory not present or not empty\n");
5767 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5768 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5773 delete_pf("msitest\\maximus", TRUE);
5774 delete_pf("msitest", FALSE);
5775 DeleteFileA("msitest\\maximus");
5777 delete_test_files();
5778 DeleteFile(msifile);
5781 static INT CALLBACK handler_a(LPVOID context, UINT type, LPCSTR msg)
5786 static INT CALLBACK handler_w(LPVOID context, UINT type, LPCWSTR msg)
5791 static INT CALLBACK handler_record(LPVOID context, UINT type, MSIHANDLE record)
5796 static void test_MsiSetExternalUI(void)
5798 INSTALLUI_HANDLERA ret_a;
5799 INSTALLUI_HANDLERW ret_w;
5800 INSTALLUI_HANDLER_RECORD prev;
5803 ret_a = MsiSetExternalUIA(handler_a, INSTALLLOGMODE_ERROR, NULL);
5804 ok(ret_a == NULL, "expected NULL, got %p\n", ret_a);
5806 ret_a = MsiSetExternalUIA(NULL, 0, NULL);
5807 ok(ret_a == handler_a, "expected %p, got %p\n", handler_a, ret_a);
5809 /* Not present before Installer 3.1 */
5810 if (!pMsiSetExternalUIRecord) {
5811 win_skip("MsiSetExternalUIRecord is not available\n");
5815 error = pMsiSetExternalUIRecord(handler_record, INSTALLLOGMODE_ERROR, NULL, &prev);
5816 ok(!error, "MsiSetExternalUIRecord failed %u\n", error);
5817 ok(prev == NULL, "expected NULL, got %p\n", prev);
5819 prev = (INSTALLUI_HANDLER_RECORD)0xdeadbeef;
5820 error = pMsiSetExternalUIRecord(NULL, INSTALLLOGMODE_ERROR, NULL, &prev);
5821 ok(!error, "MsiSetExternalUIRecord failed %u\n", error);
5822 ok(prev == handler_record, "expected %p, got %p\n", handler_record, prev);
5824 ret_w = MsiSetExternalUIW(handler_w, INSTALLLOGMODE_ERROR, NULL);
5825 ok(ret_w == NULL, "expected NULL, got %p\n", ret_w);
5827 ret_w = MsiSetExternalUIW(NULL, 0, NULL);
5828 ok(ret_w == handler_w, "expected %p, got %p\n", handler_w, ret_w);
5830 ret_a = MsiSetExternalUIA(handler_a, INSTALLLOGMODE_ERROR, NULL);
5831 ok(ret_a == NULL, "expected NULL, got %p\n", ret_a);
5833 ret_w = MsiSetExternalUIW(handler_w, INSTALLLOGMODE_ERROR, NULL);
5834 ok(ret_w == NULL, "expected NULL, got %p\n", ret_w);
5836 prev = (INSTALLUI_HANDLER_RECORD)0xdeadbeef;
5837 error = pMsiSetExternalUIRecord(handler_record, INSTALLLOGMODE_ERROR, NULL, &prev);
5838 ok(!error, "MsiSetExternalUIRecord failed %u\n", error);
5839 ok(prev == NULL, "expected NULL, got %p\n", prev);
5841 ret_a = MsiSetExternalUIA(NULL, 0, NULL);
5842 ok(ret_a == NULL, "expected NULL, got %p\n", ret_a);
5844 ret_w = MsiSetExternalUIW(NULL, 0, NULL);
5845 ok(ret_w == NULL, "expected NULL, got %p\n", ret_w);
5847 prev = (INSTALLUI_HANDLER_RECORD)0xdeadbeef;
5848 error = pMsiSetExternalUIRecord(NULL, 0, NULL, &prev);
5849 ok(!error, "MsiSetExternalUIRecord failed %u\n", error);
5850 ok(prev == handler_record, "expected %p, got %p\n", handler_record, prev);
5852 error = pMsiSetExternalUIRecord(handler_record, INSTALLLOGMODE_ERROR, NULL, NULL);
5853 ok(!error, "MsiSetExternalUIRecord failed %u\n", error);
5855 error = pMsiSetExternalUIRecord(NULL, 0, NULL, NULL);
5856 ok(!error, "MsiSetExternalUIRecord failed %u\n", error);
5859 static void test_feature_override(void)
5862 REGSAM access = KEY_ALL_ACCESS;
5864 if (is_process_limited())
5866 skip("process is limited\n");
5870 create_test_files();
5871 create_file("msitest\\override.txt", 1000);
5872 create_file("msitest\\preselected.txt", 1000);
5873 create_file("msitest\\notpreselected.txt", 1000);
5874 create_database(msifile, fo_tables, sizeof(fo_tables) / sizeof(msi_table));
5877 access |= KEY_WOW64_64KEY;
5879 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5881 r = MsiInstallProductA(msifile, "ADDLOCAL=override");
5882 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
5884 skip("Not enough rights to perform tests\n");
5887 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5889 ok(pf_exists("msitest\\override.txt"), "file not installed\n");
5890 ok(!pf_exists("msitest\\preselected.txt"), "file installed\n");
5891 ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n");
5893 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5894 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5896 ok(!delete_pf("msitest\\override.txt", TRUE), "file not removed\n");
5898 r = MsiInstallProductA(msifile, "preselect=1");
5899 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5901 ok(pf_exists("msitest\\override.txt"), "file not installed\n");
5902 ok(pf_exists("msitest\\preselected.txt"), "file not installed\n");
5903 ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n");
5905 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5906 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5908 ok(!delete_pf("msitest\\override.txt", TRUE), "file not removed\n");
5910 ok(delete_pf("msitest\\preselected.txt", TRUE), "file removed\n");
5911 ok(delete_pf("msitest", FALSE), "directory removed\n");
5914 r = MsiInstallProductA(msifile, NULL);
5915 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5917 ok(pf_exists("msitest\\override.txt"), "file not installed\n");
5918 ok(pf_exists("msitest\\preselected.txt"), "file not installed\n");
5919 ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n");
5921 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5922 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5924 ok(!delete_pf("msitest\\override.txt", TRUE), "file not removed\n");
5926 ok(delete_pf("msitest\\preselected.txt", TRUE), "file removed\n");
5927 ok(delete_pf("msitest", FALSE), "directory removed\n");
5930 delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", access);
5933 DeleteFileA("msitest\\override.txt");
5934 DeleteFileA("msitest\\preselected.txt");
5935 DeleteFileA("msitest\\notpreselected.txt");
5936 delete_test_files();
5937 DeleteFile(msifile);
5940 static void test_icon_table(void)
5942 MSIHANDLE hdb = 0, record;
5945 CHAR path[MAX_PATH];
5946 static const char prodcode[] = "{7DF88A49-996F-4EC8-A022-BF956F9B2CBB}";
5948 if (is_process_limited())
5950 skip("process is limited\n");
5954 create_database(msifile, icon_base_tables, sizeof(icon_base_tables) / sizeof(msi_table));
5956 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
5958 res = MsiOpenDatabase(msifile, MSIDBOPEN_TRANSACT, &hdb);
5959 ok(res == ERROR_SUCCESS, "failed to open db: %d\n", res);
5961 query = "CREATE TABLE `Icon` (`Name` CHAR(72) NOT NULL, `Data` OBJECT NOT NULL PRIMARY KEY `Name`)";
5962 res = run_query( hdb, 0, query );
5963 ok(res == ERROR_SUCCESS, "Can't create Icon table: %d\n", res);
5965 create_file("icon.ico", 100);
5966 record = MsiCreateRecord(1);
5967 res = MsiRecordSetStream(record, 1, "icon.ico");
5968 ok(res == ERROR_SUCCESS, "Failed to add stream data to record: %d\n", res);
5970 query = "INSERT INTO `Icon` (`Name`, `Data`) VALUES ('testicon', ?)";
5971 res = run_query(hdb, record, query);
5972 ok(res == ERROR_SUCCESS, "Insert into Icon table failed: %d\n", res);
5974 res = MsiCloseHandle(record);
5975 ok(res == ERROR_SUCCESS, "Failed to close record handle: %d\n", res);
5976 DeleteFileA("icon.ico");
5977 res = MsiDatabaseCommit(hdb);
5978 ok(res == ERROR_SUCCESS, "Failed to commit database: %d\n", res);
5979 res = MsiCloseHandle(hdb);
5980 ok(res == ERROR_SUCCESS, "Failed to close database: %d\n", res);
5983 res = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
5984 if (res == ERROR_INSTALL_PACKAGE_REJECTED)
5986 skip("Not enough rights to perform tests\n");
5987 DeleteFile(msifile);
5990 ok(res == ERROR_SUCCESS, "Failed to do per-user install: %d\n", res);
5992 lstrcpyA(path, APP_DATA_DIR);
5993 lstrcatA(path, "\\");
5994 lstrcatA(path, "Microsoft\\Installer\\");
5995 lstrcatA(path, prodcode);
5996 lstrcatA(path, "\\testicon");
5997 ok(file_exists(path), "Per-user icon file isn't where it's expected (%s)\n", path);
5999 res = MsiInstallProductA(msifile, "REMOVE=ALL");
6000 ok(res == ERROR_SUCCESS, "Failed to uninstall per-user\n");
6001 ok(!file_exists(path), "Per-user icon file not removed (%s)\n", path);
6004 res = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 ALLUSERS=1");
6005 ok(res == ERROR_SUCCESS, "Failed to system-wide install: %d\n", res);
6007 lstrcpyA(path, WINDOWS_DIR);
6008 lstrcatA(path, "\\");
6009 lstrcatA(path, "Installer\\");
6010 lstrcatA(path, prodcode);
6011 lstrcatA(path, "\\testicon");
6012 ok(file_exists(path), "System-wide icon file isn't where it's expected (%s)\n", path);
6014 res = MsiInstallProductA(msifile, "REMOVE=ALL");
6015 ok(res == ERROR_SUCCESS, "Failed to uninstall system-wide\n");
6016 ok(!file_exists(path), "System-wide icon file not removed (%s)\n", path);
6018 delete_pfmsitest_files();
6019 DeleteFile(msifile);
6022 static void test_sourcedir_props(void)
6026 if (is_process_limited())
6028 skip("process is limited\n");
6032 create_test_files();
6033 create_file("msitest\\sourcedir.txt", 1000);
6034 create_database(msifile, sd_tables, sizeof(sd_tables) / sizeof(msi_table));
6036 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
6038 /* full UI, no ResolveSource action */
6039 r = MsiInstallProductA(msifile, NULL);
6040 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6042 r = MsiInstallProductA(msifile, "REMOVE=ALL");
6043 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6045 ok(!delete_pf("msitest\\sourcedir.txt", TRUE), "file not removed\n");
6046 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
6048 /* full UI, ResolveSource action */
6049 r = MsiInstallProductA(msifile, "ResolveSource=1");
6050 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6052 r = MsiInstallProductA(msifile, "REMOVE=ALL");
6053 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6055 ok(!delete_pf("msitest\\sourcedir.txt", TRUE), "file not removed\n");
6056 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
6058 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
6060 /* no UI, no ResolveSource action */
6061 r = MsiInstallProductA(msifile, NULL);
6062 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6064 r = MsiInstallProductA(msifile, "REMOVE=ALL");
6065 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6067 ok(!delete_pf("msitest\\sourcedir.txt", TRUE), "file not removed\n");
6068 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
6070 /* no UI, ResolveSource action */
6071 r = MsiInstallProductA(msifile, "ResolveSource=1");
6072 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6074 r = MsiInstallProductA(msifile, "REMOVE=ALL");
6075 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6077 ok(!delete_pf("msitest\\sourcedir.txt", TRUE), "file not removed\n");
6078 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
6080 DeleteFileA("msitest\\sourcedir.txt");
6081 DeleteFile(msifile);
6084 static void test_package_validation(void)
6088 if (is_process_limited())
6090 skip("process is limited\n");
6094 CreateDirectoryA("msitest", NULL);
6095 create_file("msitest\\maximus", 500);
6096 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;1033");
6098 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
6100 r = MsiInstallProductA(msifile, NULL);
6101 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
6103 skip("Not enough rights to perform tests\n");
6106 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6107 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
6108 ok(delete_pf("msitest", FALSE), "directory does not exist\n");
6110 DeleteFile(msifile);
6111 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;9999");
6113 r = MsiInstallProductA(msifile, NULL);
6114 ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r);
6115 ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n");
6116 ok(!delete_pf("msitest", FALSE), "directory exists\n");
6118 if (GetSystemDefaultLangID() == MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US ))
6120 DeleteFile(msifile);
6121 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;9");
6122 r = MsiInstallProductA(msifile, NULL);
6123 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6124 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
6125 ok(delete_pf("msitest", FALSE), "directory does not exist\n");
6127 DeleteFile(msifile);
6128 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;1024");
6129 r = MsiInstallProductA(msifile, NULL);
6130 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6131 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
6132 ok(delete_pf("msitest", FALSE), "directory does not exist\n");
6135 DeleteFile(msifile);
6136 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel32;0");
6138 r = MsiInstallProductA(msifile, NULL);
6139 ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
6140 ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n");
6141 ok(!delete_pf("msitest", FALSE), "directory exists\n");
6143 if (is_64bit && !is_wow64)
6145 DeleteFile(msifile);
6146 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0");
6148 r = MsiInstallProductA(msifile, NULL);
6149 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6150 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
6151 ok(delete_pf("msitest", FALSE), "directory does not exist\n");
6153 DeleteFile(msifile);
6154 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0");
6156 r = MsiInstallProductA(msifile, NULL);
6157 ok(r == ERROR_INSTALL_PACKAGE_INVALID, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r);
6158 ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n");
6159 ok(!delete_pf("msitest", FALSE), "directory exists\n");
6161 DeleteFile(msifile);
6162 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0");
6164 r = MsiInstallProductA(msifile, NULL);
6165 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6166 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
6167 ok(delete_pf("msitest", FALSE), "directory does not exist\n");
6171 DeleteFile(msifile);
6172 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0");
6174 r = MsiInstallProductA(msifile, NULL);
6175 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6176 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
6177 ok(delete_pf("msitest", FALSE), "directory does not exist\n");
6179 DeleteFile(msifile);
6180 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0");
6182 r = MsiInstallProductA(msifile, NULL);
6183 ok(r == ERROR_INSTALL_PACKAGE_INVALID, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r);
6184 ok(!delete_pf_native("msitest\\maximus", TRUE), "file exists\n");
6185 ok(!delete_pf_native("msitest", FALSE), "directory exists\n");
6187 DeleteFile(msifile);
6188 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0");
6190 r = MsiInstallProductA(msifile, NULL);
6191 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6192 ok(delete_pf_native("msitest\\maximus", TRUE), "file exists\n");
6193 ok(delete_pf_native("msitest", FALSE), "directory exists\n");
6197 DeleteFile(msifile);
6198 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0");
6200 r = MsiInstallProductA(msifile, NULL);
6201 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6202 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
6203 ok(delete_pf("msitest", FALSE), "directory does not exist\n");
6205 DeleteFile(msifile);
6206 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0");
6208 r = MsiInstallProductA(msifile, NULL);
6209 ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
6210 ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n");
6211 ok(!delete_pf("msitest", FALSE), "directory exists\n");
6213 DeleteFile(msifile);
6214 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0");
6216 r = MsiInstallProductA(msifile, NULL);
6217 ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
6218 ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n");
6219 ok(!delete_pf("msitest", FALSE), "directory exists\n");
6223 /* Delete the files in the temp (current) folder */
6224 DeleteFile(msifile);
6225 DeleteFile("msitest\\maximus");
6226 RemoveDirectory("msitest");
6229 static void test_command_line_parsing(void)
6234 if (is_process_limited())
6236 skip("process is limited\n");
6240 create_test_files();
6241 create_database(msifile, cl_tables, sizeof(cl_tables)/sizeof(msi_table));
6243 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
6246 r = MsiInstallProductA(msifile, cmd);
6247 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6250 r = MsiInstallProductA(msifile, cmd);
6251 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6254 r = MsiInstallProductA(msifile, cmd);
6255 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6258 r = MsiInstallProductA(msifile, cmd);
6259 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6262 r = MsiInstallProductA(msifile, cmd);
6263 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6266 r = MsiInstallProductA(msifile, cmd);
6267 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6270 r = MsiInstallProductA(msifile, cmd);
6271 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6274 r = MsiInstallProductA(msifile, cmd);
6275 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6278 r = MsiInstallProductA(msifile, cmd);
6279 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6282 r = MsiInstallProductA(msifile, cmd);
6283 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6286 r = MsiInstallProductA(msifile, cmd);
6287 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6290 r = MsiInstallProductA(msifile, cmd);
6291 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6294 r = MsiInstallProductA(msifile, cmd);
6295 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6298 r = MsiInstallProductA(msifile, cmd);
6299 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6302 r = MsiInstallProductA(msifile, cmd);
6303 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6306 r = MsiInstallProductA(msifile, cmd);
6307 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6310 r = MsiInstallProductA(msifile, cmd);
6311 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
6314 r = MsiInstallProductA(msifile, cmd);
6315 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
6318 r = MsiInstallProductA(msifile, cmd);
6319 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6322 r = MsiInstallProductA(msifile, cmd);
6323 todo_wine ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6326 r = MsiInstallProductA(msifile, cmd);
6327 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
6329 cmd = "P= \"one\" ";
6330 r = MsiInstallProductA(msifile, cmd);
6331 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
6333 cmd = "P=\"one\"\"";
6334 r = MsiInstallProductA(msifile, cmd);
6335 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6337 cmd = "P=\"\"one\"";
6338 r = MsiInstallProductA(msifile, cmd);
6339 ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6341 cmd = "P=\"\"one\"\"";
6342 r = MsiInstallProductA(msifile, cmd);
6343 todo_wine ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r);
6345 cmd = "P=\"one two\"";
6346 r = MsiInstallProductA(msifile, cmd);
6347 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6349 cmd = "P=\"\"\"one\"\" two\"";
6350 r = MsiInstallProductA(msifile, cmd);
6351 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6353 cmd = "P=\"\"\"one\"\" two\" Q=three";
6354 r = MsiInstallProductA(msifile, cmd);
6355 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6357 cmd = "P=\"\" Q=\"two\"";
6358 r = MsiInstallProductA(msifile, cmd);
6359 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6361 cmd = "P=\"one\" Q=\"two\"";
6362 r = MsiInstallProductA(msifile, cmd);
6363 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
6365 cmd = "P=\"one=two\"";
6366 r = MsiInstallProductA(msifile, cmd);
6367 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6369 cmd = "Q=\"\" P=\"one\"";
6370 r = MsiInstallProductA(msifile, cmd);
6371 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
6373 cmd = "P=\"\"\"one\"\"\" Q=\"two\"";
6374 r = MsiInstallProductA(msifile, cmd);
6375 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6377 cmd = "P=\"one \"\"two\"\"\" Q=\"three\"";
6378 r = MsiInstallProductA(msifile, cmd);
6379 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6381 cmd = "P=\"\"\"one\"\" two\" Q=\"three\"";
6382 r = MsiInstallProductA(msifile, cmd);
6383 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6385 DeleteFile(msifile);
6386 RemoveDirectory("msitest");
6389 static void test_upgrade_code(void)
6393 if (is_process_limited())
6395 skip("process is limited\n");
6399 CreateDirectoryA("msitest", NULL);
6400 create_file("msitest\\upgradecode.txt", 1000);
6401 create_database(msifile, uc_tables, sizeof(uc_tables) / sizeof(msi_table));
6403 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
6405 r = MsiInstallProductA(msifile, NULL);
6406 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6408 ok(pf_exists("msitest\\upgradecode.txt"), "file not installed\n");
6410 r = MsiInstallProductA(msifile, "REMOVE=ALL");
6411 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6413 ok(!delete_pf("msitest\\upgradecode.txt", TRUE), "file not removed\n");
6414 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
6416 DeleteFileA("msitest\\upgradecode.txt");
6417 RemoveDirectoryA("msitest");
6418 DeleteFile(msifile);
6421 static void test_MsiGetFeatureInfo(void)
6425 char title[32], help[32], path[MAX_PATH];
6426 DWORD attrs, title_len, help_len;
6428 if (is_process_limited())
6430 skip("process is limited\n");
6433 create_database( msifile, tables, sizeof(tables) / sizeof(tables[0]) );
6435 strcpy( path, CURR_DIR );
6436 strcat( path, "\\" );
6437 strcat( path, msifile );
6439 r = MsiOpenPackage( path, &package );
6440 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
6442 skip("Not enough rights to perform tests\n");
6443 DeleteFileA( msifile );
6446 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6448 r = MsiGetFeatureInfoA( 0, NULL, NULL, NULL, NULL, NULL, NULL );
6449 ok(r == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", r);
6451 r = MsiGetFeatureInfoA( package, NULL, NULL, NULL, NULL, NULL, NULL );
6452 ok(r == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", r);
6454 r = MsiGetFeatureInfoA( package, "", NULL, NULL, NULL, NULL, NULL );
6455 ok(r == ERROR_UNKNOWN_FEATURE, "expected ERROR_UNKNOWN_FEATURE, got %u\n", r);
6457 r = MsiGetFeatureInfoA( package, "One", NULL, NULL, NULL, NULL, NULL );
6458 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6460 r = MsiGetFeatureInfoA( 0, "One", NULL, NULL, NULL, NULL, NULL );
6461 ok(r == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %u\n", r);
6463 title_len = help_len = 0;
6464 r = MsiGetFeatureInfoA( package, "One", NULL, NULL, &title_len, NULL, &help_len );
6465 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6466 ok(title_len == 3, "expected 3, got %u\n", title_len);
6467 ok(help_len == 15, "expected 15, got %u\n", help_len);
6469 title[0] = help[0] = 0;
6470 title_len = help_len = 0;
6471 r = MsiGetFeatureInfoA( package, "One", NULL, title, &title_len, help, &help_len );
6472 ok(r == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %u\n", r);
6473 ok(title_len == 3, "expected 3, got %u\n", title_len);
6474 ok(help_len == 15, "expected 15, got %u\n", help_len);
6477 title[0] = help[0] = 0;
6478 title_len = sizeof(title);
6479 help_len = sizeof(help);
6480 r = MsiGetFeatureInfoA( package, "One", &attrs, title, &title_len, help, &help_len );
6481 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6482 ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORLOCAL, "expected INSTALLFEATUREATTRIBUTE_FAVORLOCAL, got %u\n", attrs);
6483 ok(title_len == 3, "expected 3, got %u\n", title_len);
6484 ok(help_len == 15, "expected 15, got %u\n", help_len);
6485 ok(!strcmp(title, "One"), "expected \"One\", got \"%s\"\n", title);
6486 ok(!strcmp(help, "The One Feature"), "expected \"The One Feature\", got \"%s\"\n", help);
6489 title[0] = help[0] = 0;
6490 title_len = sizeof(title);
6491 help_len = sizeof(help);
6492 r = MsiGetFeatureInfoA( package, "feature", &attrs, title, &title_len, help, &help_len );
6493 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6494 ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORLOCAL, "expected INSTALLFEATUREATTRIBUTE_FAVORLOCAL, got %u\n", attrs);
6495 ok(!title_len, "expected 0, got %u\n", title_len);
6496 ok(!help_len, "expected 0, got %u\n", help_len);
6497 ok(!title[0], "expected \"\", got \"%s\"\n", title);
6498 ok(!help[0], "expected \"\", got \"%s\"\n", help);
6500 MsiCloseHandle( package );
6501 DeleteFileA( msifile );
6504 static void test_MsiSetFeatureAttributes(void)
6508 char path[MAX_PATH];
6511 if (is_process_limited())
6513 skip("process is limited\n");
6516 create_database( msifile, tables, sizeof(tables) / sizeof(tables[0]) );
6518 strcpy( path, CURR_DIR );
6519 strcat( path, "\\" );
6520 strcat( path, msifile );
6522 r = MsiOpenPackage( path, &package );
6523 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
6525 skip("Not enough rights to perform tests\n");
6526 DeleteFileA( msifile );
6529 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6531 r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
6532 ok(r == ERROR_FUNCTION_FAILED, "Expected ERROR_FUNCTION_FAILED, got %u\n", r);
6534 r = MsiDoAction( package, "CostInitialize" );
6535 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6537 r = MsiSetFeatureAttributesA( 0, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
6538 ok(r == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %u\n", r);
6540 r = MsiSetFeatureAttributesA( package, "", INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
6541 ok(r == ERROR_UNKNOWN_FEATURE, "expected ERROR_UNKNOWN_FEATURE, got %u\n", r);
6543 r = MsiSetFeatureAttributesA( package, NULL, INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
6544 ok(r == ERROR_UNKNOWN_FEATURE, "expected ERROR_UNKNOWN_FEATURE, got %u\n", r);
6546 r = MsiSetFeatureAttributesA( package, "One", 0 );
6547 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6550 r = MsiGetFeatureInfoA( package, "One", &attrs, NULL, NULL, NULL, NULL );
6551 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6552 ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORLOCAL,
6553 "expected INSTALLFEATUREATTRIBUTE_FAVORLOCAL, got 0x%08x\n", attrs);
6555 r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
6556 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6559 r = MsiGetFeatureInfoA( package, "One", &attrs, NULL, NULL, NULL, NULL );
6560 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6561 ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORLOCAL,
6562 "expected INSTALLFEATUREATTRIBUTE_FAVORLOCAL, got 0x%08x\n", attrs);
6564 r = MsiDoAction( package, "FileCost" );
6565 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6567 r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORSOURCE );
6568 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6571 r = MsiGetFeatureInfoA( package, "One", &attrs, NULL, NULL, NULL, NULL );
6572 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6573 ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORSOURCE,
6574 "expected INSTALLFEATUREATTRIBUTE_FAVORSOURCE, got 0x%08x\n", attrs);
6576 r = MsiDoAction( package, "CostFinalize" );
6577 ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
6579 r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
6580 ok(r == ERROR_FUNCTION_FAILED, "expected ERROR_FUNCTION_FAILED, got %u\n", r);
6582 MsiCloseHandle( package );
6583 DeleteFileA( msifile );
6589 char temp_path[MAX_PATH], prev_path[MAX_PATH], log_file[MAX_PATH];
6590 STATEMGRSTATUS status;
6593 init_functionpointers();
6595 if (pIsWow64Process)
6596 pIsWow64Process(GetCurrentProcess(), &is_wow64);
6598 GetCurrentDirectoryA(MAX_PATH, prev_path);
6599 GetTempPath(MAX_PATH, temp_path);
6600 SetCurrentDirectoryA(temp_path);
6602 lstrcpyA(CURR_DIR, temp_path);
6603 len = lstrlenA(CURR_DIR);
6605 if(len && (CURR_DIR[len - 1] == '\\'))
6606 CURR_DIR[len - 1] = 0;
6608 ok(get_system_dirs(), "failed to retrieve system dirs\n");
6609 ok(get_user_dirs(), "failed to retrieve user dirs\n");
6611 /* Create a restore point ourselves so we circumvent the multitude of restore points
6612 * that would have been created by all the installation and removal tests.
6614 * This is not needed on version 5.0 where setting MSIFASTINSTALL prevents the
6615 * creation of restore points.
6617 if (pSRSetRestorePointA && !pMsiGetComponentPathExA)
6619 memset(&status, 0, sizeof(status));
6620 ret = notify_system_change(BEGIN_NESTED_SYSTEM_CHANGE, &status);
6623 /* Create only one log file and don't append. We have to pass something
6624 * for the log mode for this to work. The logfile needs to have an absolute
6625 * path otherwise we still end up with some extra logfiles as some tests
6626 * change the current directory.
6628 lstrcpyA(log_file, temp_path);
6629 lstrcatA(log_file, "\\msitest.log");
6630 MsiEnableLogA(INSTALLLOGMODE_FATALEXIT, log_file, 0);
6632 test_MsiInstallProduct();
6633 test_MsiSetComponentState();
6634 test_packagecoltypes();
6635 test_continuouscabs();
6638 test_samesequence();
6639 test_uiLevelFlags();
6640 test_readonlyfile();
6641 test_readonlyfile_cab();
6642 test_setdirproperty();
6643 test_cabisextracted();
6644 test_concurrentinstall();
6645 test_setpropertyfolder();
6646 test_transformprop();
6647 test_currentworkingdir();
6651 test_sourcefolder();
6652 test_customaction51();
6653 test_installstate();
6655 test_MsiConfigureProductEx();
6656 test_missingcomponent();
6657 test_sourcedirprop();
6662 test_lastusedsource();
6664 test_installed_prop();
6666 test_file_in_use_cab();
6667 test_MsiSetExternalUI();
6668 test_allusers_prop();
6669 test_feature_override();
6671 test_sourcedir_props();
6672 test_package_validation();
6673 test_command_line_parsing();
6674 test_upgrade_code();
6675 test_MsiGetFeatureInfo();
6676 test_MsiSetFeatureAttributes();
6678 DeleteFileA(log_file);
6680 if (pSRSetRestorePointA && !pMsiGetComponentPathExA && ret)
6682 ret = notify_system_change(END_NESTED_SYSTEM_CHANGE, &status);
6684 remove_restore_point(status.llSequenceNumber);
6686 FreeLibrary(hsrclient);
6688 SetCurrentDirectoryA(prev_path);