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>
34 #include "wine/test.h"
36 static UINT (WINAPI
*pMsiQueryComponentStateA
)
37 (LPCSTR
, LPCSTR
, MSIINSTALLCONTEXT
, LPCSTR
, INSTALLSTATE
*);
38 static UINT (WINAPI
*pMsiSourceListEnumSourcesA
)
39 (LPCSTR
, LPCSTR
, MSIINSTALLCONTEXT
, DWORD
, DWORD
, LPSTR
, LPDWORD
);
40 static UINT (WINAPI
*pMsiSourceListGetInfoA
)
41 (LPCSTR
, LPCSTR
, MSIINSTALLCONTEXT
, DWORD
, LPCSTR
, LPSTR
, LPDWORD
);
43 static HMODULE hsrclient
= 0;
44 static BOOL (WINAPI
*pSRRemoveRestorePoint
)(DWORD
);
45 static BOOL (WINAPI
*pSRSetRestorePointA
)(RESTOREPOINTINFOA
*, STATEMGRSTATUS
*);
47 static BOOL on_win9x
= FALSE
;
49 static const char *msifile
= "msitest.msi";
50 static const char *msifile2
= "winetest2.msi";
51 static const char *mstfile
= "winetest.mst";
52 static CHAR CURR_DIR
[MAX_PATH
];
53 static CHAR PROG_FILES_DIR
[MAX_PATH
];
54 static CHAR COMMON_FILES_DIR
[MAX_PATH
];
56 /* msi database data */
58 static const CHAR component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
59 "s72\tS38\ts72\ti2\tS255\tS72\n"
60 "Component\tComponent\n"
61 "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n"
62 "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n"
63 "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\t\tone.txt\n"
64 "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n"
65 "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n"
66 "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n"
67 "component\t\tMSITESTDIR\t0\t1\tfile\n"
68 "service_comp\t\tMSITESTDIR\t0\t1\tservice_file";
70 static const CHAR directory_dat
[] = "Directory\tDirectory_Parent\tDefaultDir\n"
72 "Directory\tDirectory\n"
73 "CABOUTDIR\tMSITESTDIR\tcabout\n"
74 "CHANGEDDIR\tMSITESTDIR\tchanged:second\n"
75 "FIRSTDIR\tMSITESTDIR\tfirst\n"
76 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
77 "NEWDIR\tCABOUTDIR\tnew\n"
78 "ProgramFilesFolder\tTARGETDIR\t.\n"
79 "TARGETDIR\t\tSourceDir";
81 static const CHAR feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
82 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
84 "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n"
85 "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n"
86 "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n"
87 "Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n"
88 "Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n"
89 "feature\t\t\t\t2\t1\tTARGETDIR\t0\n"
90 "service_feature\t\t\t\t2\t1\tTARGETDIR\t0";
92 static const CHAR feature_comp_dat
[] = "Feature_\tComponent_\n"
94 "FeatureComponents\tFeature_\tComponent_\n"
100 "feature\tcomponent\n"
101 "service_feature\tservice_comp\n";
103 static const CHAR file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
104 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
106 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
107 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
108 "one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n"
109 "three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n"
110 "two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n"
111 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
112 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1";
114 static const CHAR install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
116 "InstallExecuteSequence\tAction\n"
117 "AllocateRegistrySpace\tNOT Installed\t1550\n"
118 "CostFinalize\t\t1000\n"
119 "CostInitialize\t\t800\n"
121 "ResolveSource\t\t950\n"
122 "MoveFiles\t\t1700\n"
123 "InstallFiles\t\t4000\n"
124 "DuplicateFiles\t\t4500\n"
125 "InstallServices\t\t5000\n"
126 "InstallFinalize\t\t6600\n"
127 "InstallInitialize\t\t1500\n"
128 "InstallValidate\t\t1400\n"
129 "LaunchConditions\t\t100\n"
130 "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000";
132 static const CHAR media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
133 "i2\ti4\tL64\tS255\tS32\tS72\n"
135 "1\t3\t\t\tDISK1\t\n"
136 "2\t5\t\tmsitest.cab\tDISK2\t\n";
138 static const CHAR property_dat
[] = "Property\tValue\n"
140 "Property\tProperty\n"
141 "DefaultUIFont\tDlgFont8\n"
144 "InstallMode\tTypical\n"
145 "Manufacturer\tWine\n"
146 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
147 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
149 "ProductLanguage\t1033\n"
150 "ProductName\tMSITEST\n"
151 "ProductVersion\t1.1.1\n"
152 "PROMPTROLLBACKCOST\tP\n"
154 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
155 "AdminProperties\tPOSTADMIN\n"
157 "SERVNAME\tTestService\n"
158 "SERVDISP\tTestServiceDisp\n";
160 static const CHAR registry_dat
[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
161 "s72\ti2\tl255\tL255\tL0\ts72\n"
162 "Registry\tRegistry\n"
163 "Apples\t2\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n"
164 "Oranges\t2\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n"
165 "regdata\t2\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n"
166 "OrderTest\t2\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent";
168 static const CHAR service_install_dat
[] = "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
169 "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n"
170 "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n"
171 "ServiceInstall\tServiceInstall\n"
172 "TestService\t[SERVNAME]\t[SERVDISP]\t2\t3\t0\t\t\tTestService\t\t\tservice_comp\t\t";
174 static const CHAR service_control_dat
[] = "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
175 "s72\tl255\ti2\tL255\tI2\ts72\n"
176 "ServiceControl\tServiceControl\n"
177 "ServiceControl\tTestService\t8\t\t0\tservice_comp";
179 /* tables for test_continuouscabs */
180 static const CHAR cc_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
181 "s72\tS38\ts72\ti2\tS255\tS72\n"
182 "Component\tComponent\n"
183 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
184 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
185 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
187 static const CHAR cc2_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
188 "s72\tS38\ts72\ti2\tS255\tS72\n"
189 "Component\tComponent\n"
190 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
191 "augustus\t\tMSITESTDIR\t0\t0\taugustus\n"
192 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
194 static const CHAR cc_feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
195 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
197 "feature\t\t\t\t2\t1\tTARGETDIR\t0";
199 static const CHAR cc_feature_comp_dat
[] = "Feature_\tComponent_\n"
201 "FeatureComponents\tFeature_\tComponent_\n"
203 "feature\taugustus\n"
206 static const CHAR cc_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
207 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
209 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
210 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
211 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
213 static const CHAR cc2_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
214 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
216 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
217 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
218 "tiberius\tmaximus\ttiberius\t500\t\t\t16384\t3\n"
219 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
221 static const CHAR cc_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
222 "i2\ti4\tL64\tS255\tS32\tS72\n"
224 "1\t10\t\ttest1.cab\tDISK1\t\n"
225 "2\t2\t\ttest2.cab\tDISK2\t\n"
226 "3\t12\t\ttest3.cab\tDISK3\t\n";
228 static const CHAR co_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
229 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
231 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
232 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
233 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
235 static const CHAR co_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
236 "i2\ti4\tL64\tS255\tS32\tS72\n"
238 "1\t10\t\ttest1.cab\tDISK1\t\n"
239 "2\t2\t\ttest2.cab\tDISK2\t\n"
240 "3\t3\t\ttest3.cab\tDISK3\t\n";
242 static const CHAR co2_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
243 "i2\ti4\tL64\tS255\tS32\tS72\n"
245 "1\t10\t\ttest1.cab\tDISK1\t\n"
246 "2\t12\t\ttest3.cab\tDISK3\t\n"
247 "3\t2\t\ttest2.cab\tDISK2\t\n";
249 static const CHAR mm_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
250 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
252 "maximus\tmaximus\tmaximus\t500\t\t\t512\t1\n"
253 "augustus\taugustus\taugustus\t500\t\t\t512\t2\n"
254 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
256 static const CHAR mm_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
257 "i2\ti4\tL64\tS255\tS32\tS72\n"
259 "1\t3\t\ttest1.cab\tDISK1\t\n";
261 static const CHAR ss_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
262 "i2\ti4\tL64\tS255\tS32\tS72\n"
264 "1\t2\t\ttest1.cab\tDISK1\t\n"
265 "2\t2\t\ttest2.cab\tDISK2\t\n"
266 "3\t12\t\ttest3.cab\tDISK3\t\n";
268 /* tables for test_uiLevelFlags */
269 static const CHAR ui_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
270 "s72\tS38\ts72\ti2\tS255\tS72\n"
271 "Component\tComponent\n"
272 "maximus\t\tMSITESTDIR\t0\tHASUIRUN=1\tmaximus\n"
273 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
274 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
276 static const CHAR ui_install_ui_seq_dat
[] = "Action\tCondition\tSequence\n"
278 "InstallUISequence\tAction\n"
279 "SetUIProperty\t\t5\n"
280 "ExecuteAction\t\t1100\n";
282 static const CHAR ui_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
283 "s72\ti2\tS64\tS0\tS255\n"
284 "CustomAction\tAction\n"
285 "SetUIProperty\t51\tHASUIRUN\t1\t\n";
287 static const CHAR rof_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
288 "s72\tS38\ts72\ti2\tS255\tS72\n"
289 "Component\tComponent\n"
290 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n";
292 static const CHAR rof_feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
293 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
295 "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n"
296 "montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0";
298 static const CHAR rof_feature_comp_dat
[] = "Feature_\tComponent_\n"
300 "FeatureComponents\tFeature_\tComponent_\n"
302 "montecristo\tmaximus";
304 static const CHAR rof_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
305 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
307 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1";
309 static const CHAR rof_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
310 "i2\ti4\tL64\tS255\tS32\tS72\n"
312 "1\t1\t\t\tDISK1\t\n";
314 static const CHAR sdp_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
316 "InstallExecuteSequence\tAction\n"
317 "AllocateRegistrySpace\tNOT Installed\t1550\n"
318 "CostFinalize\t\t1000\n"
319 "CostInitialize\t\t800\n"
321 "InstallFiles\t\t4000\n"
322 "InstallFinalize\t\t6600\n"
323 "InstallInitialize\t\t1500\n"
324 "InstallValidate\t\t1400\n"
325 "LaunchConditions\t\t100\n"
326 "SetDirProperty\t\t950";
328 static const CHAR sdp_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
329 "s72\ti2\tS64\tS0\tS255\n"
330 "CustomAction\tAction\n"
331 "SetDirProperty\t51\tMSITESTDIR\t[CommonFilesFolder]msitest\\\t\n";
333 static const CHAR cie_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
334 "s72\tS38\ts72\ti2\tS255\tS72\n"
335 "Component\tComponent\n"
336 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
337 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
338 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
339 "gaius\t\tMSITESTDIR\t0\t1\tgaius\n";
341 static const CHAR cie_feature_comp_dat
[] = "Feature_\tComponent_\n"
343 "FeatureComponents\tFeature_\tComponent_\n"
345 "feature\taugustus\n"
349 static const CHAR cie_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
350 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
352 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
353 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
354 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12\n"
355 "gaius\tgaius\tgaius\t500\t\t\t8192\t11";
357 static const CHAR cie_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
358 "i2\ti4\tL64\tS255\tS32\tS72\n"
360 "1\t1\t\ttest1.cab\tDISK1\t\n"
361 "2\t2\t\ttest2.cab\tDISK2\t\n"
362 "3\t12\t\ttest3.cab\tDISK3\t\n";
364 static const CHAR ci_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
366 "InstallExecuteSequence\tAction\n"
367 "CostFinalize\t\t1000\n"
368 "CostInitialize\t\t800\n"
370 "InstallFiles\t\t4000\n"
371 "InstallServices\t\t5000\n"
372 "InstallFinalize\t\t6600\n"
373 "InstallInitialize\t\t1500\n"
374 "RunInstall\t\t1600\n"
375 "InstallValidate\t\t1400\n"
376 "LaunchConditions\t\t100";
378 static const CHAR ci_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
379 "s72\ti2\tS64\tS0\tS255\n"
380 "CustomAction\tAction\n"
381 "RunInstall\t87\tmsitest\\concurrent.msi\tMYPROP=[UILevel]\t\n";
383 static const CHAR ci_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
384 "s72\tS38\ts72\ti2\tS255\tS72\n"
385 "Component\tComponent\n"
386 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n";
388 static const CHAR ci2_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
389 "s72\tS38\ts72\ti2\tS255\tS72\n"
390 "Component\tComponent\n"
391 "augustus\t\tMSITESTDIR\t0\tUILevel=3 AND MYPROP=5\taugustus\n";
393 static const CHAR ci2_feature_comp_dat
[] = "Feature_\tComponent_\n"
395 "FeatureComponents\tFeature_\tComponent_\n"
398 static const CHAR ci2_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
399 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
401 "augustus\taugustus\taugustus\t500\t\t\t8192\t1";
403 static const CHAR spf_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
404 "s72\ti2\tS64\tS0\tS255\n"
405 "CustomAction\tAction\n"
406 "SetFolderProp\t51\tMSITESTDIR\t[ProgramFilesFolder]\\msitest\\added\t\n";
408 static const CHAR spf_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
410 "InstallExecuteSequence\tAction\n"
411 "CostFinalize\t\t1000\n"
412 "CostInitialize\t\t800\n"
414 "SetFolderProp\t\t950\n"
415 "InstallFiles\t\t4000\n"
416 "InstallServices\t\t5000\n"
417 "InstallFinalize\t\t6600\n"
418 "InstallInitialize\t\t1500\n"
419 "InstallValidate\t\t1400\n"
420 "LaunchConditions\t\t100";
422 static const CHAR spf_install_ui_seq_dat
[] = "Action\tCondition\tSequence\n"
424 "InstallUISequence\tAction\n"
425 "CostInitialize\t\t800\n"
427 "CostFinalize\t\t1000\n"
428 "ExecuteAction\t\t1100\n";
430 static const CHAR pp_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
432 "InstallExecuteSequence\tAction\n"
433 "ValidateProductID\t\t700\n"
434 "CostInitialize\t\t800\n"
436 "CostFinalize\t\t1000\n"
437 "InstallValidate\t\t1400\n"
438 "InstallInitialize\t\t1500\n"
439 "ProcessComponents\tPROCESS_COMPONENTS=1 Or FULL=1\t1600\n"
440 "UnpublishFeatures\tUNPUBLISH_FEATURES=1 Or FULL=1\t1800\n"
441 "RemoveFiles\t\t3500\n"
442 "InstallFiles\t\t4000\n"
443 "RegisterUser\tREGISTER_USER=1 Or FULL=1\t6000\n"
444 "RegisterProduct\tREGISTER_PRODUCT=1 Or FULL=1\t6100\n"
445 "PublishFeatures\tPUBLISH_FEATURES=1 Or FULL=1\t6300\n"
446 "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n"
447 "InstallFinalize\t\t6600";
449 static const CHAR ppc_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
450 "s72\tS38\ts72\ti2\tS255\tS72\n"
451 "Component\tComponent\n"
452 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n"
453 "augustus\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\taugustus\n";
455 static const CHAR ppc_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
456 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
458 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1\n"
459 "augustus\taugustus\taugustus\t500\t\t\t8192\t2";
461 static const CHAR ppc_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
462 "i2\ti4\tL64\tS255\tS32\tS72\n"
464 "1\t2\t\t\tDISK1\t\n";
466 static const CHAR ppc_feature_comp_dat
[] = "Feature_\tComponent_\n"
468 "FeatureComponents\tFeature_\tComponent_\n"
470 "feature\taugustus\n"
471 "montecristo\tmaximus";
473 static const CHAR tp_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
474 "s72\tS38\ts72\ti2\tS255\tS72\n"
475 "Component\tComponent\n"
476 "augustus\t\tMSITESTDIR\t0\tprop=\"val\"\taugustus\n";
478 static const CHAR cwd_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
479 "s72\tS38\ts72\ti2\tS255\tS72\n"
480 "Component\tComponent\n"
481 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
483 static const CHAR adm_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
484 "s72\tS38\ts72\ti2\tS255\tS72\n"
485 "Component\tComponent\n"
486 "augustus\t\tMSITESTDIR\t0\tPOSTADMIN=1\taugustus";
488 static const CHAR adm_custom_action_dat
[] = "Action\tType\tSource\tTarget\tISComments\n"
489 "s72\ti2\tS64\tS0\tS255\n"
490 "CustomAction\tAction\n"
491 "SetPOSTADMIN\t51\tPOSTADMIN\t1\t\n";
493 static const CHAR adm_admin_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
495 "AdminExecuteSequence\tAction\n"
496 "CostFinalize\t\t1000\n"
497 "CostInitialize\t\t800\n"
499 "SetPOSTADMIN\t\t950\n"
500 "InstallFiles\t\t4000\n"
501 "InstallFinalize\t\t6600\n"
502 "InstallInitialize\t\t1500\n"
503 "InstallValidate\t\t1400\n"
504 "LaunchConditions\t\t100";
506 static const CHAR amp_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
507 "s72\tS38\ts72\ti2\tS255\tS72\n"
508 "Component\tComponent\n"
509 "augustus\t\tMSITESTDIR\t0\tMYPROP=2718 and MyProp=42\taugustus\n";
511 static const CHAR rem_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
512 "s72\tS38\ts72\ti2\tS255\tS72\n"
513 "Component\tComponent\n"
514 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t0\t\thydrogen\n"
515 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\thelium\n"
516 "lithium\t\tMSITESTDIR\t2\t\tlithium\n";
518 static const CHAR rem_feature_comp_dat
[] = "Feature_\tComponent_\n"
520 "FeatureComponents\tFeature_\tComponent_\n"
521 "feature\thydrogen\n"
525 static const CHAR rem_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
526 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
528 "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n"
529 "helium\thelium\thelium\t0\t\t\t8192\t1\n"
530 "lithium\tlithium\tlithium\t0\t\t\t8192\t1";
532 static const CHAR rem_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
534 "InstallExecuteSequence\tAction\n"
535 "ValidateProductID\t\t700\n"
536 "CostInitialize\t\t800\n"
538 "CostFinalize\t\t1000\n"
539 "InstallValidate\t\t1400\n"
540 "InstallInitialize\t\t1500\n"
541 "ProcessComponents\t\t1600\n"
542 "UnpublishFeatures\t\t1800\n"
543 "RemoveFiles\t\t3500\n"
544 "InstallFiles\t\t4000\n"
545 "RegisterProduct\t\t6100\n"
546 "PublishFeatures\t\t6300\n"
547 "PublishProduct\t\t6400\n"
548 "InstallFinalize\t\t6600";
550 static const CHAR rem_remove_files_dat
[] = "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n"
551 "s72\ts72\tS255\ts72\tI2\n"
552 "RemoveFile\tFileKey\n"
553 "furlong\thydrogen\tfurlong\tMSITESTDIR\t1\n"
554 "firkin\thelium\tfirkin\tMSITESTDIR\t1\n"
555 "fortnight\tlithium\tfortnight\tMSITESTDIR\t1\n"
556 "becquerel\thydrogen\tbecquerel\tMSITESTDIR\t2\n"
557 "dioptre\thelium\tdioptre\tMSITESTDIR\t2\n"
558 "attoparsec\tlithium\tattoparsec\tMSITESTDIR\t2\n"
559 "storeys\thydrogen\tstoreys\tMSITESTDIR\t3\n"
560 "block\thelium\tblock\tMSITESTDIR\t3\n"
561 "siriometer\tlithium\tsiriometer\tMSITESTDIR\t3\n"
562 "nanoacre\thydrogen\t\tCABOUTDIR\t3\n";
564 static const CHAR mov_move_file_dat
[] = "FileKey\tComponent_\tSourceName\tDestName\tSourceFolder\tDestFolder\tOptions\n"
565 "s72\ts72\tS255\tS255\tS72\ts72\ti2\n"
566 "MoveFile\tFileKey\n"
567 "abkhazia\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t0\n"
568 "bahamas\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t1\n"
569 "cambodia\taugustus\tcameroon\tcanada\tSourceDir\tMSITESTDIR\t0\n"
570 "denmark\taugustus\tdjibouti\tdominica\tSourceDir\tMSITESTDIR\t1\n"
571 "ecuador\taugustus\tegypt\telsalvador\tNotAProp\tMSITESTDIR\t1\n"
572 "fiji\taugustus\tfinland\tfrance\tSourceDir\tNotAProp\t1\n"
573 "gabon\taugustus\tgambia\tgeorgia\tSOURCEFULL\tMSITESTDIR\t1\n"
574 "haiti\taugustus\thonduras\thungary\tSourceDir\tDESTFULL\t1\n"
575 "iceland\taugustus\tindia\tindonesia\tMSITESTDIR\tMSITESTDIR\t1\n"
576 "jamaica\taugustus\tjapan\tjordan\tFILEPATHBAD\tMSITESTDIR\t1\n"
577 "kazakhstan\taugustus\t\tkiribati\tFILEPATHGOOD\tMSITESTDIR\t1\n"
578 "laos\taugustus\tlatvia\tlebanon\tSourceDir\tMSITESTDIR\t1\n"
579 "namibia\taugustus\tnauru\tkiribati\tSourceDir\tMSITESTDIR\t1\n"
580 "pakistan\taugustus\tperu\tsfn|poland\tSourceDir\tMSITESTDIR\t1\n"
581 "wildcard\taugustus\tapp*\twildcard\tSourceDir\tMSITESTDIR\t1\n"
582 "single\taugustus\tf?o\tsingle\tSourceDir\tMSITESTDIR\t1\n"
583 "wildcardnodest\taugustus\tbudd*\t\tSourceDir\tMSITESTDIR\t1\n"
584 "singlenodest\taugustus\tb?r\t\tSourceDir\tMSITESTDIR\t1\n";
586 static const CHAR mc_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
587 "s72\tS38\ts72\ti2\tS255\tS72\n"
588 "Component\tComponent\n"
589 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
590 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
591 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
592 "gaius\t\tMSITESTDIR\t0\tGAIUS=1\tgaius\n";
594 static const CHAR mc_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
595 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
597 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
598 "augustus\taugustus\taugustus\t500\t\t\t0\t2\n"
599 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3\n"
600 "gaius\tgaius\tgaius\t500\t\t\t16384\t4";
602 static const CHAR mc_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
603 "i2\ti4\tL64\tS255\tS32\tS72\n"
605 "1\t1\t\ttest1.cab\tDISK1\t\n"
606 "2\t2\t\ttest2.cab\tDISK2\t\n"
607 "3\t3\t\ttest3.cab\tDISK3\t\n"
608 "4\t4\t\ttest3.cab\tDISK3\t\n";
610 static const CHAR mc_file_hash_dat
[] = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"
611 "s72\ti2\ti4\ti4\ti4\ti4\n"
612 "MsiFileHash\tFile_\n"
613 "caesar\t0\t850433704\t-241429251\t675791761\t-1221108824";
615 static const CHAR df_directory_dat
[] = "Directory\tDirectory_Parent\tDefaultDir\n"
617 "Directory\tDirectory\n"
618 "THIS\tMSITESTDIR\tthis\n"
619 "DOESNOT\tTHIS\tdoesnot\n"
620 "NONEXISTENT\tDOESNOT\texist\n"
621 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
622 "ProgramFilesFolder\tTARGETDIR\t.\n"
623 "TARGETDIR\t\tSourceDir";
625 static const CHAR df_duplicate_file_dat
[] = "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n"
626 "s72\ts72\ts72\tS255\tS72\n"
627 "DuplicateFile\tFileKey\n"
628 "maximus\tmaximus\tmaximus\taugustus\t\n"
629 "caesar\tmaximus\tmaximus\t\tNONEXISTENT\n";
631 static const CHAR wrv_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
632 "s72\tS38\ts72\ti2\tS255\tS72\n"
633 "Component\tComponent\n"
634 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
636 static const CHAR wrv_registry_dat
[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
637 "s72\ti2\tl255\tL255\tL0\ts72\n"
638 "Registry\tRegistry\n"
639 "regdata\t2\tSOFTWARE\\Wine\\msitest\tValue\t[~]one[~]two[~]three\taugustus";
641 static const CHAR ca51_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
642 "s72\tS38\ts72\ti2\tS255\tS72\n"
643 "Component\tComponent\n"
644 "augustus\t\tMSITESTDIR\t0\tMYPROP=42\taugustus\n";
646 static const CHAR ca51_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
648 "InstallExecuteSequence\tAction\n"
649 "ValidateProductID\t\t700\n"
650 "GoodSetProperty\t\t725\n"
651 "BadSetProperty\t\t750\n"
652 "CostInitialize\t\t800\n"
653 "ResolveSource\t\t810\n"
655 "SetSourceDir\tSRCDIR\t910\n"
656 "CostFinalize\t\t1000\n"
657 "InstallValidate\t\t1400\n"
658 "InstallInitialize\t\t1500\n"
659 "InstallFiles\t\t4000\n"
660 "InstallFinalize\t\t6600";
662 static const CHAR ca51_custom_action_dat
[] = "Action\tType\tSource\tTarget\n"
664 "CustomAction\tAction\n"
665 "GoodSetProperty\t51\tMYPROP\t42\n"
666 "BadSetProperty\t51\t\tMYPROP\n"
667 "SetSourceDir\t51\tSourceDir\t[SRCDIR]\n";
669 static const CHAR is_feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
670 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
672 "one\t\t\t\t2\t1\t\t0\n" /* favorLocal */
673 "two\t\t\t\t2\t1\t\t1\n" /* favorSource */
674 "three\t\t\t\t2\t1\t\t4\n" /* favorAdvertise */
675 "four\t\t\t\t2\t0\t\t0"; /* disabled */
677 static const CHAR is_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
678 "s72\tS38\ts72\ti2\tS255\tS72\n"
679 "Component\tComponent\n"
680 "alpha\t\tMSITESTDIR\t0\t\talpha_file\n" /* favorLocal:Local */
681 "beta\t\tMSITESTDIR\t1\t\tbeta_file\n" /* favorLocal:Source */
682 "gamma\t\tMSITESTDIR\t2\t\tgamma_file\n" /* favorLocal:Optional */
683 "theta\t\tMSITESTDIR\t0\t\ttheta_file\n" /* favorSource:Local */
684 "delta\t\tMSITESTDIR\t1\t\tdelta_file\n" /* favorSource:Source */
685 "epsilon\t\tMSITESTDIR\t2\t\tepsilon_file\n" /* favorSource:Optional */
686 "zeta\t\tMSITESTDIR\t0\t\tzeta_file\n" /* favorAdvertise:Local */
687 "iota\t\tMSITESTDIR\t1\t\tiota_file\n" /* favorAdvertise:Source */
688 "eta\t\tMSITESTDIR\t2\t\teta_file\n" /* favorAdvertise:Optional */
689 "kappa\t\tMSITESTDIR\t0\t\tkappa_file\n" /* disabled:Local */
690 "lambda\t\tMSITESTDIR\t1\t\tlambda_file\n" /* disabled:Source */
691 "mu\t\tMSITESTDIR\t2\t\tmu_file\n"; /* disabled:Optional */
693 static const CHAR is_feature_comp_dat
[] = "Feature_\tComponent_\n"
695 "FeatureComponents\tFeature_\tComponent_\n"
709 static const CHAR is_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
710 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
712 "alpha_file\talpha\talpha\t500\t\t\t8192\t1\n"
713 "beta_file\tbeta\tbeta\t500\t\t\t8291\t2\n"
714 "gamma_file\tgamma\tgamma\t500\t\t\t8192\t3\n"
715 "theta_file\ttheta\ttheta\t500\t\t\t8192\t4\n"
716 "delta_file\tdelta\tdelta\t500\t\t\t8192\t5\n"
717 "epsilon_file\tepsilon\tepsilon\t500\t\t\t8192\t6\n"
718 "zeta_file\tzeta\tzeta\t500\t\t\t8192\t7\n"
719 "iota_file\tiota\tiota\t500\t\t\t8192\t8\n"
720 "eta_file\teta\teta\t500\t\t\t8192\t9\n"
721 "kappa_file\tkappa\tkappa\t500\t\t\t8192\t10\n"
722 "lambda_file\tlambda\tlambda\t500\t\t\t8192\t11\n"
723 "mu_file\tmu\tmu\t500\t\t\t8192\t12";
725 static const CHAR is_media_dat
[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
726 "i2\ti4\tL64\tS255\tS32\tS72\n"
728 "1\t12\t\t\tDISK1\t\n";
730 static const CHAR sp_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
731 "s72\tS38\ts72\ti2\tS255\tS72\n"
732 "Component\tComponent\n"
733 "augustus\t\tTWODIR\t0\t\taugustus\n";
735 static const CHAR sp_directory_dat
[] = "Directory\tDirectory_Parent\tDefaultDir\n"
737 "Directory\tDirectory\n"
738 "TARGETDIR\t\tSourceDir\n"
739 "ProgramFilesFolder\tTARGETDIR\t.\n"
740 "MSITESTDIR\tProgramFilesFolder\tmsitest:.\n"
741 "ONEDIR\tMSITESTDIR\t.:shortone|longone\n"
742 "TWODIR\tONEDIR\t.:shorttwo|longtwo";
744 static const CHAR mcp_component_dat
[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
745 "s72\tS38\ts72\ti2\tS255\tS72\n"
746 "Component\tComponent\n"
747 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t2\t\thydrogen\n"
748 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t2\t\thelium\n"
749 "lithium\t{4AF28FFC-71C7-4307-BDE4-B77C5338F56F}\tMSITESTDIR\t2\tPROPVAR=42\tlithium\n";
751 static const CHAR mcp_feature_dat
[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
752 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
754 "hydroxyl\t\thydroxyl\thydroxyl\t2\t1\tTARGETDIR\t0\n"
755 "heliox\t\theliox\theliox\t2\t5\tTARGETDIR\t0\n"
756 "lithia\t\tlithia\tlithia\t2\t10\tTARGETDIR\t0";
758 static const CHAR mcp_feature_comp_dat
[] = "Feature_\tComponent_\n"
760 "FeatureComponents\tFeature_\tComponent_\n"
761 "hydroxyl\thydrogen\n"
765 static const CHAR mcomp_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
766 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
768 "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n"
769 "helium\thelium\thelium\t0\t\t\t8192\t1\n"
770 "lithium\tlithium\tlithium\t0\t\t\t8192\t1\n"
771 "beryllium\tmissingcomp\tberyllium\t0\t\t\t8192\t1";
773 static const CHAR ai_file_dat
[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
774 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
776 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
777 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
778 "one.txt\tOne\tone.txt\t1000\t\t\t16384\t1\n"
779 "three.txt\tThree\tthree.txt\t1000\t\t\t16384\t3\n"
780 "two.txt\tTwo\ttwo.txt\t1000\t\t\t16384\t2\n"
781 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
782 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1";
784 typedef struct _msi_table
786 const CHAR
*filename
;
791 #define ADD_TABLE(x) {#x".idt", x##_dat, sizeof(x##_dat)}
793 static const msi_table tables
[] =
795 ADD_TABLE(component
),
796 ADD_TABLE(directory
),
798 ADD_TABLE(feature_comp
),
800 ADD_TABLE(install_exec_seq
),
804 ADD_TABLE(service_install
),
805 ADD_TABLE(service_control
)
808 static const msi_table cc_tables
[] =
810 ADD_TABLE(cc_component
),
811 ADD_TABLE(directory
),
812 ADD_TABLE(cc_feature
),
813 ADD_TABLE(cc_feature_comp
),
815 ADD_TABLE(install_exec_seq
),
820 static const msi_table cc2_tables
[] =
822 ADD_TABLE(cc2_component
),
823 ADD_TABLE(directory
),
824 ADD_TABLE(cc_feature
),
825 ADD_TABLE(cc_feature_comp
),
827 ADD_TABLE(install_exec_seq
),
832 static const msi_table co_tables
[] =
834 ADD_TABLE(cc_component
),
835 ADD_TABLE(directory
),
836 ADD_TABLE(cc_feature
),
837 ADD_TABLE(cc_feature_comp
),
839 ADD_TABLE(install_exec_seq
),
844 static const msi_table co2_tables
[] =
846 ADD_TABLE(cc_component
),
847 ADD_TABLE(directory
),
848 ADD_TABLE(cc_feature
),
849 ADD_TABLE(cc_feature_comp
),
851 ADD_TABLE(install_exec_seq
),
852 ADD_TABLE(co2_media
),
856 static const msi_table mm_tables
[] =
858 ADD_TABLE(cc_component
),
859 ADD_TABLE(directory
),
860 ADD_TABLE(cc_feature
),
861 ADD_TABLE(cc_feature_comp
),
863 ADD_TABLE(install_exec_seq
),
868 static const msi_table ss_tables
[] =
870 ADD_TABLE(cc_component
),
871 ADD_TABLE(directory
),
872 ADD_TABLE(cc_feature
),
873 ADD_TABLE(cc_feature_comp
),
875 ADD_TABLE(install_exec_seq
),
880 static const msi_table ui_tables
[] =
882 ADD_TABLE(ui_component
),
883 ADD_TABLE(directory
),
884 ADD_TABLE(cc_feature
),
885 ADD_TABLE(cc_feature_comp
),
887 ADD_TABLE(install_exec_seq
),
888 ADD_TABLE(ui_install_ui_seq
),
889 ADD_TABLE(ui_custom_action
),
894 static const msi_table rof_tables
[] =
896 ADD_TABLE(rof_component
),
897 ADD_TABLE(directory
),
898 ADD_TABLE(rof_feature
),
899 ADD_TABLE(rof_feature_comp
),
901 ADD_TABLE(install_exec_seq
),
902 ADD_TABLE(rof_media
),
906 static const msi_table sdp_tables
[] =
908 ADD_TABLE(rof_component
),
909 ADD_TABLE(directory
),
910 ADD_TABLE(rof_feature
),
911 ADD_TABLE(rof_feature_comp
),
913 ADD_TABLE(sdp_install_exec_seq
),
914 ADD_TABLE(sdp_custom_action
),
915 ADD_TABLE(rof_media
),
919 static const msi_table cie_tables
[] =
921 ADD_TABLE(cie_component
),
922 ADD_TABLE(directory
),
923 ADD_TABLE(cc_feature
),
924 ADD_TABLE(cie_feature_comp
),
926 ADD_TABLE(install_exec_seq
),
927 ADD_TABLE(cie_media
),
931 static const msi_table ci_tables
[] =
933 ADD_TABLE(ci_component
),
934 ADD_TABLE(directory
),
935 ADD_TABLE(rof_feature
),
936 ADD_TABLE(rof_feature_comp
),
938 ADD_TABLE(ci_install_exec_seq
),
939 ADD_TABLE(rof_media
),
941 ADD_TABLE(ci_custom_action
),
944 static const msi_table ci2_tables
[] =
946 ADD_TABLE(ci2_component
),
947 ADD_TABLE(directory
),
948 ADD_TABLE(rof_feature
),
949 ADD_TABLE(ci2_feature_comp
),
951 ADD_TABLE(install_exec_seq
),
952 ADD_TABLE(rof_media
),
956 static const msi_table spf_tables
[] =
958 ADD_TABLE(ci_component
),
959 ADD_TABLE(directory
),
960 ADD_TABLE(rof_feature
),
961 ADD_TABLE(rof_feature_comp
),
963 ADD_TABLE(spf_install_exec_seq
),
964 ADD_TABLE(rof_media
),
966 ADD_TABLE(spf_custom_action
),
967 ADD_TABLE(spf_install_ui_seq
),
970 static const msi_table pp_tables
[] =
972 ADD_TABLE(ci_component
),
973 ADD_TABLE(directory
),
974 ADD_TABLE(rof_feature
),
975 ADD_TABLE(rof_feature_comp
),
977 ADD_TABLE(pp_install_exec_seq
),
978 ADD_TABLE(rof_media
),
982 static const msi_table ppc_tables
[] =
984 ADD_TABLE(ppc_component
),
985 ADD_TABLE(directory
),
986 ADD_TABLE(rof_feature
),
987 ADD_TABLE(ppc_feature_comp
),
989 ADD_TABLE(pp_install_exec_seq
),
990 ADD_TABLE(ppc_media
),
994 static const msi_table tp_tables
[] =
996 ADD_TABLE(tp_component
),
997 ADD_TABLE(directory
),
998 ADD_TABLE(rof_feature
),
999 ADD_TABLE(ci2_feature_comp
),
1000 ADD_TABLE(ci2_file
),
1001 ADD_TABLE(install_exec_seq
),
1002 ADD_TABLE(rof_media
),
1003 ADD_TABLE(property
),
1006 static const msi_table cwd_tables
[] =
1008 ADD_TABLE(cwd_component
),
1009 ADD_TABLE(directory
),
1010 ADD_TABLE(rof_feature
),
1011 ADD_TABLE(ci2_feature_comp
),
1012 ADD_TABLE(ci2_file
),
1013 ADD_TABLE(install_exec_seq
),
1014 ADD_TABLE(rof_media
),
1015 ADD_TABLE(property
),
1018 static const msi_table adm_tables
[] =
1020 ADD_TABLE(adm_component
),
1021 ADD_TABLE(directory
),
1022 ADD_TABLE(rof_feature
),
1023 ADD_TABLE(ci2_feature_comp
),
1024 ADD_TABLE(ci2_file
),
1025 ADD_TABLE(install_exec_seq
),
1026 ADD_TABLE(rof_media
),
1027 ADD_TABLE(property
),
1028 ADD_TABLE(adm_custom_action
),
1029 ADD_TABLE(adm_admin_exec_seq
),
1032 static const msi_table amp_tables
[] =
1034 ADD_TABLE(amp_component
),
1035 ADD_TABLE(directory
),
1036 ADD_TABLE(rof_feature
),
1037 ADD_TABLE(ci2_feature_comp
),
1038 ADD_TABLE(ci2_file
),
1039 ADD_TABLE(install_exec_seq
),
1040 ADD_TABLE(rof_media
),
1041 ADD_TABLE(property
),
1044 static const msi_table rem_tables
[] =
1046 ADD_TABLE(rem_component
),
1047 ADD_TABLE(directory
),
1048 ADD_TABLE(rof_feature
),
1049 ADD_TABLE(rem_feature_comp
),
1050 ADD_TABLE(rem_file
),
1051 ADD_TABLE(rem_install_exec_seq
),
1052 ADD_TABLE(rof_media
),
1053 ADD_TABLE(property
),
1054 ADD_TABLE(rem_remove_files
),
1057 static const msi_table mov_tables
[] =
1059 ADD_TABLE(cwd_component
),
1060 ADD_TABLE(directory
),
1061 ADD_TABLE(rof_feature
),
1062 ADD_TABLE(ci2_feature_comp
),
1063 ADD_TABLE(ci2_file
),
1064 ADD_TABLE(install_exec_seq
),
1065 ADD_TABLE(rof_media
),
1066 ADD_TABLE(property
),
1067 ADD_TABLE(mov_move_file
),
1070 static const msi_table mc_tables
[] =
1072 ADD_TABLE(mc_component
),
1073 ADD_TABLE(directory
),
1074 ADD_TABLE(cc_feature
),
1075 ADD_TABLE(cie_feature_comp
),
1077 ADD_TABLE(install_exec_seq
),
1078 ADD_TABLE(mc_media
),
1079 ADD_TABLE(property
),
1080 ADD_TABLE(mc_file_hash
),
1083 static const msi_table df_tables
[] =
1085 ADD_TABLE(rof_component
),
1086 ADD_TABLE(df_directory
),
1087 ADD_TABLE(rof_feature
),
1088 ADD_TABLE(rof_feature_comp
),
1089 ADD_TABLE(rof_file
),
1090 ADD_TABLE(install_exec_seq
),
1091 ADD_TABLE(rof_media
),
1092 ADD_TABLE(property
),
1093 ADD_TABLE(df_duplicate_file
),
1096 static const msi_table wrv_tables
[] =
1098 ADD_TABLE(wrv_component
),
1099 ADD_TABLE(directory
),
1100 ADD_TABLE(rof_feature
),
1101 ADD_TABLE(ci2_feature_comp
),
1102 ADD_TABLE(ci2_file
),
1103 ADD_TABLE(install_exec_seq
),
1104 ADD_TABLE(rof_media
),
1105 ADD_TABLE(property
),
1106 ADD_TABLE(wrv_registry
),
1109 static const msi_table sf_tables
[] =
1111 ADD_TABLE(wrv_component
),
1112 ADD_TABLE(directory
),
1113 ADD_TABLE(rof_feature
),
1114 ADD_TABLE(ci2_feature_comp
),
1115 ADD_TABLE(ci2_file
),
1116 ADD_TABLE(install_exec_seq
),
1117 ADD_TABLE(rof_media
),
1118 ADD_TABLE(property
),
1121 static const msi_table ca51_tables
[] =
1123 ADD_TABLE(ca51_component
),
1124 ADD_TABLE(directory
),
1125 ADD_TABLE(rof_feature
),
1126 ADD_TABLE(ci2_feature_comp
),
1127 ADD_TABLE(ci2_file
),
1128 ADD_TABLE(ca51_install_exec_seq
),
1129 ADD_TABLE(rof_media
),
1130 ADD_TABLE(property
),
1131 ADD_TABLE(ca51_custom_action
),
1134 static const msi_table is_tables
[] =
1136 ADD_TABLE(is_component
),
1137 ADD_TABLE(directory
),
1138 ADD_TABLE(is_feature
),
1139 ADD_TABLE(is_feature_comp
),
1141 ADD_TABLE(install_exec_seq
),
1142 ADD_TABLE(is_media
),
1143 ADD_TABLE(property
),
1146 static const msi_table sp_tables
[] =
1148 ADD_TABLE(sp_component
),
1149 ADD_TABLE(sp_directory
),
1150 ADD_TABLE(rof_feature
),
1151 ADD_TABLE(ci2_feature_comp
),
1152 ADD_TABLE(ci2_file
),
1153 ADD_TABLE(install_exec_seq
),
1154 ADD_TABLE(rof_media
),
1155 ADD_TABLE(property
),
1158 static const msi_table mcp_tables
[] =
1160 ADD_TABLE(mcp_component
),
1161 ADD_TABLE(directory
),
1162 ADD_TABLE(mcp_feature
),
1163 ADD_TABLE(mcp_feature_comp
),
1164 ADD_TABLE(rem_file
),
1165 ADD_TABLE(rem_install_exec_seq
),
1166 ADD_TABLE(rof_media
),
1167 ADD_TABLE(property
),
1170 static const msi_table mcomp_tables
[] =
1172 ADD_TABLE(mcp_component
),
1173 ADD_TABLE(directory
),
1174 ADD_TABLE(mcp_feature
),
1175 ADD_TABLE(mcp_feature_comp
),
1176 ADD_TABLE(mcomp_file
),
1177 ADD_TABLE(rem_install_exec_seq
),
1178 ADD_TABLE(rof_media
),
1179 ADD_TABLE(property
),
1182 static const msi_table ai_tables
[] =
1184 ADD_TABLE(component
),
1185 ADD_TABLE(directory
),
1187 ADD_TABLE(feature_comp
),
1189 ADD_TABLE(install_exec_seq
),
1194 static const msi_table pc_tables
[] =
1196 ADD_TABLE(ca51_component
),
1197 ADD_TABLE(directory
),
1198 ADD_TABLE(rof_feature
),
1199 ADD_TABLE(ci2_feature_comp
),
1200 ADD_TABLE(ci2_file
),
1201 ADD_TABLE(install_exec_seq
),
1202 ADD_TABLE(rof_media
),
1206 /* cabinet definitions */
1208 /* make the max size large so there is only one cab file */
1209 #define MEDIA_SIZE 0x7FFFFFFF
1210 #define FOLDER_THRESHOLD 900000
1212 /* the FCI callbacks */
1214 static void * CDECL
mem_alloc(ULONG cb
)
1216 return HeapAlloc(GetProcessHeap(), 0, cb
);
1219 static void CDECL
mem_free(void *memory
)
1221 HeapFree(GetProcessHeap(), 0, memory
);
1224 static BOOL CDECL
get_next_cabinet(PCCAB pccab
, ULONG cbPrevCab
, void *pv
)
1226 sprintf(pccab
->szCab
, pv
, pccab
->iCab
);
1230 static LONG CDECL
progress(UINT typeStatus
, ULONG cb1
, ULONG cb2
, void *pv
)
1235 static int CDECL
file_placed(PCCAB pccab
, char *pszFile
, LONG cbFile
,
1236 BOOL fContinuation
, void *pv
)
1241 static INT_PTR CDECL
fci_open(char *pszFile
, int oflag
, int pmode
, int *err
, void *pv
)
1245 DWORD dwShareMode
= 0;
1246 DWORD dwCreateDisposition
= OPEN_EXISTING
;
1248 dwAccess
= GENERIC_READ
| GENERIC_WRITE
;
1249 /* FILE_SHARE_DELETE is not supported by Windows Me/98/95 */
1250 dwShareMode
= FILE_SHARE_READ
| FILE_SHARE_WRITE
;
1252 if (GetFileAttributesA(pszFile
) != INVALID_FILE_ATTRIBUTES
)
1253 dwCreateDisposition
= OPEN_EXISTING
;
1255 dwCreateDisposition
= CREATE_NEW
;
1257 handle
= CreateFileA(pszFile
, dwAccess
, dwShareMode
, NULL
,
1258 dwCreateDisposition
, 0, NULL
);
1260 ok(handle
!= INVALID_HANDLE_VALUE
, "Failed to CreateFile %s\n", pszFile
);
1262 return (INT_PTR
)handle
;
1265 static UINT CDECL
fci_read(INT_PTR hf
, void *memory
, UINT cb
, int *err
, void *pv
)
1267 HANDLE handle
= (HANDLE
)hf
;
1271 res
= ReadFile(handle
, memory
, cb
, &dwRead
, NULL
);
1272 ok(res
, "Failed to ReadFile\n");
1277 static UINT CDECL
fci_write(INT_PTR hf
, void *memory
, UINT cb
, int *err
, void *pv
)
1279 HANDLE handle
= (HANDLE
)hf
;
1283 res
= WriteFile(handle
, memory
, cb
, &dwWritten
, NULL
);
1284 ok(res
, "Failed to WriteFile\n");
1289 static int CDECL
fci_close(INT_PTR hf
, int *err
, void *pv
)
1291 HANDLE handle
= (HANDLE
)hf
;
1292 ok(CloseHandle(handle
), "Failed to CloseHandle\n");
1297 static LONG CDECL
fci_seek(INT_PTR hf
, LONG dist
, int seektype
, int *err
, void *pv
)
1299 HANDLE handle
= (HANDLE
)hf
;
1302 ret
= SetFilePointer(handle
, dist
, NULL
, seektype
);
1303 ok(ret
!= INVALID_SET_FILE_POINTER
, "Failed to SetFilePointer\n");
1308 static int CDECL
fci_delete(char *pszFile
, int *err
, void *pv
)
1310 BOOL ret
= DeleteFileA(pszFile
);
1311 ok(ret
, "Failed to DeleteFile %s\n", pszFile
);
1316 static void init_functionpointers(void)
1318 HMODULE hmsi
= GetModuleHandleA("msi.dll");
1320 #define GET_PROC(mod, func) \
1321 p ## func = (void*)GetProcAddress(mod, #func); \
1323 trace("GetProcAddress(%s) failed\n", #func);
1325 GET_PROC(hmsi
, MsiQueryComponentStateA
);
1326 GET_PROC(hmsi
, MsiSourceListEnumSourcesA
);
1327 GET_PROC(hmsi
, MsiSourceListGetInfoA
);
1329 hsrclient
= LoadLibraryA("srclient.dll");
1330 GET_PROC(hsrclient
, SRRemoveRestorePoint
);
1331 GET_PROC(hsrclient
, SRSetRestorePointA
);
1336 static BOOL
check_win9x(void)
1340 scm
= OpenSCManager(NULL
, NULL
, GENERIC_ALL
);
1341 if (!scm
&& (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
))
1344 CloseServiceHandle(scm
);
1349 static void get_user_sid(LPSTR
*usersid
)
1355 HMODULE hadvapi32
= GetModuleHandleA("advapi32.dll");
1356 static BOOL (WINAPI
*pConvertSidToStringSidA
)(PSID
, LPSTR
*);
1359 pConvertSidToStringSidA
= (void *)GetProcAddress(hadvapi32
, "ConvertSidToStringSidA");
1360 if (!pConvertSidToStringSidA
)
1363 OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY
, &token
);
1365 GetTokenInformation(token
, TokenUser
, buf
, size
, &size
);
1366 user
= (PTOKEN_USER
)buf
;
1367 pConvertSidToStringSidA(user
->User
.Sid
, usersid
);
1371 static BOOL
check_record(MSIHANDLE rec
, UINT field
, LPCSTR val
)
1378 r
= MsiRecordGetString(rec
, field
, buffer
, &sz
);
1379 return (r
== ERROR_SUCCESS
) && !strcmp(val
, buffer
);
1382 static BOOL CDECL
get_temp_file(char *pszTempName
, int cbTempName
, void *pv
)
1386 tempname
= HeapAlloc(GetProcessHeap(), 0, MAX_PATH
);
1387 GetTempFileNameA(".", "xx", 0, tempname
);
1389 if (tempname
&& (strlen(tempname
) < (unsigned)cbTempName
))
1391 lstrcpyA(pszTempName
, tempname
);
1392 HeapFree(GetProcessHeap(), 0, tempname
);
1396 HeapFree(GetProcessHeap(), 0, tempname
);
1401 static INT_PTR CDECL
get_open_info(char *pszName
, USHORT
*pdate
, USHORT
*ptime
,
1402 USHORT
*pattribs
, int *err
, void *pv
)
1404 BY_HANDLE_FILE_INFORMATION finfo
;
1410 handle
= CreateFile(pszName
, GENERIC_READ
, FILE_SHARE_READ
, NULL
,
1411 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
| FILE_FLAG_SEQUENTIAL_SCAN
, NULL
);
1413 ok(handle
!= INVALID_HANDLE_VALUE
, "Failed to CreateFile %s\n", pszName
);
1415 res
= GetFileInformationByHandle(handle
, &finfo
);
1416 ok(res
, "Expected GetFileInformationByHandle to succeed\n");
1418 FileTimeToLocalFileTime(&finfo
.ftLastWriteTime
, &filetime
);
1419 FileTimeToDosDateTime(&filetime
, pdate
, ptime
);
1421 attrs
= GetFileAttributes(pszName
);
1422 ok(attrs
!= INVALID_FILE_ATTRIBUTES
, "Failed to GetFileAttributes\n");
1424 return (INT_PTR
)handle
;
1427 static BOOL
add_file(HFCI hfci
, const char *file
, TCOMP compress
)
1429 char path
[MAX_PATH
];
1430 char filename
[MAX_PATH
];
1432 lstrcpyA(path
, CURR_DIR
);
1433 lstrcatA(path
, "\\");
1434 lstrcatA(path
, file
);
1436 lstrcpyA(filename
, file
);
1438 return FCIAddFile(hfci
, path
, filename
, FALSE
, get_next_cabinet
,
1439 progress
, get_open_info
, compress
);
1442 static void set_cab_parameters(PCCAB pCabParams
, const CHAR
*name
, DWORD max_size
)
1444 ZeroMemory(pCabParams
, sizeof(CCAB
));
1446 pCabParams
->cb
= max_size
;
1447 pCabParams
->cbFolderThresh
= FOLDER_THRESHOLD
;
1448 pCabParams
->setID
= 0xbeef;
1449 pCabParams
->iCab
= 1;
1450 lstrcpyA(pCabParams
->szCabPath
, CURR_DIR
);
1451 lstrcatA(pCabParams
->szCabPath
, "\\");
1452 lstrcpyA(pCabParams
->szCab
, name
);
1455 static void create_cab_file(const CHAR
*name
, DWORD max_size
, const CHAR
*files
)
1463 set_cab_parameters(&cabParams
, name
, max_size
);
1465 hfci
= FCICreate(&erf
, file_placed
, mem_alloc
, mem_free
, fci_open
,
1466 fci_read
, fci_write
, fci_close
, fci_seek
, fci_delete
,
1467 get_temp_file
, &cabParams
, NULL
);
1469 ok(hfci
!= NULL
, "Failed to create an FCI context\n");
1474 res
= add_file(hfci
, ptr
, tcompTYPE_MSZIP
);
1475 ok(res
, "Failed to add file: %s\n", ptr
);
1476 ptr
+= lstrlen(ptr
) + 1;
1479 res
= FCIFlushCabinet(hfci
, FALSE
, get_next_cabinet
, progress
);
1480 ok(res
, "Failed to flush the cabinet\n");
1482 res
= FCIDestroy(hfci
);
1483 ok(res
, "Failed to destroy the cabinet\n");
1486 static BOOL
get_program_files_dir(LPSTR buf
, LPSTR buf2
)
1491 if (RegOpenKey(HKEY_LOCAL_MACHINE
,
1492 "Software\\Microsoft\\Windows\\CurrentVersion", &hkey
))
1496 if (RegQueryValueExA(hkey
, "ProgramFilesDir", 0, &type
, (LPBYTE
)buf
, &size
)) {
1502 if (RegQueryValueExA(hkey
, "CommonFilesDir", 0, &type
, (LPBYTE
)buf2
, &size
)) {
1511 static void create_file_data(LPCSTR name
, LPCSTR data
, DWORD size
)
1516 file
= CreateFileA(name
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, 0, NULL
);
1517 if (file
== INVALID_HANDLE_VALUE
)
1520 WriteFile(file
, data
, strlen(data
), &written
, NULL
);
1524 SetFilePointer(file
, size
, NULL
, FILE_BEGIN
);
1531 #define create_file(name, size) create_file_data(name, name, size)
1533 static void create_test_files(void)
1535 CreateDirectoryA("msitest", NULL
);
1536 create_file("msitest\\one.txt", 100);
1537 CreateDirectoryA("msitest\\first", NULL
);
1538 create_file("msitest\\first\\two.txt", 100);
1539 CreateDirectoryA("msitest\\second", NULL
);
1540 create_file("msitest\\second\\three.txt", 100);
1542 create_file("four.txt", 100);
1543 create_file("five.txt", 100);
1544 create_cab_file("msitest.cab", MEDIA_SIZE
, "four.txt\0five.txt\0");
1546 create_file("msitest\\filename", 100);
1547 create_file("msitest\\service.exe", 100);
1549 DeleteFileA("four.txt");
1550 DeleteFileA("five.txt");
1553 static BOOL
delete_pf(const CHAR
*rel_path
, BOOL is_file
)
1555 CHAR path
[MAX_PATH
];
1557 lstrcpyA(path
, PROG_FILES_DIR
);
1558 lstrcatA(path
, "\\");
1559 lstrcatA(path
, rel_path
);
1562 return DeleteFileA(path
);
1564 return RemoveDirectoryA(path
);
1567 static BOOL
delete_cf(const CHAR
*rel_path
, BOOL is_file
)
1569 CHAR path
[MAX_PATH
];
1571 lstrcpyA(path
, COMMON_FILES_DIR
);
1572 lstrcatA(path
, "\\");
1573 lstrcatA(path
, rel_path
);
1576 return DeleteFileA(path
);
1578 return RemoveDirectoryA(path
);
1581 static void delete_test_files(void)
1583 DeleteFileA("msitest.msi");
1584 DeleteFileA("msitest.cab");
1585 DeleteFileA("msitest\\second\\three.txt");
1586 DeleteFileA("msitest\\first\\two.txt");
1587 DeleteFileA("msitest\\one.txt");
1588 DeleteFileA("msitest\\service.exe");
1589 DeleteFileA("msitest\\filename");
1590 RemoveDirectoryA("msitest\\second");
1591 RemoveDirectoryA("msitest\\first");
1592 RemoveDirectoryA("msitest");
1595 static void write_file(const CHAR
*filename
, const char *data
, int data_size
)
1599 HANDLE hf
= CreateFile(filename
, GENERIC_WRITE
, 0, NULL
,
1600 CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
1602 WriteFile(hf
, data
, data_size
, &size
, NULL
);
1606 static void write_msi_summary_info(MSIHANDLE db
, INT wordcount
)
1611 r
= MsiGetSummaryInformationA(db
, NULL
, 5, &summary
);
1612 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1614 r
= MsiSummaryInfoSetPropertyA(summary
, PID_TEMPLATE
, VT_LPSTR
, 0, NULL
, ";1033");
1615 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1617 r
= MsiSummaryInfoSetPropertyA(summary
, PID_REVNUMBER
, VT_LPSTR
, 0, NULL
,
1618 "{004757CA-5092-49c2-AD20-28E1CE0DF5F2}");
1619 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1621 r
= MsiSummaryInfoSetPropertyA(summary
, PID_PAGECOUNT
, VT_I4
, 100, NULL
, NULL
);
1622 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1624 r
= MsiSummaryInfoSetPropertyA(summary
, PID_WORDCOUNT
, VT_I4
, wordcount
, NULL
, NULL
);
1625 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1627 r
= MsiSummaryInfoSetPropertyA(summary
, PID_TITLE
, VT_LPSTR
, 0, NULL
, "MSITEST");
1628 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1630 /* write the summary changes back to the stream */
1631 r
= MsiSummaryInfoPersist(summary
);
1632 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1634 MsiCloseHandle(summary
);
1637 #define create_database(name, tables, num_tables) \
1638 create_database_wordcount(name, tables, num_tables, 0);
1640 static void create_database_wordcount(const CHAR
*name
, const msi_table
*tables
,
1641 int num_tables
, INT wordcount
)
1647 r
= MsiOpenDatabaseA(name
, MSIDBOPEN_CREATE
, &db
);
1648 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1650 /* import the tables into the database */
1651 for (j
= 0; j
< num_tables
; j
++)
1653 const msi_table
*table
= &tables
[j
];
1655 write_file(table
->filename
, table
->data
, (table
->size
- 1) * sizeof(char));
1657 r
= MsiDatabaseImportA(db
, CURR_DIR
, table
->filename
);
1658 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1660 DeleteFileA(table
->filename
);
1663 write_msi_summary_info(db
, wordcount
);
1665 r
= MsiDatabaseCommit(db
);
1666 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1671 static void check_service_is_installed(void)
1673 SC_HANDLE scm
, service
;
1676 scm
= OpenSCManager(NULL
, NULL
, SC_MANAGER_ALL_ACCESS
);
1677 ok(scm
!= NULL
, "Failed to open the SC Manager\n");
1679 service
= OpenService(scm
, "TestService", SC_MANAGER_ALL_ACCESS
);
1680 ok(service
!= NULL
, "Failed to open TestService\n");
1682 res
= DeleteService(service
);
1683 ok(res
, "Failed to delete TestService\n");
1685 CloseServiceHandle(service
);
1686 CloseServiceHandle(scm
);
1689 static BOOL
notify_system_change(DWORD event_type
, STATEMGRSTATUS
*status
)
1691 RESTOREPOINTINFOA spec
;
1693 spec
.dwEventType
= event_type
;
1694 spec
.dwRestorePtType
= APPLICATION_INSTALL
;
1695 spec
.llSequenceNumber
= status
->llSequenceNumber
;
1696 lstrcpyA(spec
.szDescription
, "msitest restore point");
1698 return pSRSetRestorePointA(&spec
, status
);
1701 static void remove_restore_point(DWORD seq_number
)
1705 res
= pSRRemoveRestorePoint(seq_number
);
1706 if (res
!= ERROR_SUCCESS
)
1707 trace("Failed to remove the restore point : %08x\n", res
);
1710 static void test_MsiInstallProduct(void)
1713 CHAR path
[MAX_PATH
];
1716 DWORD num
, size
, type
;
1720 win_skip("Services are not implemented on Win9x and WinMe\n");
1724 create_test_files();
1725 create_database(msifile
, tables
, sizeof(tables
) / sizeof(msi_table
));
1727 r
= MsiInstallProductA(msifile
, NULL
);
1728 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1730 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
1731 ok(delete_pf("msitest\\cabout\\new", FALSE
), "File not installed\n");
1732 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
1733 ok(delete_pf("msitest\\cabout", FALSE
), "File not installed\n");
1734 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
1735 ok(delete_pf("msitest\\changed", FALSE
), "File not installed\n");
1736 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
1737 ok(delete_pf("msitest\\first", FALSE
), "File not installed\n");
1738 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
1739 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
1740 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
1741 ok(delete_pf("msitest", FALSE
), "File not installed\n");
1743 res
= RegOpenKey(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Wine\\msitest", &hkey
);
1744 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
1748 res
= RegQueryValueExA(hkey
, "Name", NULL
, &type
, (LPBYTE
)path
, &size
);
1749 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
1750 ok(!lstrcmpA(path
, "imaname"), "Expected imaname, got %s\n", path
);
1754 res
= RegQueryValueExA(hkey
, "blah", NULL
, &type
, (LPBYTE
)path
, &size
);
1755 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
1759 res
= RegQueryValueExA(hkey
, "number", NULL
, &type
, (LPBYTE
)&num
, &size
);
1760 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
1761 ok(num
== 314, "Expected 314, got %d\n", num
);
1765 res
= RegQueryValueExA(hkey
, "OrderTestName", NULL
, &type
, (LPBYTE
)path
, &size
);
1766 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
1767 ok(!lstrcmpA(path
, "OrderTestValue"), "Expected imaname, got %s\n", path
);
1769 check_service_is_installed();
1771 RegDeleteKeyA(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Wine\\msitest");
1773 delete_test_files();
1776 static void test_MsiSetComponentState(void)
1778 INSTALLSTATE installed
, action
;
1780 char path
[MAX_PATH
];
1783 create_database(msifile
, tables
, sizeof(tables
) / sizeof(msi_table
));
1787 lstrcpy(path
, CURR_DIR
);
1788 lstrcat(path
, "\\");
1789 lstrcat(path
, msifile
);
1791 r
= MsiOpenPackage(path
, &package
);
1792 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1794 r
= MsiDoAction(package
, "CostInitialize");
1795 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1797 r
= MsiDoAction(package
, "FileCost");
1798 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1800 r
= MsiDoAction(package
, "CostFinalize");
1801 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1803 r
= MsiGetComponentState(package
, "dangler", &installed
, &action
);
1804 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1805 ok(installed
== INSTALLSTATE_ABSENT
, "Expected INSTALLSTATE_ABSENT, got %d\n", installed
);
1806 ok(action
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action
);
1808 r
= MsiSetComponentState(package
, "dangler", INSTALLSTATE_SOURCE
);
1809 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1811 MsiCloseHandle(package
);
1814 DeleteFileA(msifile
);
1817 static void test_packagecoltypes(void)
1819 MSIHANDLE hdb
, view
, rec
;
1820 char path
[MAX_PATH
];
1824 create_database(msifile
, tables
, sizeof(tables
) / sizeof(msi_table
));
1828 lstrcpy(path
, CURR_DIR
);
1829 lstrcat(path
, "\\");
1830 lstrcat(path
, msifile
);
1832 r
= MsiOpenDatabase(path
, MSIDBOPEN_READONLY
, &hdb
);
1833 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1835 query
= "SELECT * FROM `Media`";
1836 r
= MsiDatabaseOpenView( hdb
, query
, &view
);
1837 ok(r
== ERROR_SUCCESS
, "MsiDatabaseOpenView failed\n");
1839 r
= MsiViewGetColumnInfo( view
, MSICOLINFO_NAMES
, &rec
);
1840 count
= MsiRecordGetFieldCount( rec
);
1841 ok(r
== ERROR_SUCCESS
, "MsiViewGetColumnInfo failed\n");
1842 ok(count
== 6, "Expected 6, got %d\n", count
);
1843 ok(check_record(rec
, 1, "DiskId"), "wrong column label\n");
1844 ok(check_record(rec
, 2, "LastSequence"), "wrong column label\n");
1845 ok(check_record(rec
, 3, "DiskPrompt"), "wrong column label\n");
1846 ok(check_record(rec
, 4, "Cabinet"), "wrong column label\n");
1847 ok(check_record(rec
, 5, "VolumeLabel"), "wrong column label\n");
1848 ok(check_record(rec
, 6, "Source"), "wrong column label\n");
1849 MsiCloseHandle(rec
);
1851 r
= MsiViewGetColumnInfo( view
, MSICOLINFO_TYPES
, &rec
);
1852 count
= MsiRecordGetFieldCount( rec
);
1853 ok(r
== ERROR_SUCCESS
, "MsiViewGetColumnInfo failed\n");
1854 ok(count
== 6, "Expected 6, got %d\n", count
);
1855 ok(check_record(rec
, 1, "i2"), "wrong column label\n");
1856 ok(check_record(rec
, 2, "i4"), "wrong column label\n");
1857 ok(check_record(rec
, 3, "L64"), "wrong column label\n");
1858 ok(check_record(rec
, 4, "S255"), "wrong column label\n");
1859 ok(check_record(rec
, 5, "S32"), "wrong column label\n");
1860 ok(check_record(rec
, 6, "S72"), "wrong column label\n");
1862 MsiCloseHandle(rec
);
1863 MsiCloseHandle(view
);
1864 MsiCloseHandle(hdb
);
1867 DeleteFile(msifile
);
1870 static void create_cc_test_files(void)
1875 static CHAR cab_context
[] = "test%d.cab";
1878 create_file("maximus", 500);
1879 create_file("augustus", 50000);
1880 create_file("tiberius", 500);
1881 create_file("caesar", 500);
1883 set_cab_parameters(&cabParams
, "test1.cab", 40000);
1885 hfci
= FCICreate(&erf
, file_placed
, mem_alloc
, mem_free
, fci_open
,
1886 fci_read
, fci_write
, fci_close
, fci_seek
, fci_delete
,
1887 get_temp_file
, &cabParams
, cab_context
);
1888 ok(hfci
!= NULL
, "Failed to create an FCI context\n");
1890 res
= add_file(hfci
, "maximus", tcompTYPE_NONE
);
1891 ok(res
, "Failed to add file maximus\n");
1893 res
= add_file(hfci
, "augustus", tcompTYPE_NONE
);
1894 ok(res
, "Failed to add file augustus\n");
1896 res
= add_file(hfci
, "tiberius", tcompTYPE_NONE
);
1897 ok(res
, "Failed to add file tiberius\n");
1899 res
= FCIFlushCabinet(hfci
, FALSE
, get_next_cabinet
, progress
);
1900 ok(res
, "Failed to flush the cabinet\n");
1902 res
= FCIDestroy(hfci
);
1903 ok(res
, "Failed to destroy the cabinet\n");
1905 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
1907 DeleteFile("maximus");
1908 DeleteFile("augustus");
1909 DeleteFile("tiberius");
1910 DeleteFile("caesar");
1913 static void delete_cab_files(void)
1915 SHFILEOPSTRUCT shfl
;
1916 CHAR path
[MAX_PATH
+10];
1918 lstrcpyA(path
, CURR_DIR
);
1919 lstrcatA(path
, "\\*.cab");
1920 path
[strlen(path
) + 1] = '\0';
1923 shfl
.wFunc
= FO_DELETE
;
1926 shfl
.fFlags
= FOF_FILESONLY
| FOF_NOCONFIRMATION
| FOF_NORECURSION
| FOF_SILENT
;
1928 SHFileOperation(&shfl
);
1931 static void test_continuouscabs(void)
1935 create_cc_test_files();
1936 create_database(msifile
, cc_tables
, sizeof(cc_tables
) / sizeof(msi_table
));
1938 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1940 r
= MsiInstallProductA(msifile
, NULL
);
1941 if (r
== ERROR_SUCCESS
) /* win9x has a problem with this */
1943 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1944 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
1945 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
1946 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
1947 ok(delete_pf("msitest", FALSE
), "File not installed\n");
1951 DeleteFile(msifile
);
1953 create_cc_test_files();
1954 create_database(msifile
, cc2_tables
, sizeof(cc2_tables
) / sizeof(msi_table
));
1956 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1958 r
= MsiInstallProductA(msifile
, NULL
);
1959 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1960 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
1961 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
1962 ok(delete_pf("msitest\\tiberius", TRUE
), "File not installed\n");
1963 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
1964 ok(delete_pf("msitest", FALSE
), "File not installed\n");
1967 DeleteFile(msifile
);
1970 static void test_caborder(void)
1974 create_file("imperator", 100);
1975 create_file("maximus", 500);
1976 create_file("augustus", 50000);
1977 create_file("caesar", 500);
1979 create_database(msifile
, cc_tables
, sizeof(cc_tables
) / sizeof(msi_table
));
1981 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1983 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
1984 create_cab_file("test2.cab", MEDIA_SIZE
, "augustus\0");
1985 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
1987 r
= MsiInstallProductA(msifile
, NULL
);
1988 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
1989 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
1990 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
1993 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
1994 ok(!delete_pf("msitest", FALSE
), "File is installed\n");
1999 create_cab_file("test1.cab", MEDIA_SIZE
, "imperator\0");
2000 create_cab_file("test2.cab", MEDIA_SIZE
, "maximus\0augustus\0");
2001 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
2003 r
= MsiInstallProductA(msifile
, NULL
);
2004 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
2005 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
2006 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
2007 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
2010 ok(!delete_pf("msitest", FALSE
), "File is installed\n");
2014 DeleteFile(msifile
);
2016 create_cc_test_files();
2017 create_database(msifile
, co_tables
, sizeof(co_tables
) / sizeof(msi_table
));
2019 r
= MsiInstallProductA(msifile
, NULL
);
2020 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
2021 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
2022 ok(!delete_pf("msitest", FALSE
), "File is installed\n");
2025 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
2026 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
2030 DeleteFile(msifile
);
2032 create_cc_test_files();
2033 create_database(msifile
, co2_tables
, sizeof(co2_tables
) / sizeof(msi_table
));
2035 r
= MsiInstallProductA(msifile
, NULL
);
2036 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
2039 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
2040 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
2041 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
2042 ok(!delete_pf("msitest", FALSE
), "File is installed\n");
2046 DeleteFile("imperator");
2047 DeleteFile("maximus");
2048 DeleteFile("augustus");
2049 DeleteFile("caesar");
2050 DeleteFile(msifile
);
2053 static void test_mixedmedia(void)
2057 CreateDirectoryA("msitest", NULL
);
2058 create_file("msitest\\maximus", 500);
2059 create_file("msitest\\augustus", 500);
2060 create_file("caesar", 500);
2062 create_database(msifile
, mm_tables
, sizeof(mm_tables
) / sizeof(msi_table
));
2064 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
2066 create_cab_file("test1.cab", MEDIA_SIZE
, "caesar\0");
2068 r
= MsiInstallProductA(msifile
, NULL
);
2069 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2070 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
2071 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
2072 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2073 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2075 /* Delete the files in the temp (current) folder */
2076 DeleteFile("msitest\\maximus");
2077 DeleteFile("msitest\\augustus");
2078 RemoveDirectory("msitest");
2079 DeleteFile("caesar");
2080 DeleteFile("test1.cab");
2081 DeleteFile(msifile
);
2084 static void test_samesequence(void)
2088 create_cc_test_files();
2089 create_database(msifile
, ss_tables
, sizeof(ss_tables
) / sizeof(msi_table
));
2091 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
2093 r
= MsiInstallProductA(msifile
, NULL
);
2094 if (r
== ERROR_SUCCESS
) /* win9x has a problem with this */
2096 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2097 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
2098 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
2099 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2100 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2104 DeleteFile(msifile
);
2107 static void test_uiLevelFlags(void)
2111 create_cc_test_files();
2112 create_database(msifile
, ui_tables
, sizeof(ui_tables
) / sizeof(msi_table
));
2114 MsiSetInternalUI(INSTALLUILEVEL_NONE
| INSTALLUILEVEL_SOURCERESONLY
, NULL
);
2116 r
= MsiInstallProductA(msifile
, NULL
);
2117 if (r
== ERROR_SUCCESS
) /* win9x has a problem with this */
2119 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2120 ok(!delete_pf("msitest\\maximus", TRUE
), "UI install occurred, but execute-only was requested.\n");
2121 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
2122 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
2123 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2127 DeleteFile(msifile
);
2130 static BOOL
file_matches(LPSTR path
)
2136 file
= CreateFile(path
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
2137 NULL
, OPEN_EXISTING
, 0, NULL
);
2139 ZeroMemory(buf
, MAX_PATH
);
2140 ReadFile(file
, buf
, 15, &size
, NULL
);
2143 return !lstrcmp(buf
, "msitest\\maximus");
2146 static void test_readonlyfile(void)
2151 CHAR path
[MAX_PATH
];
2153 CreateDirectoryA("msitest", NULL
);
2154 create_file("msitest\\maximus", 500);
2155 create_database(msifile
, rof_tables
, sizeof(rof_tables
) / sizeof(msi_table
));
2157 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
2159 lstrcpy(path
, PROG_FILES_DIR
);
2160 lstrcat(path
, "\\msitest");
2161 CreateDirectory(path
, NULL
);
2163 lstrcat(path
, "\\maximus");
2164 file
= CreateFile(path
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
2165 NULL
, CREATE_NEW
, FILE_ATTRIBUTE_READONLY
, NULL
);
2167 WriteFile(file
, "readonlyfile", strlen("readonlyfile"), &size
, NULL
);
2170 r
= MsiInstallProductA(msifile
, NULL
);
2171 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2172 ok(file_matches(path
), "Expected file to be overwritten\n");
2173 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2174 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2176 /* Delete the files in the temp (current) folder */
2177 DeleteFile("msitest\\maximus");
2178 RemoveDirectory("msitest");
2179 DeleteFile(msifile
);
2182 static void test_setdirproperty(void)
2186 CreateDirectoryA("msitest", NULL
);
2187 create_file("msitest\\maximus", 500);
2188 create_database(msifile
, sdp_tables
, sizeof(sdp_tables
) / sizeof(msi_table
));
2190 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
2192 r
= MsiInstallProductA(msifile
, NULL
);
2193 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2194 ok(delete_cf("msitest\\maximus", TRUE
), "File not installed\n");
2195 ok(delete_cf("msitest", FALSE
), "File not installed\n");
2197 /* Delete the files in the temp (current) folder */
2198 DeleteFile(msifile
);
2199 DeleteFile("msitest\\maximus");
2200 RemoveDirectory("msitest");
2203 static void test_cabisextracted(void)
2207 CreateDirectoryA("msitest", NULL
);
2208 create_file("msitest\\gaius", 500);
2209 create_file("maximus", 500);
2210 create_file("augustus", 500);
2211 create_file("caesar", 500);
2213 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
2214 create_cab_file("test2.cab", MEDIA_SIZE
, "augustus\0");
2215 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
2217 create_database(msifile
, cie_tables
, sizeof(cie_tables
) / sizeof(msi_table
));
2219 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
2221 r
= MsiInstallProductA(msifile
, NULL
);
2222 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2223 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2224 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
2225 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
2226 ok(delete_pf("msitest\\gaius", TRUE
), "File not installed\n");
2227 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2229 /* Delete the files in the temp (current) folder */
2231 DeleteFile(msifile
);
2232 DeleteFile("maximus");
2233 DeleteFile("augustus");
2234 DeleteFile("caesar");
2235 DeleteFile("msitest\\gaius");
2236 RemoveDirectory("msitest");
2239 static void test_concurrentinstall(void)
2242 CHAR path
[MAX_PATH
];
2244 CreateDirectoryA("msitest", NULL
);
2245 CreateDirectoryA("msitest\\msitest", NULL
);
2246 create_file("msitest\\maximus", 500);
2247 create_file("msitest\\msitest\\augustus", 500);
2249 create_database(msifile
, ci_tables
, sizeof(ci_tables
) / sizeof(msi_table
));
2251 lstrcpyA(path
, CURR_DIR
);
2252 lstrcatA(path
, "\\msitest\\concurrent.msi");
2253 create_database(path
, ci2_tables
, sizeof(ci2_tables
) / sizeof(msi_table
));
2255 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2257 r
= MsiInstallProductA(msifile
, NULL
);
2258 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2259 if (!delete_pf("msitest\\augustus", TRUE
))
2260 trace("concurrent installs not supported\n");
2261 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2262 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2266 r
= MsiInstallProductA(msifile
, NULL
);
2267 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2268 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2269 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
2270 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2272 DeleteFile(msifile
);
2273 DeleteFile("msitest\\msitest\\augustus");
2274 DeleteFile("msitest\\maximus");
2275 RemoveDirectory("msitest\\msitest");
2276 RemoveDirectory("msitest");
2279 static void test_setpropertyfolder(void)
2282 CHAR path
[MAX_PATH
];
2284 lstrcpyA(path
, PROG_FILES_DIR
);
2285 lstrcatA(path
, "\\msitest\\added");
2287 CreateDirectoryA("msitest", NULL
);
2288 create_file("msitest\\maximus", 500);
2290 create_database(msifile
, spf_tables
, sizeof(spf_tables
) / sizeof(msi_table
));
2292 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2294 r
= MsiInstallProductA(msifile
, NULL
);
2295 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2296 if (GetFileAttributesA(path
) == FILE_ATTRIBUTE_DIRECTORY
)
2298 ok(delete_pf("msitest\\added\\maximus", TRUE
), "File not installed\n");
2299 ok(delete_pf("msitest\\added", FALSE
), "File not installed\n");
2300 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2304 trace("changing folder property not supported\n");
2305 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2306 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2309 /* Delete the files in the temp (current) folder */
2310 DeleteFile(msifile
);
2311 DeleteFile("msitest\\maximus");
2312 RemoveDirectory("msitest");
2315 static BOOL
file_exists(LPCSTR file
)
2317 return GetFileAttributes(file
) != INVALID_FILE_ATTRIBUTES
;
2320 static BOOL
pf_exists(LPCSTR file
)
2322 CHAR path
[MAX_PATH
];
2324 lstrcpyA(path
, PROG_FILES_DIR
);
2325 lstrcatA(path
, "\\");
2326 lstrcatA(path
, file
);
2328 return file_exists(path
);
2331 static void delete_pfmsitest_files(void)
2333 SHFILEOPSTRUCT shfl
;
2334 CHAR path
[MAX_PATH
+11];
2336 lstrcpyA(path
, PROG_FILES_DIR
);
2337 lstrcatA(path
, "\\msitest\\*");
2338 path
[strlen(path
) + 1] = '\0';
2341 shfl
.wFunc
= FO_DELETE
;
2344 shfl
.fFlags
= FOF_FILESONLY
| FOF_NOCONFIRMATION
| FOF_NORECURSION
| FOF_SILENT
;
2346 SHFileOperation(&shfl
);
2348 lstrcpyA(path
, PROG_FILES_DIR
);
2349 lstrcatA(path
, "\\msitest");
2350 RemoveDirectoryA(path
);
2353 static void check_reg_str(HKEY prodkey
, LPCSTR name
, LPCSTR expected
, BOOL bcase
, DWORD line
)
2361 res
= RegQueryValueExA(prodkey
, name
, NULL
, &type
, (LPBYTE
)val
, &size
);
2363 if (res
!= ERROR_SUCCESS
||
2364 (type
!= REG_SZ
&& type
!= REG_EXPAND_SZ
&& type
!= REG_MULTI_SZ
))
2366 ok_(__FILE__
, line
)(FALSE
, "Key doesn't exist or wrong type\n");
2371 ok_(__FILE__
, line
)(lstrlenA(val
) == 0, "Expected empty string, got %s\n", val
);
2375 ok_(__FILE__
, line
)(!lstrcmpA(val
, expected
), "Expected %s, got %s\n", expected
, val
);
2377 ok_(__FILE__
, line
)(!lstrcmpiA(val
, expected
), "Expected %s, got %s\n", expected
, val
);
2381 static void check_reg_dword(HKEY prodkey
, LPCSTR name
, DWORD expected
, DWORD line
)
2383 DWORD val
, size
, type
;
2386 size
= sizeof(DWORD
);
2387 res
= RegQueryValueExA(prodkey
, name
, NULL
, &type
, (LPBYTE
)&val
, &size
);
2389 if (res
!= ERROR_SUCCESS
|| type
!= REG_DWORD
)
2391 ok_(__FILE__
, line
)(FALSE
, "Key doesn't exist or wrong type\n");
2395 ok_(__FILE__
, line
)(val
== expected
, "Expected %d, got %d\n", expected
, val
);
2398 static void check_reg_dword2(HKEY prodkey
, LPCSTR name
, DWORD expected1
, DWORD expected2
, DWORD line
)
2400 DWORD val
, size
, type
;
2403 size
= sizeof(DWORD
);
2404 res
= RegQueryValueExA(prodkey
, name
, NULL
, &type
, (LPBYTE
)&val
, &size
);
2406 if (res
!= ERROR_SUCCESS
|| type
!= REG_DWORD
)
2408 ok_(__FILE__
, line
)(FALSE
, "Key doesn't exist or wrong type\n");
2412 ok_(__FILE__
, line
)(val
== expected1
|| val
== expected2
, "Expected %d or %d, got %d\n", expected1
, expected2
, val
);
2415 static void check_reg_dword3(HKEY prodkey
, LPCSTR name
, DWORD expected1
, DWORD expected2
, DWORD expected3
, DWORD line
)
2417 DWORD val
, size
, type
;
2420 size
= sizeof(DWORD
);
2421 res
= RegQueryValueExA(prodkey
, name
, NULL
, &type
, (LPBYTE
)&val
, &size
);
2423 if (res
!= ERROR_SUCCESS
|| type
!= REG_DWORD
)
2425 ok_(__FILE__
, line
)(FALSE
, "Key doesn't exist or wrong type\n");
2429 ok_(__FILE__
, line
)(val
== expected1
|| val
== expected2
|| val
== expected3
,
2430 "Expected %d, %d or %d, got %d\n", expected1
, expected2
, expected3
, val
);
2433 #define CHECK_REG_STR(prodkey, name, expected) \
2434 check_reg_str(prodkey, name, expected, TRUE, __LINE__);
2436 #define CHECK_DEL_REG_STR(prodkey, name, expected) \
2437 check_reg_str(prodkey, name, expected, TRUE, __LINE__); \
2438 RegDeleteValueA(prodkey, name);
2440 #define CHECK_REG_ISTR(prodkey, name, expected) \
2441 check_reg_str(prodkey, name, expected, FALSE, __LINE__);
2443 #define CHECK_DEL_REG_ISTR(prodkey, name, expected) \
2444 check_reg_str(prodkey, name, expected, FALSE, __LINE__); \
2445 RegDeleteValueA(prodkey, name);
2447 #define CHECK_REG_DWORD(prodkey, name, expected) \
2448 check_reg_dword(prodkey, name, expected, __LINE__);
2450 #define CHECK_DEL_REG_DWORD(prodkey, name, expected) \
2451 check_reg_dword(prodkey, name, expected, __LINE__); \
2452 RegDeleteValueA(prodkey, name);
2454 #define CHECK_REG_DWORD2(prodkey, name, expected1, expected2) \
2455 check_reg_dword2(prodkey, name, expected1, expected2, __LINE__);
2457 #define CHECK_DEL_REG_DWORD2(prodkey, name, expected1, expected2) \
2458 check_reg_dword2(prodkey, name, expected1, expected2, __LINE__); \
2459 RegDeleteValueA(prodkey, name);
2461 #define CHECK_REG_DWORD3(prodkey, name, expected1, expected2, expected3) \
2462 check_reg_dword3(prodkey, name, expected1, expected2, expected3, __LINE__);
2464 #define CHECK_DEL_REG_DWORD3(prodkey, name, expected1, expected2, expected3) \
2465 check_reg_dword3(prodkey, name, expected1, expected2, expected3, __LINE__); \
2466 RegDeleteValueA(prodkey, name);
2468 static void get_date_str(LPSTR date
)
2472 static const char date_fmt
[] = "%d%02d%02d";
2473 GetLocalTime(&systime
);
2474 sprintf(date
, date_fmt
, systime
.wYear
, systime
.wMonth
, systime
.wDay
);
2477 static void test_publish_registerproduct(void)
2484 char date
[MAX_PATH
];
2485 char temp
[MAX_PATH
];
2486 char keypath
[MAX_PATH
];
2488 static const CHAR uninstall
[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2489 "\\Uninstall\\{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2490 static const CHAR userdata
[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer"
2491 "\\UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2492 static const CHAR ugkey
[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer"
2493 "\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
2494 static const CHAR userugkey
[] = "Software\\Microsoft\\Installer\\UpgradeCodes"
2495 "\\51AAE0C44620A5E4788506E91F249BD2";
2497 get_user_sid(&usersid
);
2500 skip("ConvertSidToStringSidA is not available\n");
2505 GetTempPath(MAX_PATH
, temp
);
2507 CreateDirectoryA("msitest", NULL
);
2508 create_file("msitest\\maximus", 500);
2510 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
2512 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2514 /* RegisterProduct */
2515 r
= MsiInstallProductA(msifile
, "REGISTER_PRODUCT=1");
2516 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2517 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2518 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2520 res
= RegOpenKeyA(HKEY_CURRENT_USER
, userugkey
, &hkey
);
2521 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2523 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, uninstall
, &hkey
);
2524 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2526 CHECK_DEL_REG_STR(hkey
, "DisplayName", "MSITEST");
2527 CHECK_DEL_REG_STR(hkey
, "DisplayVersion", "1.1.1");
2528 CHECK_DEL_REG_STR(hkey
, "InstallDate", date
);
2529 CHECK_DEL_REG_STR(hkey
, "InstallSource", temp
);
2530 CHECK_DEL_REG_ISTR(hkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2531 CHECK_DEL_REG_STR(hkey
, "Publisher", "Wine");
2532 CHECK_DEL_REG_STR(hkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2533 CHECK_DEL_REG_STR(hkey
, "AuthorizedCDFPrefix", NULL
);
2534 CHECK_DEL_REG_STR(hkey
, "Comments", NULL
);
2535 CHECK_DEL_REG_STR(hkey
, "Contact", NULL
);
2536 CHECK_DEL_REG_STR(hkey
, "HelpLink", NULL
);
2537 CHECK_DEL_REG_STR(hkey
, "HelpTelephone", NULL
);
2538 CHECK_DEL_REG_STR(hkey
, "InstallLocation", NULL
);
2539 CHECK_DEL_REG_STR(hkey
, "Readme", NULL
);
2540 CHECK_DEL_REG_STR(hkey
, "Size", NULL
);
2541 CHECK_DEL_REG_STR(hkey
, "URLInfoAbout", NULL
);
2542 CHECK_DEL_REG_STR(hkey
, "URLUpdateInfo", NULL
);
2543 CHECK_DEL_REG_DWORD(hkey
, "Language", 1033);
2544 CHECK_DEL_REG_DWORD(hkey
, "Version", 0x1010001);
2545 CHECK_DEL_REG_DWORD(hkey
, "VersionMajor", 1);
2546 CHECK_DEL_REG_DWORD(hkey
, "VersionMinor", 1);
2547 CHECK_DEL_REG_DWORD(hkey
, "WindowsInstaller", 1);
2550 CHECK_DEL_REG_DWORD3(hkey
, "EstimatedSize", 12, -12, 4);
2553 RegDeleteKeyA(hkey
, "");
2556 sprintf(keypath
, userdata
, usersid
);
2557 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &hkey
);
2558 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2560 res
= RegOpenKeyA(hkey
, "InstallProperties", &props
);
2561 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2563 RegDeleteValueA(props
, "LocalPackage"); /* LocalPackage is nondeterministic */
2564 CHECK_DEL_REG_STR(props
, "DisplayName", "MSITEST");
2565 CHECK_DEL_REG_STR(props
, "DisplayVersion", "1.1.1");
2566 CHECK_DEL_REG_STR(props
, "InstallDate", date
);
2567 CHECK_DEL_REG_STR(props
, "InstallSource", temp
);
2568 CHECK_DEL_REG_ISTR(props
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2569 CHECK_DEL_REG_STR(props
, "Publisher", "Wine");
2570 CHECK_DEL_REG_STR(props
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2571 CHECK_DEL_REG_STR(props
, "AuthorizedCDFPrefix", NULL
);
2572 CHECK_DEL_REG_STR(props
, "Comments", NULL
);
2573 CHECK_DEL_REG_STR(props
, "Contact", NULL
);
2574 CHECK_DEL_REG_STR(props
, "HelpLink", NULL
);
2575 CHECK_DEL_REG_STR(props
, "HelpTelephone", NULL
);
2576 CHECK_DEL_REG_STR(props
, "InstallLocation", NULL
);
2577 CHECK_DEL_REG_STR(props
, "Readme", NULL
);
2578 CHECK_DEL_REG_STR(props
, "Size", NULL
);
2579 CHECK_DEL_REG_STR(props
, "URLInfoAbout", NULL
);
2580 CHECK_DEL_REG_STR(props
, "URLUpdateInfo", NULL
);
2581 CHECK_DEL_REG_DWORD(props
, "Language", 1033);
2582 CHECK_DEL_REG_DWORD(props
, "Version", 0x1010001);
2583 CHECK_DEL_REG_DWORD(props
, "VersionMajor", 1);
2584 CHECK_DEL_REG_DWORD(props
, "VersionMinor", 1);
2585 CHECK_DEL_REG_DWORD(props
, "WindowsInstaller", 1);
2588 CHECK_DEL_REG_DWORD3(props
, "EstimatedSize", 12, -12, 4);
2591 RegDeleteKeyA(props
, "");
2594 res
= RegOpenKeyA(hkey
, "Usage", &usage
);
2597 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2600 RegDeleteKeyA(usage
, "");
2602 RegDeleteKeyA(hkey
, "");
2605 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, ugkey
, &hkey
);
2606 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2608 CHECK_DEL_REG_STR(hkey
, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL
);
2610 RegDeleteKeyA(hkey
, "");
2613 /* RegisterProduct, machine */
2614 r
= MsiInstallProductA(msifile
, "REGISTER_PRODUCT=1 ALLUSERS=1");
2615 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2616 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2617 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2619 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, userugkey
, &hkey
);
2620 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2622 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, uninstall
, &hkey
);
2623 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2625 CHECK_DEL_REG_STR(hkey
, "DisplayName", "MSITEST");
2626 CHECK_DEL_REG_STR(hkey
, "DisplayVersion", "1.1.1");
2627 CHECK_DEL_REG_STR(hkey
, "InstallDate", date
);
2628 CHECK_DEL_REG_STR(hkey
, "InstallSource", temp
);
2629 CHECK_DEL_REG_ISTR(hkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2630 CHECK_DEL_REG_STR(hkey
, "Publisher", "Wine");
2631 CHECK_DEL_REG_STR(hkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2632 CHECK_DEL_REG_STR(hkey
, "AuthorizedCDFPrefix", NULL
);
2633 CHECK_DEL_REG_STR(hkey
, "Comments", NULL
);
2634 CHECK_DEL_REG_STR(hkey
, "Contact", NULL
);
2635 CHECK_DEL_REG_STR(hkey
, "HelpLink", NULL
);
2636 CHECK_DEL_REG_STR(hkey
, "HelpTelephone", NULL
);
2637 CHECK_DEL_REG_STR(hkey
, "InstallLocation", NULL
);
2638 CHECK_DEL_REG_STR(hkey
, "Readme", NULL
);
2639 CHECK_DEL_REG_STR(hkey
, "Size", NULL
);
2640 CHECK_DEL_REG_STR(hkey
, "URLInfoAbout", NULL
);
2641 CHECK_DEL_REG_STR(hkey
, "URLUpdateInfo", NULL
);
2642 CHECK_DEL_REG_DWORD(hkey
, "Language", 1033);
2643 CHECK_DEL_REG_DWORD(hkey
, "Version", 0x1010001);
2644 CHECK_DEL_REG_DWORD(hkey
, "VersionMajor", 1);
2645 CHECK_DEL_REG_DWORD(hkey
, "VersionMinor", 1);
2646 CHECK_DEL_REG_DWORD(hkey
, "WindowsInstaller", 1);
2649 CHECK_DEL_REG_DWORD3(hkey
, "EstimatedSize", 12, -12, 4);
2652 RegDeleteKeyA(hkey
, "");
2655 sprintf(keypath
, userdata
, "S-1-5-18");
2656 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &hkey
);
2657 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2659 res
= RegOpenKeyA(hkey
, "InstallProperties", &props
);
2660 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2662 RegDeleteValueA(props
, "LocalPackage"); /* LocalPackage is nondeterministic */
2663 CHECK_DEL_REG_STR(props
, "DisplayName", "MSITEST");
2664 CHECK_DEL_REG_STR(props
, "DisplayVersion", "1.1.1");
2665 CHECK_DEL_REG_STR(props
, "InstallDate", date
);
2666 CHECK_DEL_REG_STR(props
, "InstallSource", temp
);
2667 CHECK_DEL_REG_ISTR(props
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2668 CHECK_DEL_REG_STR(props
, "Publisher", "Wine");
2669 CHECK_DEL_REG_STR(props
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2670 CHECK_DEL_REG_STR(props
, "AuthorizedCDFPrefix", NULL
);
2671 CHECK_DEL_REG_STR(props
, "Comments", NULL
);
2672 CHECK_DEL_REG_STR(props
, "Contact", NULL
);
2673 CHECK_DEL_REG_STR(props
, "HelpLink", NULL
);
2674 CHECK_DEL_REG_STR(props
, "HelpTelephone", NULL
);
2675 CHECK_DEL_REG_STR(props
, "InstallLocation", NULL
);
2676 CHECK_DEL_REG_STR(props
, "Readme", NULL
);
2677 CHECK_DEL_REG_STR(props
, "Size", NULL
);
2678 CHECK_DEL_REG_STR(props
, "URLInfoAbout", NULL
);
2679 CHECK_DEL_REG_STR(props
, "URLUpdateInfo", NULL
);
2680 CHECK_DEL_REG_DWORD(props
, "Language", 1033);
2681 CHECK_DEL_REG_DWORD(props
, "Version", 0x1010001);
2682 CHECK_DEL_REG_DWORD(props
, "VersionMajor", 1);
2683 CHECK_DEL_REG_DWORD(props
, "VersionMinor", 1);
2684 CHECK_DEL_REG_DWORD(props
, "WindowsInstaller", 1);
2687 CHECK_DEL_REG_DWORD3(props
, "EstimatedSize", 12, -12, 4);
2690 RegDeleteKeyA(props
, "");
2693 res
= RegOpenKeyA(hkey
, "Usage", &usage
);
2696 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2699 RegDeleteKeyA(usage
, "");
2701 RegDeleteKeyA(hkey
, "");
2704 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, ugkey
, &hkey
);
2705 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2707 CHECK_DEL_REG_STR(hkey
, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL
);
2709 RegDeleteKeyA(hkey
, "");
2712 DeleteFile(msifile
);
2713 DeleteFile("msitest\\maximus");
2714 RemoveDirectory("msitest");
2715 HeapFree(GetProcessHeap(), 0, usersid
);
2718 static void test_publish_publishproduct(void)
2723 HKEY sourcelist
, net
, props
;
2724 HKEY hkey
, patches
, media
;
2725 CHAR keypath
[MAX_PATH
];
2726 CHAR temp
[MAX_PATH
];
2727 CHAR path
[MAX_PATH
];
2729 static const CHAR prodpath
[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2730 "\\Installer\\UserData\\%s\\Products"
2731 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2732 static const CHAR cuprodpath
[] = "Software\\Microsoft\\Installer\\Products"
2733 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2734 static const CHAR cuupgrades
[] = "Software\\Microsoft\\Installer\\UpgradeCodes"
2735 "\\51AAE0C44620A5E4788506E91F249BD2";
2736 static const CHAR badprod
[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2737 "\\Installer\\Products"
2738 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2739 static const CHAR machprod
[] = "Installer\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2740 static const CHAR machup
[] = "Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
2742 get_user_sid(&usersid
);
2745 skip("ConvertSidToStringSidA is not available\n");
2749 GetTempPath(MAX_PATH
, temp
);
2751 CreateDirectoryA("msitest", NULL
);
2752 create_file("msitest\\maximus", 500);
2754 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
2756 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2758 /* PublishProduct, current user */
2759 r
= MsiInstallProductA(msifile
, "PUBLISH_PRODUCT=1");
2760 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2761 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2762 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2764 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, badprod
, &hkey
);
2765 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2767 sprintf(keypath
, prodpath
, usersid
);
2768 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &hkey
);
2769 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2771 res
= RegOpenKeyA(hkey
, "InstallProperties", &props
);
2772 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2774 res
= RegOpenKeyA(hkey
, "Patches", &patches
);
2777 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2779 CHECK_DEL_REG_STR(patches
, "AllPatches", NULL
);
2782 RegDeleteKeyA(patches
, "");
2783 RegCloseKey(patches
);
2784 RegDeleteKeyA(hkey
, "");
2787 res
= RegOpenKeyA(HKEY_CURRENT_USER
, cuprodpath
, &hkey
);
2788 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2790 CHECK_DEL_REG_STR(hkey
, "ProductName", "MSITEST");
2791 CHECK_DEL_REG_STR(hkey
, "PackageCode", "AC75740029052c94DA02821EECD05F2F");
2792 CHECK_DEL_REG_DWORD(hkey
, "Language", 1033);
2793 CHECK_DEL_REG_DWORD(hkey
, "Version", 0x1010001);
2794 CHECK_DEL_REG_DWORD(hkey
, "AuthorizedLUAApp", 0);
2795 CHECK_DEL_REG_DWORD(hkey
, "Assignment", 0);
2796 CHECK_DEL_REG_DWORD(hkey
, "AdvertiseFlags", 0x184);
2797 CHECK_DEL_REG_DWORD(hkey
, "InstanceType", 0);
2798 CHECK_DEL_REG_STR(hkey
, "Clients", ":");
2800 res
= RegOpenKeyA(hkey
, "SourceList", &sourcelist
);
2801 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2803 lstrcpyA(path
, "n;1;");
2804 lstrcatA(path
, temp
);
2805 CHECK_DEL_REG_STR(sourcelist
, "LastUsedSource", path
);
2806 CHECK_DEL_REG_STR(sourcelist
, "PackageName", "msitest.msi");
2808 res
= RegOpenKeyA(sourcelist
, "Net", &net
);
2809 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2811 CHECK_DEL_REG_STR(net
, "1", temp
);
2813 RegDeleteKeyA(net
, "");
2816 res
= RegOpenKeyA(sourcelist
, "Media", &media
);
2817 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2819 CHECK_DEL_REG_STR(media
, "1", "DISK1;");
2821 RegDeleteKeyA(media
, "");
2823 RegDeleteKeyA(sourcelist
, "");
2824 RegCloseKey(sourcelist
);
2825 RegDeleteKeyA(hkey
, "");
2828 res
= RegOpenKeyA(HKEY_CURRENT_USER
, cuupgrades
, &hkey
);
2829 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2831 CHECK_DEL_REG_STR(hkey
, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL
);
2833 RegDeleteKeyA(hkey
, "");
2836 /* PublishProduct, machine */
2837 r
= MsiInstallProductA(msifile
, "PUBLISH_PRODUCT=1 ALLUSERS=1");
2838 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2839 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2840 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2842 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, badprod
, &hkey
);
2843 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2845 sprintf(keypath
, prodpath
, "S-1-5-18");
2846 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &hkey
);
2847 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2849 res
= RegOpenKeyA(hkey
, "InstallProperties", &props
);
2850 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2852 res
= RegOpenKeyA(hkey
, "Patches", &patches
);
2855 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2857 CHECK_DEL_REG_STR(patches
, "AllPatches", NULL
);
2860 RegDeleteKeyA(patches
, "");
2861 RegCloseKey(patches
);
2862 RegDeleteKeyA(hkey
, "");
2865 res
= RegOpenKeyA(HKEY_CLASSES_ROOT
, machprod
, &hkey
);
2866 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2868 CHECK_DEL_REG_STR(hkey
, "ProductName", "MSITEST");
2869 CHECK_DEL_REG_STR(hkey
, "PackageCode", "AC75740029052c94DA02821EECD05F2F");
2870 CHECK_DEL_REG_DWORD(hkey
, "Language", 1033);
2871 CHECK_DEL_REG_DWORD(hkey
, "Version", 0x1010001);
2872 CHECK_DEL_REG_DWORD(hkey
, "AuthorizedLUAApp", 0);
2873 todo_wine
CHECK_DEL_REG_DWORD(hkey
, "Assignment", 1);
2874 CHECK_DEL_REG_DWORD(hkey
, "AdvertiseFlags", 0x184);
2875 CHECK_DEL_REG_DWORD(hkey
, "InstanceType", 0);
2876 CHECK_DEL_REG_STR(hkey
, "Clients", ":");
2878 res
= RegOpenKeyA(hkey
, "SourceList", &sourcelist
);
2879 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2881 lstrcpyA(path
, "n;1;");
2882 lstrcatA(path
, temp
);
2883 CHECK_DEL_REG_STR(sourcelist
, "LastUsedSource", path
);
2884 CHECK_DEL_REG_STR(sourcelist
, "PackageName", "msitest.msi");
2886 res
= RegOpenKeyA(sourcelist
, "Net", &net
);
2887 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2889 CHECK_DEL_REG_STR(net
, "1", temp
);
2891 RegDeleteKeyA(net
, "");
2894 res
= RegOpenKeyA(sourcelist
, "Media", &media
);
2895 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2897 CHECK_DEL_REG_STR(media
, "1", "DISK1;");
2899 RegDeleteKeyA(media
, "");
2901 RegDeleteKeyA(sourcelist
, "");
2902 RegCloseKey(sourcelist
);
2903 RegDeleteKeyA(hkey
, "");
2906 res
= RegOpenKeyA(HKEY_CLASSES_ROOT
, machup
, &hkey
);
2907 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2909 CHECK_DEL_REG_STR(hkey
, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL
);
2911 RegDeleteKeyA(hkey
, "");
2914 DeleteFile(msifile
);
2915 DeleteFile("msitest\\maximus");
2916 RemoveDirectory("msitest");
2917 HeapFree(GetProcessHeap(), 0, usersid
);
2920 static void test_publish_publishfeatures(void)
2926 CHAR keypath
[MAX_PATH
];
2928 static const CHAR cupath
[] = "Software\\Microsoft\\Installer\\Features"
2929 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2930 static const CHAR udpath
[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2931 "\\Installer\\UserData\\%s\\Products"
2932 "\\84A88FD7F6998CE40A22FB59F6B9C2BB\\Features";
2933 static const CHAR featkey
[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2934 "\\Installer\\Features";
2935 static const CHAR classfeat
[] = "Software\\Classes\\Installer\\Features"
2936 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2938 get_user_sid(&usersid
);
2941 skip("ConvertSidToStringSidA is not available\n");
2945 CreateDirectoryA("msitest", NULL
);
2946 create_file("msitest\\maximus", 500);
2948 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
2950 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2952 /* PublishFeatures, current user */
2953 r
= MsiInstallProductA(msifile
, "PUBLISH_FEATURES=1");
2954 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2955 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2956 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2958 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, featkey
, &hkey
);
2959 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2961 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, classfeat
, &hkey
);
2962 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2964 res
= RegOpenKeyA(HKEY_CURRENT_USER
, cupath
, &hkey
);
2965 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2967 CHECK_REG_STR(hkey
, "feature", "");
2968 CHECK_REG_STR(hkey
, "montecristo", "");
2970 RegDeleteValueA(hkey
, "feature");
2971 RegDeleteValueA(hkey
, "montecristo");
2972 RegDeleteKeyA(hkey
, "");
2975 sprintf(keypath
, udpath
, usersid
);
2976 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &hkey
);
2977 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2979 CHECK_REG_STR(hkey
, "feature", "VGtfp^p+,?82@JU1j_KE");
2980 CHECK_REG_STR(hkey
, "montecristo", "VGtfp^p+,?82@JU1j_KE");
2982 RegDeleteValueA(hkey
, "feature");
2983 RegDeleteValueA(hkey
, "montecristo");
2984 RegDeleteKeyA(hkey
, "");
2987 /* PublishFeatures, machine */
2988 r
= MsiInstallProductA(msifile
, "PUBLISH_FEATURES=1 ALLUSERS=1");
2989 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2990 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2991 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2993 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, featkey
, &hkey
);
2994 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2996 res
= RegOpenKeyA(HKEY_CURRENT_USER
, cupath
, &hkey
);
2997 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2999 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, classfeat
, &hkey
);
3000 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3002 CHECK_REG_STR(hkey
, "feature", "");
3003 CHECK_REG_STR(hkey
, "montecristo", "");
3005 RegDeleteValueA(hkey
, "feature");
3006 RegDeleteValueA(hkey
, "montecristo");
3007 RegDeleteKeyA(hkey
, "");
3010 sprintf(keypath
, udpath
, "S-1-5-18");
3011 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &hkey
);
3012 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3014 CHECK_REG_STR(hkey
, "feature", "VGtfp^p+,?82@JU1j_KE");
3015 CHECK_REG_STR(hkey
, "montecristo", "VGtfp^p+,?82@JU1j_KE");
3017 RegDeleteValueA(hkey
, "feature");
3018 RegDeleteValueA(hkey
, "montecristo");
3019 RegDeleteKeyA(hkey
, "");
3022 DeleteFile(msifile
);
3023 DeleteFile("msitest\\maximus");
3024 RemoveDirectory("msitest");
3025 HeapFree(GetProcessHeap(), 0, usersid
);
3028 static LPSTR
reg_get_val_str(HKEY hkey
, LPCSTR name
)
3034 r
= RegQueryValueExA(hkey
, name
, NULL
, NULL
, NULL
, &len
);
3035 if (r
!= ERROR_SUCCESS
)
3038 len
+= sizeof (WCHAR
);
3039 val
= HeapAlloc(GetProcessHeap(), 0, len
);
3040 if (!val
) return NULL
;
3042 RegQueryValueExA(hkey
, name
, NULL
, NULL
, (LPBYTE
)val
, &len
);
3046 static void get_owner_company(LPSTR
*owner
, LPSTR
*company
)
3051 *owner
= *company
= NULL
;
3053 res
= RegOpenKeyA(HKEY_CURRENT_USER
,
3054 "Software\\Microsoft\\MS Setup (ACME)\\User Info", &hkey
);
3055 if (res
== ERROR_SUCCESS
)
3057 *owner
= reg_get_val_str(hkey
, "DefName");
3058 *company
= reg_get_val_str(hkey
, "DefCompany");
3062 if (!*owner
|| !*company
)
3064 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
,
3065 "Software\\Microsoft\\Windows\\CurrentVersion", &hkey
);
3066 if (res
== ERROR_SUCCESS
)
3068 *owner
= reg_get_val_str(hkey
, "RegisteredOwner");
3069 *company
= reg_get_val_str(hkey
, "RegisteredOrganization");
3074 if (!*owner
|| !*company
)
3076 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
,
3077 "Software\\Microsoft\\Windows NT\\CurrentVersion", &hkey
);
3078 if (res
== ERROR_SUCCESS
)
3080 *owner
= reg_get_val_str(hkey
, "RegisteredOwner");
3081 *company
= reg_get_val_str(hkey
, "RegisteredOrganization");
3087 static void test_publish_registeruser(void)
3093 LPSTR owner
, company
;
3094 CHAR keypath
[MAX_PATH
];
3096 static const CHAR keyfmt
[] =
3097 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
3098 "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties";
3100 get_user_sid(&usersid
);
3103 skip("ConvertSidToStringSidA is not available\n");
3107 get_owner_company(&owner
, &company
);
3109 CreateDirectoryA("msitest", NULL
);
3110 create_file("msitest\\maximus", 500);
3112 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
3114 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
3116 /* RegisterUser, per-user */
3117 r
= MsiInstallProductA(msifile
, "REGISTER_USER=1");
3118 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3119 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3120 ok(delete_pf("msitest", FALSE
), "File not installed\n");
3122 sprintf(keypath
, keyfmt
, usersid
);
3124 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &props
);
3125 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3127 CHECK_REG_STR(props
, "ProductID", "none");
3128 CHECK_REG_STR(props
, "RegCompany", company
);
3129 CHECK_REG_STR(props
, "RegOwner", owner
);
3131 RegDeleteValueA(props
, "ProductID");
3132 RegDeleteValueA(props
, "RegCompany");
3133 RegDeleteValueA(props
, "RegOwner");
3134 RegDeleteKeyA(props
, "");
3137 /* RegisterUser, machine */
3138 r
= MsiInstallProductA(msifile
, "REGISTER_USER=1 ALLUSERS=1");
3139 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3140 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3141 ok(delete_pf("msitest", FALSE
), "File not installed\n");
3143 sprintf(keypath
, keyfmt
, "S-1-5-18");
3145 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &props
);
3146 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3148 CHECK_REG_STR(props
, "ProductID", "none");
3149 CHECK_REG_STR(props
, "RegCompany", company
);
3150 CHECK_REG_STR(props
, "RegOwner", owner
);
3152 RegDeleteValueA(props
, "ProductID");
3153 RegDeleteValueA(props
, "RegCompany");
3154 RegDeleteValueA(props
, "RegOwner");
3155 RegDeleteKeyA(props
, "");
3158 HeapFree(GetProcessHeap(), 0, company
);
3159 HeapFree(GetProcessHeap(), 0, owner
);
3161 DeleteFile(msifile
);
3162 DeleteFile("msitest\\maximus");
3163 RemoveDirectory("msitest");
3166 static void test_publish_processcomponents(void)
3174 CHAR keypath
[MAX_PATH
];
3175 CHAR program_files_maximus
[MAX_PATH
];
3177 static const CHAR keyfmt
[] =
3178 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
3179 "UserData\\%s\\Components\\%s";
3180 static const CHAR compkey
[] =
3181 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Components";
3183 get_user_sid(&usersid
);
3186 skip("ConvertSidToStringSidA is not available\n");
3190 CreateDirectoryA("msitest", NULL
);
3191 create_file("msitest\\maximus", 500);
3193 create_database(msifile
, ppc_tables
, sizeof(ppc_tables
) / sizeof(msi_table
));
3195 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
3197 /* ProcessComponents, per-user */
3198 r
= MsiInstallProductA(msifile
, "PROCESS_COMPONENTS=1");
3199 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3200 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3201 ok(delete_pf("msitest", FALSE
), "File not installed\n");
3203 sprintf(keypath
, keyfmt
, usersid
, "CBABC2FDCCB35E749A8944D8C1C098B5");
3205 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &comp
);
3206 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3209 res
= RegQueryValueExA(comp
, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3210 NULL
, NULL
, (LPBYTE
)val
, &size
);
3211 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3213 lstrcpyA(program_files_maximus
,PROG_FILES_DIR
);
3214 lstrcatA(program_files_maximus
,"\\msitest\\maximus");
3216 ok(!lstrcmpA(val
, program_files_maximus
),
3217 "Expected \"%s\", got \"%s\"\n", program_files_maximus
, val
);
3219 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, compkey
, &hkey
);
3220 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3222 RegDeleteValueA(comp
, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3223 RegDeleteKeyA(comp
, "");
3226 sprintf(keypath
, keyfmt
, usersid
, "241C3DA58FECD0945B9687D408766058");
3228 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &comp
);
3229 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3232 res
= RegQueryValueExA(comp
, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3233 NULL
, NULL
, (LPBYTE
)val
, &size
);
3234 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3235 ok(!lstrcmpA(val
, "01\\msitest\\augustus"),
3236 "Expected \"01\\msitest\\augustus\", got \"%s\"\n", val
);
3238 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, compkey
, &hkey
);
3239 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3241 RegDeleteValueA(comp
, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3242 RegDeleteKeyA(comp
, "");
3245 /* ProcessComponents, machine */
3246 r
= MsiInstallProductA(msifile
, "PROCESS_COMPONENTS=1 ALLUSERS=1");
3247 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3248 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
3249 ok(delete_pf("msitest", FALSE
), "File not installed\n");
3251 sprintf(keypath
, keyfmt
, "S-1-5-18", "CBABC2FDCCB35E749A8944D8C1C098B5");
3253 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &comp
);
3254 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3257 res
= RegQueryValueExA(comp
, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3258 NULL
, NULL
, (LPBYTE
)val
, &size
);
3259 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3260 ok(!lstrcmpA(val
, program_files_maximus
),
3261 "Expected \"%s\", got \"%s\"\n", program_files_maximus
, val
);
3263 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, compkey
, &hkey
);
3264 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3266 RegDeleteValueA(comp
, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3267 RegDeleteKeyA(comp
, "");
3270 sprintf(keypath
, keyfmt
, "S-1-5-18", "241C3DA58FECD0945B9687D408766058");
3272 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &comp
);
3273 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3276 res
= RegQueryValueExA(comp
, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3277 NULL
, NULL
, (LPBYTE
)val
, &size
);
3278 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3279 ok(!lstrcmpA(val
, "01\\msitest\\augustus"),
3280 "Expected \"01\\msitest\\augustus\", got \"%s\"\n", val
);
3282 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, compkey
, &hkey
);
3283 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3285 RegDeleteValueA(comp
, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3286 RegDeleteKeyA(comp
, "");
3289 DeleteFile(msifile
);
3290 DeleteFile("msitest\\maximus");
3291 RemoveDirectory("msitest");
3294 static void test_publish(void)
3298 HKEY uninstall
, prodkey
;
3300 CHAR prodcode
[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
3301 char date
[MAX_PATH
];
3302 char temp
[MAX_PATH
];
3304 static const CHAR subkey
[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
3306 if (!pMsiQueryComponentStateA
)
3308 skip("MsiQueryComponentStateA is not available\n");
3313 GetTempPath(MAX_PATH
, temp
);
3315 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, subkey
, &uninstall
);
3316 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3318 CreateDirectoryA("msitest", NULL
);
3319 create_file("msitest\\maximus", 500);
3321 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
3323 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
3325 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3326 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3328 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3329 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3331 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3332 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3334 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3335 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3336 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3337 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3339 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3340 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3342 /* nothing published */
3343 r
= MsiInstallProductA(msifile
, NULL
);
3344 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3345 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3346 ok(pf_exists("msitest"), "File not installed\n");
3348 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3349 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3351 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3352 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3354 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3355 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3357 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3358 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3359 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3360 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3362 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3363 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3365 /* PublishProduct and RegisterProduct */
3366 r
= MsiInstallProductA(msifile
, "REGISTER_PRODUCT=1 PUBLISH_PRODUCT=1");
3367 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3368 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3369 ok(pf_exists("msitest"), "File not installed\n");
3371 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3372 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
3374 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3375 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3377 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3378 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3380 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3381 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3382 ok(r
== ERROR_UNKNOWN_COMPONENT
, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r
);
3383 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3385 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3386 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3388 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
3389 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
3390 CHECK_REG_STR(prodkey
, "InstallDate", date
);
3391 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
3392 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3393 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
3394 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3395 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
3396 CHECK_REG_STR(prodkey
, "Comments", NULL
);
3397 CHECK_REG_STR(prodkey
, "Contact", NULL
);
3398 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
3399 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
3400 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
3401 CHECK_REG_STR(prodkey
, "Readme", NULL
);
3402 CHECK_REG_STR(prodkey
, "Size", NULL
);
3403 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
3404 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
3405 CHECK_REG_DWORD(prodkey
, "Language", 1033);
3406 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
3407 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
3408 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
3409 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
3412 CHECK_REG_DWORD2(prodkey
, "EstimatedSize", 12, -12);
3415 RegCloseKey(prodkey
);
3417 r
= MsiInstallProductA(msifile
, "FULL=1 REMOVE=ALL");
3418 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3419 ok(pf_exists("msitest\\maximus"), "File deleted\n");
3420 ok(pf_exists("msitest"), "File deleted\n");
3422 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3423 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3425 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3426 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3428 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3429 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3431 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3432 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3433 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3434 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3436 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3437 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3439 /* complete install */
3440 r
= MsiInstallProductA(msifile
, "FULL=1");
3441 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3442 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3443 ok(pf_exists("msitest"), "File not installed\n");
3445 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3446 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
3448 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3449 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3451 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3452 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3454 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3455 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3456 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3457 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3459 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3460 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3462 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
3463 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
3464 CHECK_REG_STR(prodkey
, "InstallDate", date
);
3465 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
3466 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3467 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
3468 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3469 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
3470 CHECK_REG_STR(prodkey
, "Comments", NULL
);
3471 CHECK_REG_STR(prodkey
, "Contact", NULL
);
3472 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
3473 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
3474 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
3475 CHECK_REG_STR(prodkey
, "Readme", NULL
);
3476 CHECK_REG_STR(prodkey
, "Size", NULL
);
3477 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
3478 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
3479 CHECK_REG_DWORD(prodkey
, "Language", 1033);
3480 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
3481 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
3482 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
3483 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
3486 CHECK_REG_DWORD2(prodkey
, "EstimatedSize", 12, -12);
3489 RegCloseKey(prodkey
);
3491 /* no UnpublishFeatures */
3492 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
3493 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3494 ok(!pf_exists("msitest\\maximus"), "File deleted\n");
3497 ok(!pf_exists("msitest"), "File deleted\n");
3500 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3501 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3503 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3504 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3506 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3507 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3509 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3510 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3511 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3512 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3514 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3515 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3517 /* complete install */
3518 r
= MsiInstallProductA(msifile
, "FULL=1");
3519 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3520 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3521 ok(pf_exists("msitest"), "File not installed\n");
3523 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3524 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
3526 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3527 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3529 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3530 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3532 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3533 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3534 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3535 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3537 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3538 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3540 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
3541 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
3542 CHECK_REG_STR(prodkey
, "InstallDate", date
);
3543 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
3544 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3545 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
3546 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3547 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
3548 CHECK_REG_STR(prodkey
, "Comments", NULL
);
3549 CHECK_REG_STR(prodkey
, "Contact", NULL
);
3550 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
3551 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
3552 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
3553 CHECK_REG_STR(prodkey
, "Readme", NULL
);
3554 CHECK_REG_STR(prodkey
, "Size", NULL
);
3555 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
3556 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
3557 CHECK_REG_DWORD(prodkey
, "Language", 1033);
3558 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
3559 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
3560 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
3561 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
3564 CHECK_REG_DWORD2(prodkey
, "EstimatedSize", 12, -12);
3567 RegCloseKey(prodkey
);
3569 /* UnpublishFeatures, only feature removed. Only works when entire product is removed */
3570 r
= MsiInstallProductA(msifile
, "UNPUBLISH_FEATURES=1 REMOVE=feature");
3571 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3572 todo_wine
ok(pf_exists("msitest\\maximus"), "File deleted\n");
3573 ok(pf_exists("msitest"), "File deleted\n");
3575 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3576 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
3578 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3579 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3581 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3582 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3584 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3585 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3586 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3587 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3589 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3590 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3592 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
3593 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
3594 CHECK_REG_STR(prodkey
, "InstallDate", date
);
3595 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
3596 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3597 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
3598 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3599 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
3600 CHECK_REG_STR(prodkey
, "Comments", NULL
);
3601 CHECK_REG_STR(prodkey
, "Contact", NULL
);
3602 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
3603 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
3604 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
3605 CHECK_REG_STR(prodkey
, "Readme", NULL
);
3606 CHECK_REG_STR(prodkey
, "Size", NULL
);
3607 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
3608 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
3609 CHECK_REG_DWORD(prodkey
, "Language", 1033);
3610 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
3611 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
3612 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
3613 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
3616 CHECK_REG_DWORD2(prodkey
, "EstimatedSize", 12, -12);
3619 RegCloseKey(prodkey
);
3621 /* complete install */
3622 r
= MsiInstallProductA(msifile
, "FULL=1");
3623 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3624 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3625 ok(pf_exists("msitest"), "File not installed\n");
3627 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3628 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
3630 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3631 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3633 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3634 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3636 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3637 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3638 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3639 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3641 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3642 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3644 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
3645 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
3646 CHECK_REG_STR(prodkey
, "InstallDate", date
);
3647 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
3648 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3649 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
3650 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3651 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
3652 CHECK_REG_STR(prodkey
, "Comments", NULL
);
3653 CHECK_REG_STR(prodkey
, "Contact", NULL
);
3654 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
3655 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
3656 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
3657 CHECK_REG_STR(prodkey
, "Readme", NULL
);
3658 CHECK_REG_STR(prodkey
, "Size", NULL
);
3659 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
3660 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
3661 CHECK_REG_DWORD(prodkey
, "Language", 1033);
3662 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
3663 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
3664 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
3665 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
3668 CHECK_REG_DWORD2(prodkey
, "EstimatedSize", 12, -20);
3671 RegCloseKey(prodkey
);
3673 /* UnpublishFeatures, both features removed */
3674 r
= MsiInstallProductA(msifile
, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo");
3675 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3676 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3679 ok(!pf_exists("msitest"), "File not deleted\n");
3682 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3683 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3685 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3686 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3688 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3689 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3691 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3692 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3693 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3694 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3696 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3697 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3699 /* complete install */
3700 r
= MsiInstallProductA(msifile
, "FULL=1");
3701 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3702 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3703 ok(pf_exists("msitest"), "File not installed\n");
3705 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3706 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
3708 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3709 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3711 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3712 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3714 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3715 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3716 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3717 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3719 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3720 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3722 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
3723 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
3724 CHECK_REG_STR(prodkey
, "InstallDate", date
);
3725 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
3726 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3727 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
3728 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3729 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
3730 CHECK_REG_STR(prodkey
, "Comments", NULL
);
3731 CHECK_REG_STR(prodkey
, "Contact", NULL
);
3732 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
3733 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
3734 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
3735 CHECK_REG_STR(prodkey
, "Readme", NULL
);
3736 CHECK_REG_STR(prodkey
, "Size", NULL
);
3737 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
3738 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
3739 CHECK_REG_DWORD(prodkey
, "Language", 1033);
3740 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
3741 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
3742 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
3743 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
3746 CHECK_REG_DWORD2(prodkey
, "EstimatedSize", 12, -12);
3749 RegCloseKey(prodkey
);
3751 /* complete uninstall */
3752 r
= MsiInstallProductA(msifile
, "FULL=1 REMOVE=ALL");
3753 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3754 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3757 ok(!pf_exists("msitest"), "File not deleted\n");
3760 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3761 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3763 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3764 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3766 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3767 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3769 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3770 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3771 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3772 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3774 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3775 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3777 /* make sure 'Program Files\msitest' is removed */
3778 delete_pfmsitest_files();
3780 RegCloseKey(uninstall
);
3781 DeleteFile(msifile
);
3782 DeleteFile("msitest\\maximus");
3783 RemoveDirectory("msitest");
3786 static void test_publishsourcelist(void)
3790 CHAR value
[MAX_PATH
];
3791 CHAR path
[MAX_PATH
];
3792 CHAR prodcode
[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
3794 if (!pMsiSourceListEnumSourcesA
|| !pMsiSourceListGetInfoA
)
3796 skip("MsiSourceListEnumSourcesA and/or MsiSourceListGetInfoA are not available\n");
3800 CreateDirectoryA("msitest", NULL
);
3801 create_file("msitest\\maximus", 500);
3803 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
3805 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
3807 r
= MsiInstallProductA(msifile
, NULL
);
3808 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3809 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3810 ok(pf_exists("msitest"), "File not installed\n");
3812 /* nothing published */
3814 lstrcpyA(value
, "aaa");
3815 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3816 MSICODE_PRODUCT
, INSTALLPROPERTY_PACKAGENAME
, value
, &size
);
3817 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3818 ok(size
== MAX_PATH
, "Expected %d, got %d\n", MAX_PATH
, size
);
3819 ok(!lstrcmpA(value
, "aaa"), "Expected \"aaa\", got \"%s\"\n", value
);
3822 lstrcpyA(value
, "aaa");
3823 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3824 MSICODE_PRODUCT
| MSISOURCETYPE_URL
, 0, value
, &size
);
3825 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3826 ok(size
== MAX_PATH
, "Expected %d, got %d\n", MAX_PATH
, size
);
3827 ok(!lstrcmpA(value
, "aaa"), "Expected \"aaa\", got \"%s\"\n", value
);
3829 r
= MsiInstallProductA(msifile
, "REGISTER_PRODUCT=1");
3830 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3831 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3832 ok(pf_exists("msitest"), "File not installed\n");
3834 /* after RegisterProduct */
3836 lstrcpyA(value
, "aaa");
3837 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3838 MSICODE_PRODUCT
, INSTALLPROPERTY_PACKAGENAME
, value
, &size
);
3839 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3840 ok(size
== MAX_PATH
, "Expected %d, got %d\n", MAX_PATH
, size
);
3841 ok(!lstrcmpA(value
, "aaa"), "Expected \"aaa\", got \"%s\"\n", value
);
3844 lstrcpyA(value
, "aaa");
3845 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3846 MSICODE_PRODUCT
| MSISOURCETYPE_URL
, 0, value
, &size
);
3847 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3848 ok(size
== MAX_PATH
, "Expected %d, got %d\n", MAX_PATH
, size
);
3849 ok(!lstrcmpA(value
, "aaa"), "Expected \"aaa\", got \"%s\"\n", value
);
3851 r
= MsiInstallProductA(msifile
, "PROCESS_COMPONENTS=1");
3852 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3853 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3854 ok(pf_exists("msitest"), "File not installed\n");
3856 /* after ProcessComponents */
3858 lstrcpyA(value
, "aaa");
3859 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3860 MSICODE_PRODUCT
, INSTALLPROPERTY_PACKAGENAME
, value
, &size
);
3861 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3862 ok(size
== MAX_PATH
, "Expected %d, got %d\n", MAX_PATH
, size
);
3863 ok(!lstrcmpA(value
, "aaa"), "Expected \"aaa\", got \"%s\"\n", value
);
3866 lstrcpyA(value
, "aaa");
3867 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3868 MSICODE_PRODUCT
| MSISOURCETYPE_URL
, 0, value
, &size
);
3869 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3870 ok(size
== MAX_PATH
, "Expected %d, got %d\n", MAX_PATH
, size
);
3871 ok(!lstrcmpA(value
, "aaa"), "Expected \"aaa\", got \"%s\"\n", value
);
3873 r
= MsiInstallProductA(msifile
, "PUBLISH_FEATURES=1");
3874 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3875 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3876 ok(pf_exists("msitest"), "File not installed\n");
3878 /* after PublishFeatures */
3880 lstrcpyA(value
, "aaa");
3881 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3882 MSICODE_PRODUCT
, INSTALLPROPERTY_PACKAGENAME
, value
, &size
);
3883 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3884 ok(size
== MAX_PATH
, "Expected %d, got %d\n", MAX_PATH
, size
);
3885 ok(!lstrcmpA(value
, "aaa"), "Expected \"aaa\", got \"%s\"\n", value
);
3888 lstrcpyA(value
, "aaa");
3889 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3890 MSICODE_PRODUCT
| MSISOURCETYPE_URL
, 0, value
, &size
);
3891 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3892 ok(size
== MAX_PATH
, "Expected %d, got %d\n", MAX_PATH
, size
);
3893 ok(!lstrcmpA(value
, "aaa"), "Expected \"aaa\", got \"%s\"\n", value
);
3895 r
= MsiInstallProductA(msifile
, "PUBLISH_PRODUCT=1");
3896 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3897 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3898 ok(pf_exists("msitest"), "File not installed\n");
3900 /* after PublishProduct */
3902 lstrcpyA(value
, "aaa");
3903 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3904 MSICODE_PRODUCT
, INSTALLPROPERTY_PACKAGENAME
, value
, &size
);
3905 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3906 ok(!lstrcmpA(value
, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value
);
3907 ok(size
== 11, "Expected 11, got %d\n", size
);
3910 lstrcpyA(value
, "aaa");
3911 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3912 MSICODE_PRODUCT
, INSTALLPROPERTY_MEDIAPACKAGEPATH
, value
, &size
);
3913 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3914 ok(!lstrcmpA(value
, ""), "Expected \"\", got \"%s\"\n", value
);
3915 ok(size
== 0, "Expected 0, got %d\n", size
);
3918 lstrcpyA(value
, "aaa");
3919 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3920 MSICODE_PRODUCT
, INSTALLPROPERTY_DISKPROMPT
, value
, &size
);
3921 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3922 ok(!lstrcmpA(value
, ""), "Expected \"\", got \"%s\"\n", value
);
3923 ok(size
== 0, "Expected 0, got %d\n", size
);
3925 lstrcpyA(path
, CURR_DIR
);
3926 lstrcatA(path
, "\\");
3929 lstrcpyA(value
, "aaa");
3930 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3931 MSICODE_PRODUCT
, INSTALLPROPERTY_LASTUSEDSOURCE
, value
, &size
);
3932 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3933 ok(!lstrcmpA(value
, path
), "Expected \"%s\", got \"%s\"\n", path
, value
);
3934 ok(size
== lstrlenA(path
), "Expected %d, got %d\n", lstrlenA(path
), size
);
3937 lstrcpyA(value
, "aaa");
3938 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3939 MSICODE_PRODUCT
, INSTALLPROPERTY_LASTUSEDTYPE
, value
, &size
);
3940 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3941 ok(!lstrcmpA(value
, "n"), "Expected \"n\", got \"%s\"\n", value
);
3942 ok(size
== 1, "Expected 1, got %d\n", size
);
3945 lstrcpyA(value
, "aaa");
3946 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3947 MSICODE_PRODUCT
| MSISOURCETYPE_URL
, 0, value
, &size
);
3948 ok(r
== ERROR_NO_MORE_ITEMS
, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r
);
3949 ok(!lstrcmpA(value
, "aaa"), "Expected value to be unchanged, got %s\n", value
);
3950 ok(size
== MAX_PATH
, "Expected MAX_PATH, got %d\n", size
);
3953 lstrcpyA(value
, "aaa");
3954 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3955 MSICODE_PRODUCT
| MSISOURCETYPE_NETWORK
, 0, value
, &size
);
3956 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3957 ok(!lstrcmpA(value
, path
), "Expected \"%s\", got \"%s\"\n", path
, value
);
3958 ok(size
== lstrlenA(path
), "Expected %d, got %d\n", lstrlenA(path
), size
);
3961 lstrcpyA(value
, "aaa");
3962 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3963 MSICODE_PRODUCT
| MSISOURCETYPE_NETWORK
, 1, value
, &size
);
3964 ok(r
== ERROR_NO_MORE_ITEMS
, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r
);
3965 ok(!lstrcmpA(value
, "aaa"), "Expected value to be unchanged, got %s\n", value
);
3966 ok(size
== MAX_PATH
, "Expected MAX_PATH, got %d\n", size
);
3968 /* complete uninstall */
3969 r
= MsiInstallProductA(msifile
, "FULL=1 REMOVE=ALL");
3970 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3971 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3974 ok(!pf_exists("msitest"), "File not deleted\n");
3977 /* make sure 'Program Files\msitest' is removed */
3978 delete_pfmsitest_files();
3980 DeleteFile(msifile
);
3981 DeleteFile("msitest\\maximus");
3982 RemoveDirectory("msitest");
3985 static UINT
run_query(MSIHANDLE hdb
, MSIHANDLE hrec
, const char *query
)
3987 MSIHANDLE hview
= 0;
3990 r
= MsiDatabaseOpenView(hdb
, query
, &hview
);
3991 if(r
!= ERROR_SUCCESS
)
3994 r
= MsiViewExecute(hview
, hrec
);
3995 if(r
== ERROR_SUCCESS
)
3996 r
= MsiViewClose(hview
);
3997 MsiCloseHandle(hview
);
4001 static void set_transform_summary_info(void)
4004 MSIHANDLE suminfo
= 0;
4006 /* build summary info */
4007 r
= MsiGetSummaryInformation(0, mstfile
, 3, &suminfo
);
4010 ok(r
== ERROR_SUCCESS
, "Failed to open summaryinfo\n");
4013 r
= MsiSummaryInfoSetProperty(suminfo
, PID_TITLE
, VT_LPSTR
, 0, NULL
, "MSITEST");
4016 ok(r
== ERROR_SUCCESS
, "Failed to set summary info\n");
4019 r
= MsiSummaryInfoSetProperty(suminfo
, PID_REVNUMBER
, VT_LPSTR
, 0, NULL
,
4020 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
4021 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
4022 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}");
4025 ok(r
== ERROR_SUCCESS
, "Failed to set summary info\n");
4028 r
= MsiSummaryInfoSetProperty(suminfo
, PID_PAGECOUNT
, VT_I4
, 100, NULL
, NULL
);
4031 ok(r
== ERROR_SUCCESS
, "Failed to set summary info\n");
4034 r
= MsiSummaryInfoPersist(suminfo
);
4037 ok(r
== ERROR_SUCCESS
, "Failed to make summary info persist\n");
4040 r
= MsiCloseHandle(suminfo
);
4041 ok(r
== ERROR_SUCCESS
, "Failed to close suminfo\n");
4044 static void generate_transform(void)
4046 MSIHANDLE hdb1
, hdb2
;
4050 /* start with two identical databases */
4051 CopyFile(msifile
, msifile2
, FALSE
);
4053 r
= MsiOpenDatabase(msifile2
, MSIDBOPEN_TRANSACT
, &hdb1
);
4054 ok(r
== ERROR_SUCCESS
, "Failed to create database\n");
4056 r
= MsiDatabaseCommit(hdb1
);
4057 ok(r
== ERROR_SUCCESS
, "Failed to commit database\n");
4059 r
= MsiOpenDatabase(msifile
, MSIDBOPEN_READONLY
, &hdb2
);
4060 ok(r
== ERROR_SUCCESS
, "Failed to create database\n");
4062 query
= "INSERT INTO `Property` ( `Property`, `Value` ) VALUES ( 'prop', 'val' )";
4063 r
= run_query(hdb1
, 0, query
);
4064 ok(r
== ERROR_SUCCESS
, "failed to add property\n");
4066 /* database needs to be committed */
4067 MsiDatabaseCommit(hdb1
);
4069 r
= MsiDatabaseGenerateTransform(hdb1
, hdb2
, mstfile
, 0, 0);
4070 ok(r
== ERROR_SUCCESS
, "return code %d, should be ERROR_SUCCESS\n", r
);
4072 #if 0 /* not implemented in wine yet */
4073 r
= MsiCreateTransformSummaryInfo(hdb2
, hdb2
, mstfile
, 0, 0);
4074 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
4077 MsiCloseHandle(hdb1
);
4078 MsiCloseHandle(hdb2
);
4081 /* data for generating a transform */
4083 /* tables transform names - encoded as they would be in an msi database file */
4084 static const WCHAR name1
[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */
4085 static const WCHAR name2
[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */
4086 static const WCHAR name3
[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */
4088 /* data in each table */
4089 static const char data1
[] = /* _StringData */
4090 "propval"; /* all the strings squashed together */
4092 static const WCHAR data2
[] = { /* _StringPool */
4094 0, 0, /* string 0 '' */
4095 4, 1, /* string 1 'prop' */
4096 3, 1, /* string 2 'val' */
4099 static const WCHAR data3
[] = { /* Property */
4100 0x0201, 0x0001, 0x0002,
4103 static const struct {
4107 } table_transform_data
[] =
4109 { name1
, data1
, sizeof data1
- 1 },
4110 { name2
, data2
, sizeof data2
},
4111 { name3
, data3
, sizeof data3
},
4114 #define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0])
4116 static void generate_transform_manual(void)
4118 IStorage
*stg
= NULL
;
4123 const DWORD mode
= STGM_CREATE
|STGM_READWRITE
|STGM_DIRECT
|STGM_SHARE_EXCLUSIVE
;
4125 const CLSID CLSID_MsiTransform
= { 0xc1082,0,0,{0xc0,0,0,0,0,0,0,0x46}};
4127 MultiByteToWideChar(CP_ACP
, 0, mstfile
, -1, name
, 0x20);
4129 r
= StgCreateDocfile(name
, mode
, 0, &stg
);
4130 ok(r
== S_OK
, "failed to create storage\n");
4134 r
= IStorage_SetClass(stg
, &CLSID_MsiTransform
);
4135 ok(r
== S_OK
, "failed to set storage type\n");
4137 for (i
=0; i
<NUM_TRANSFORM_TABLES
; i
++)
4139 r
= IStorage_CreateStream(stg
, table_transform_data
[i
].name
,
4140 STGM_WRITE
| STGM_SHARE_EXCLUSIVE
, 0, 0, &stm
);
4143 ok(0, "failed to create stream %08x\n", r
);
4147 r
= IStream_Write(stm
, table_transform_data
[i
].data
,
4148 table_transform_data
[i
].size
, &count
);
4149 if (FAILED(r
) || count
!= table_transform_data
[i
].size
)
4150 ok(0, "failed to write stream\n");
4151 IStream_Release(stm
);
4154 IStorage_Release(stg
);
4156 set_transform_summary_info();
4159 static void test_transformprop(void)
4163 CreateDirectoryA("msitest", NULL
);
4164 create_file("msitest\\augustus", 500);
4166 create_database(msifile
, tp_tables
, sizeof(tp_tables
) / sizeof(msi_table
));
4168 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4170 r
= MsiInstallProductA(msifile
, NULL
);
4171 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4172 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4173 ok(!delete_pf("msitest", FALSE
), "File installed\n");
4176 generate_transform();
4178 generate_transform_manual();
4180 r
= MsiInstallProductA(msifile
, "TRANSFORMS=winetest.mst");
4181 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4182 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
4183 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4185 /* Delete the files in the temp (current) folder */
4186 DeleteFile(msifile
);
4187 DeleteFile(msifile2
);
4188 DeleteFile(mstfile
);
4189 DeleteFile("msitest\\augustus");
4190 RemoveDirectory("msitest");
4193 static void test_currentworkingdir(void)
4196 CHAR path
[MAX_PATH
];
4199 CreateDirectoryA("msitest", NULL
);
4200 create_file("msitest\\augustus", 500);
4202 create_database(msifile
, cwd_tables
, sizeof(cwd_tables
) / sizeof(msi_table
));
4204 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4206 CreateDirectoryA("diffdir", NULL
);
4207 SetCurrentDirectoryA("diffdir");
4209 sprintf(path
, "..\\%s", msifile
);
4210 r
= MsiInstallProductA(path
, NULL
);
4213 ok(r
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r
);
4214 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4215 ok(!delete_pf("msitest", FALSE
), "File installed\n");
4218 sprintf(path
, "%s\\%s", CURR_DIR
, msifile
);
4219 r
= MsiInstallProductA(path
, NULL
);
4220 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4221 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
4222 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4224 lstrcpyA(path
, CURR_DIR
);
4225 if (path
[lstrlenA(path
) - 1] != '\\')
4226 lstrcatA(path
, "\\");
4227 lstrcatA(path
, "msitest.msi");
4229 ptr2
= strrchr(path
, '\\');
4231 ptr
= strrchr(path
, '\\');
4235 SetCurrentDirectoryA(path
);
4237 r
= MsiInstallProductA(ptr
, NULL
);
4238 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4239 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
4240 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4242 SetCurrentDirectoryA(CURR_DIR
);
4244 DeleteFile(msifile
);
4245 DeleteFile("msitest\\augustus");
4246 RemoveDirectory("msitest");
4247 RemoveDirectory("diffdir");
4250 static void set_admin_summary_info(const CHAR
*name
)
4252 MSIHANDLE db
, summary
;
4255 r
= MsiOpenDatabaseA(name
, MSIDBOPEN_DIRECT
, &db
);
4256 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4258 r
= MsiGetSummaryInformationA(db
, NULL
, 1, &summary
);
4259 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4261 r
= MsiSummaryInfoSetPropertyA(summary
, PID_WORDCOUNT
, VT_I4
, 5, NULL
, NULL
);
4262 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4264 /* write the summary changes back to the stream */
4265 r
= MsiSummaryInfoPersist(summary
);
4266 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4268 MsiCloseHandle(summary
);
4270 r
= MsiDatabaseCommit(db
);
4271 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4276 static void test_admin(void)
4280 CreateDirectoryA("msitest", NULL
);
4281 create_file("msitest\\augustus", 500);
4283 create_database(msifile
, adm_tables
, sizeof(adm_tables
) / sizeof(msi_table
));
4284 set_admin_summary_info(msifile
);
4286 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4288 r
= MsiInstallProductA(msifile
, NULL
);
4289 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4290 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4291 ok(!delete_pf("msitest", FALSE
), "File installed\n");
4292 ok(!DeleteFile("c:\\msitest\\augustus"), "File installed\n");
4293 ok(!RemoveDirectory("c:\\msitest"), "File installed\n");
4295 r
= MsiInstallProductA(msifile
, "ACTION=ADMIN");
4296 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4297 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4298 ok(!delete_pf("msitest", FALSE
), "File installed\n");
4301 ok(DeleteFile("c:\\msitest\\augustus"), "File not installed\n");
4302 ok(RemoveDirectory("c:\\msitest"), "File not installed\n");
4305 DeleteFile(msifile
);
4306 DeleteFile("msitest\\augustus");
4307 RemoveDirectory("msitest");
4310 static void set_admin_property_stream(LPCSTR file
)
4314 WCHAR fileW
[MAX_PATH
];
4317 const DWORD mode
= STGM_DIRECT
| STGM_READWRITE
| STGM_SHARE_EXCLUSIVE
;
4319 /* AdminProperties */
4320 static const WCHAR stmname
[] = {0x41ca,0x4330,0x3e71,0x44b5,0x4233,0x45f5,0x422c,0x4836,0};
4321 static const WCHAR data
[] = {'M','Y','P','R','O','P','=','2','7','1','8',' ',
4322 'M','y','P','r','o','p','=','4','2',0};
4324 MultiByteToWideChar(CP_ACP
, 0, file
, -1, fileW
, MAX_PATH
);
4326 hr
= StgOpenStorage(fileW
, NULL
, mode
, NULL
, 0, &stg
);
4327 ok(hr
== S_OK
, "Expected S_OK, got %d\n", hr
);
4331 hr
= IStorage_CreateStream(stg
, stmname
, STGM_WRITE
| STGM_SHARE_EXCLUSIVE
, 0, 0, &stm
);
4332 ok(hr
== S_OK
, "Expected S_OK, got %d\n", hr
);
4334 hr
= IStream_Write(stm
, data
, sizeof(data
), &count
);
4335 ok(hr
== S_OK
, "Expected S_OK, got %d\n", hr
);
4337 IStream_Release(stm
);
4338 IStorage_Release(stg
);
4341 static void test_adminprops(void)
4345 CreateDirectoryA("msitest", NULL
);
4346 create_file("msitest\\augustus", 500);
4348 create_database(msifile
, amp_tables
, sizeof(amp_tables
) / sizeof(msi_table
));
4349 set_admin_summary_info(msifile
);
4350 set_admin_property_stream(msifile
);
4352 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4354 r
= MsiInstallProductA(msifile
, NULL
);
4355 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4356 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4357 ok(delete_pf("msitest", FALSE
), "File installed\n");
4359 DeleteFile(msifile
);
4360 DeleteFile("msitest\\augustus");
4361 RemoveDirectory("msitest");
4364 static void create_pf_data(LPCSTR file
, LPCSTR data
, BOOL is_file
)
4366 CHAR path
[MAX_PATH
];
4368 lstrcpyA(path
, PROG_FILES_DIR
);
4369 lstrcatA(path
, "\\");
4370 lstrcatA(path
, file
);
4373 create_file_data(path
, data
, 500);
4375 CreateDirectoryA(path
, NULL
);
4378 #define create_pf(file, is_file) create_pf_data(file, file, is_file)
4380 static void test_removefiles(void)
4384 CreateDirectoryA("msitest", NULL
);
4385 create_file("msitest\\hydrogen", 500);
4386 create_file("msitest\\helium", 500);
4387 create_file("msitest\\lithium", 500);
4389 create_database(msifile
, rem_tables
, sizeof(rem_tables
) / sizeof(msi_table
));
4391 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
4393 r
= MsiInstallProductA(msifile
, NULL
);
4394 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4395 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4396 ok(!pf_exists("msitest\\helium"), "File installed\n");
4397 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4398 ok(pf_exists("msitest"), "File not installed\n");
4400 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
4401 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4402 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
4403 ok(!pf_exists("msitest\\helium"), "File not deleted\n");
4404 ok(delete_pf("msitest\\lithium", TRUE
), "File deleted\n");
4405 ok(delete_pf("msitest", FALSE
), "File deleted\n");
4407 create_pf("msitest", FALSE
);
4408 create_pf("msitest\\hydrogen", TRUE
);
4409 create_pf("msitest\\helium", TRUE
);
4410 create_pf("msitest\\lithium", TRUE
);
4412 r
= MsiInstallProductA(msifile
, NULL
);
4413 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4414 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4415 ok(pf_exists("msitest\\helium"), "File not installed\n");
4416 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4417 ok(pf_exists("msitest"), "File not installed\n");
4419 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
4420 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4421 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
4422 ok(delete_pf("msitest\\helium", TRUE
), "File deleted\n");
4423 ok(delete_pf("msitest\\lithium", TRUE
), "File deleted\n");
4424 ok(delete_pf("msitest", FALSE
), "File deleted\n");
4426 create_pf("msitest", FALSE
);
4427 create_pf("msitest\\furlong", TRUE
);
4428 create_pf("msitest\\firkin", TRUE
);
4429 create_pf("msitest\\fortnight", TRUE
);
4430 create_pf("msitest\\becquerel", TRUE
);
4431 create_pf("msitest\\dioptre", TRUE
);
4432 create_pf("msitest\\attoparsec", TRUE
);
4433 create_pf("msitest\\storeys", TRUE
);
4434 create_pf("msitest\\block", TRUE
);
4435 create_pf("msitest\\siriometer", TRUE
);
4436 create_pf("msitest\\cabout", FALSE
);
4437 create_pf("msitest\\cabout\\blocker", TRUE
);
4439 r
= MsiInstallProductA(msifile
, NULL
);
4440 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4441 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4442 ok(!pf_exists("msitest\\helium"), "File installed\n");
4443 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4444 ok(!pf_exists("msitest\\furlong"), "File not deleted\n");
4445 ok(!pf_exists("msitest\\firkin"), "File not deleted\n");
4446 ok(!pf_exists("msitest\\fortnight"), "File not deleted\n");
4447 ok(pf_exists("msitest\\becquerel"), "File not installed\n");
4448 ok(pf_exists("msitest\\dioptre"), "File not installed\n");
4449 ok(pf_exists("msitest\\attoparsec"), "File not installed\n");
4450 ok(!pf_exists("msitest\\storeys"), "File not deleted\n");
4451 ok(!pf_exists("msitest\\block"), "File not deleted\n");
4452 ok(!pf_exists("msitest\\siriometer"), "File not deleted\n");
4453 ok(pf_exists("msitest\\cabout"), "Directory removed\n");
4454 ok(pf_exists("msitest"), "File not installed\n");
4456 create_pf("msitest\\furlong", TRUE
);
4457 create_pf("msitest\\firkin", TRUE
);
4458 create_pf("msitest\\fortnight", TRUE
);
4459 create_pf("msitest\\storeys", TRUE
);
4460 create_pf("msitest\\block", TRUE
);
4461 create_pf("msitest\\siriometer", TRUE
);
4463 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
4464 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4465 ok(!delete_pf("msitest\\hydrogen", TRUE
), "File not deleted\n");
4466 ok(!delete_pf("msitest\\helium", TRUE
), "File not deleted\n");
4467 ok(delete_pf("msitest\\lithium", TRUE
), "File deleted\n");
4468 ok(delete_pf("msitest\\furlong", TRUE
), "File deleted\n");
4469 ok(delete_pf("msitest\\firkin", TRUE
), "File deleted\n");
4470 ok(delete_pf("msitest\\fortnight", TRUE
), "File deleted\n");
4471 ok(!delete_pf("msitest\\becquerel", TRUE
), "File not deleted\n");
4472 ok(!delete_pf("msitest\\dioptre", TRUE
), "File not deleted\n");
4473 ok(delete_pf("msitest\\attoparsec", TRUE
), "File deleted\n");
4474 ok(!delete_pf("msitest\\storeys", TRUE
), "File not deleted\n");
4475 ok(!delete_pf("msitest\\block", TRUE
), "File not deleted\n");
4476 ok(delete_pf("msitest\\siriometer", TRUE
), "File deleted\n");
4477 ok(pf_exists("msitest\\cabout"), "Directory deleted\n");
4478 ok(pf_exists("msitest"), "Directory deleted\n");
4480 r
= MsiInstallProductA(msifile
, NULL
);
4481 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4482 ok(delete_pf("msitest\\hydrogen", TRUE
), "File not installed\n");
4483 ok(!delete_pf("msitest\\helium", TRUE
), "File installed\n");
4484 ok(delete_pf("msitest\\lithium", TRUE
), "File not installed\n");
4485 ok(pf_exists("msitest\\cabout"), "Directory deleted\n");
4486 ok(pf_exists("msitest"), "Directory deleted\n");
4488 delete_pf("msitest\\cabout\\blocker", TRUE
);
4490 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
4491 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4492 ok(!delete_pf("msitest\\cabout", FALSE
), "Directory not deleted\n");
4493 ok(delete_pf("msitest", FALSE
), "Directory deleted\n");
4495 DeleteFile(msifile
);
4496 DeleteFile("msitest\\hydrogen");
4497 DeleteFile("msitest\\helium");
4498 DeleteFile("msitest\\lithium");
4499 RemoveDirectory("msitest");
4502 static void test_movefiles(void)
4505 char props
[MAX_PATH
];
4507 CreateDirectoryA("msitest", NULL
);
4508 create_file("msitest\\augustus", 100);
4509 create_file("cameroon", 100);
4510 create_file("djibouti", 100);
4511 create_file("egypt", 100);
4512 create_file("finland", 100);
4513 create_file("gambai", 100);
4514 create_file("honduras", 100);
4515 create_file("msitest\\india", 100);
4516 create_file("japan", 100);
4517 create_file("kenya", 100);
4518 CreateDirectoryA("latvia", NULL
);
4519 create_file("nauru", 100);
4520 create_file("peru", 100);
4521 create_file("apple", 100);
4522 create_file("application", 100);
4523 create_file("ape", 100);
4524 create_file("foo", 100);
4525 create_file("fao", 100);
4526 create_file("fbod", 100);
4527 create_file("budding", 100);
4528 create_file("buddy", 100);
4529 create_file("bud", 100);
4530 create_file("bar", 100);
4531 create_file("bur", 100);
4532 create_file("bird", 100);
4534 create_database(msifile
, mov_tables
, sizeof(mov_tables
) / sizeof(msi_table
));
4536 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
4538 /* if the source or dest property is not a full path,
4539 * windows tries to access it as a network resource
4542 sprintf(props
, "SOURCEFULL=\"%s\\\" DESTFULL=\"%s\\msitest\" "
4543 "FILEPATHBAD=\"%s\\japan\" FILEPATHGOOD=\"%s\\kenya\"",
4544 CURR_DIR
, PROG_FILES_DIR
, CURR_DIR
, CURR_DIR
);
4546 r
= MsiInstallProductA(msifile
, props
);
4547 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4548 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
4549 ok(!delete_pf("msitest\\dest", TRUE
), "File copied\n");
4550 ok(delete_pf("msitest\\canada", TRUE
), "File not copied\n");
4551 ok(delete_pf("msitest\\dominica", TRUE
), "File not moved\n");
4552 ok(!delete_pf("msitest\\elsalvador", TRUE
), "File moved\n");
4553 ok(!delete_pf("msitest\\france", TRUE
), "File moved\n");
4554 ok(!delete_pf("msitest\\georgia", TRUE
), "File moved\n");
4555 ok(delete_pf("msitest\\hungary", TRUE
), "File not moved\n");
4556 ok(!delete_pf("msitest\\indonesia", TRUE
), "File moved\n");
4557 ok(!delete_pf("msitest\\jordan", TRUE
), "File moved\n");
4558 ok(delete_pf("msitest\\kiribati", TRUE
), "File not moved\n");
4559 ok(!delete_pf("msitest\\lebanon", TRUE
), "File moved\n");
4560 ok(!delete_pf("msitest\\lebanon", FALSE
), "Directory moved\n");
4561 ok(delete_pf("msitest\\poland", TRUE
), "File not moved\n");
4562 /* either apple or application will be moved depending on directory order */
4563 if (!delete_pf("msitest\\apple", TRUE
))
4564 ok(delete_pf("msitest\\application", TRUE
), "File not moved\n");
4566 ok(!delete_pf("msitest\\application", TRUE
), "File should not exist\n");
4567 ok(delete_pf("msitest\\wildcard", TRUE
), "File not moved\n");
4568 ok(!delete_pf("msitest\\ape", TRUE
), "File moved\n");
4569 /* either fao or foo will be moved depending on directory order */
4570 if (delete_pf("msitest\\foo", TRUE
))
4571 ok(!delete_pf("msitest\\fao", TRUE
), "File should not exist\n");
4573 ok(delete_pf("msitest\\fao", TRUE
), "File not moved\n");
4574 ok(delete_pf("msitest\\single", TRUE
), "File not moved\n");
4575 ok(!delete_pf("msitest\\fbod", TRUE
), "File moved\n");
4576 ok(delete_pf("msitest\\budding", TRUE
), "File not moved\n");
4577 ok(delete_pf("msitest\\buddy", TRUE
), "File not moved\n");
4578 ok(!delete_pf("msitest\\bud", TRUE
), "File moved\n");
4579 ok(delete_pf("msitest\\bar", TRUE
), "File not moved\n");
4580 ok(delete_pf("msitest\\bur", TRUE
), "File not moved\n");
4581 ok(!delete_pf("msitest\\bird", TRUE
), "File moved\n");
4582 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4583 ok(DeleteFileA("cameroon"), "File moved\n");
4584 ok(!DeleteFileA("djibouti"), "File not moved\n");
4585 ok(DeleteFileA("egypt"), "File moved\n");
4586 ok(DeleteFileA("finland"), "File moved\n");
4587 ok(DeleteFileA("gambai"), "File moved\n");
4588 ok(!DeleteFileA("honduras"), "File not moved\n");
4589 ok(DeleteFileA("msitest\\india"), "File moved\n");
4590 ok(DeleteFileA("japan"), "File moved\n");
4591 ok(!DeleteFileA("kenya"), "File not moved\n");
4592 ok(RemoveDirectoryA("latvia"), "Directory moved\n");
4593 ok(!DeleteFileA("nauru"), "File not moved\n");
4594 ok(!DeleteFileA("peru"), "File not moved\n");
4595 ok(!DeleteFileA("apple"), "File not moved\n");
4596 ok(!DeleteFileA("application"), "File not moved\n");
4597 ok(DeleteFileA("ape"), "File moved\n");
4598 ok(!DeleteFileA("foo"), "File not moved\n");
4599 ok(!DeleteFileA("fao"), "File not moved\n");
4600 ok(DeleteFileA("fbod"), "File moved\n");
4601 ok(!DeleteFileA("budding"), "File not moved\n");
4602 ok(!DeleteFileA("buddy"), "File not moved\n");
4603 ok(DeleteFileA("bud"), "File moved\n");
4604 ok(!DeleteFileA("bar"), "File not moved\n");
4605 ok(!DeleteFileA("bur"), "File not moved\n");
4606 ok(DeleteFileA("bird"), "File moved\n");
4608 DeleteFile("msitest\\augustus");
4609 RemoveDirectory("msitest");
4610 DeleteFile(msifile
);
4613 static void test_missingcab(void)
4617 CreateDirectoryA("msitest", NULL
);
4618 create_file("msitest\\augustus", 500);
4619 create_file("maximus", 500);
4621 create_database(msifile
, mc_tables
, sizeof(mc_tables
) / sizeof(msi_table
));
4623 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4625 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
4627 create_pf("msitest", FALSE
);
4628 create_pf_data("msitest\\caesar", "abcdefgh", TRUE
);
4630 r
= MsiInstallProductA(msifile
, NULL
);
4631 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4632 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
4633 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
4634 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
4635 ok(!delete_pf("msitest\\gaius", TRUE
), "File installed\n");
4636 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4638 create_pf("msitest", FALSE
);
4639 create_pf_data("msitest\\caesar", "abcdefgh", TRUE
);
4640 create_pf("msitest\\gaius", TRUE
);
4642 r
= MsiInstallProductA(msifile
, "GAIUS=1");
4643 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
4646 ok(!delete_pf("msitest\\maximus", TRUE
), "File installed\n");
4647 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4649 ok(delete_pf("msitest\\caesar", TRUE
), "File removed\n");
4650 ok(delete_pf("msitest\\gaius", TRUE
), "File removed\n");
4651 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4653 DeleteFile("msitest\\augustus");
4654 RemoveDirectory("msitest");
4655 DeleteFile("maximus");
4656 DeleteFile("test1.cab");
4657 DeleteFile(msifile
);
4660 static void test_duplicatefiles(void)
4664 CreateDirectoryA("msitest", NULL
);
4665 create_file("msitest\\maximus", 500);
4666 create_database(msifile
, df_tables
, sizeof(df_tables
) / sizeof(msi_table
));
4668 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4670 /* fails if the destination folder is not a valid property */
4672 r
= MsiInstallProductA(msifile
, NULL
);
4673 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4674 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
4675 ok(delete_pf("msitest\\augustus", TRUE
), "File not duplicated\n");
4676 ok(delete_pf("msitest\\this\\doesnot\\exist\\maximus", TRUE
), "File not duplicated\n");
4677 ok(delete_pf("msitest\\this\\doesnot\\exist", FALSE
), "File not duplicated\n");
4678 ok(delete_pf("msitest\\this\\doesnot", FALSE
), "File not duplicated\n");
4679 ok(delete_pf("msitest\\this", FALSE
), "File not duplicated\n");
4680 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4682 DeleteFile("msitest\\maximus");
4683 RemoveDirectory("msitest");
4684 DeleteFile(msifile
);
4687 static void test_writeregistryvalues(void)
4693 CHAR path
[MAX_PATH
];
4695 CreateDirectoryA("msitest", NULL
);
4696 create_file("msitest\\augustus", 500);
4698 create_database(msifile
, wrv_tables
, sizeof(wrv_tables
) / sizeof(msi_table
));
4700 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4702 r
= MsiInstallProductA(msifile
, NULL
);
4703 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4704 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4705 ok(delete_pf("msitest", FALSE
), "File installed\n");
4707 res
= RegOpenKey(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Wine\\msitest", &hkey
);
4708 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
4711 type
= REG_MULTI_SZ
;
4712 memset(path
, 'a', MAX_PATH
);
4713 res
= RegQueryValueExA(hkey
, "Value", NULL
, &type
, (LPBYTE
)path
, &size
);
4714 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
4715 ok(!memcmp(path
, "one\0two\0three\0\0", size
), "Wrong multi-sz data\n");
4716 ok(size
== 15, "Expected 15, got %d\n", size
);
4717 ok(type
== REG_MULTI_SZ
, "Expected REG_MULTI_SZ, got %d\n", type
);
4719 DeleteFile(msifile
);
4720 DeleteFile("msitest\\augustus");
4721 RemoveDirectory("msitest");
4723 RegDeleteKeyA(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Wine\\msitest");
4724 RegDeleteKeyA(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Wine");
4727 static void test_sourcefolder(void)
4731 CreateDirectoryA("msitest", NULL
);
4732 create_file("augustus", 500);
4734 create_database(msifile
, sf_tables
, sizeof(sf_tables
) / sizeof(msi_table
));
4736 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4738 r
= MsiInstallProductA(msifile
, NULL
);
4739 ok(r
== ERROR_INSTALL_FAILURE
,
4740 "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
4741 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4744 ok(!delete_pf("msitest", FALSE
), "File installed\n");
4747 RemoveDirectoryA("msitest");
4749 r
= MsiInstallProductA(msifile
, NULL
);
4750 ok(r
== ERROR_INSTALL_FAILURE
,
4751 "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
4752 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4755 ok(!delete_pf("msitest", FALSE
), "File installed\n");
4758 DeleteFile(msifile
);
4759 DeleteFile("augustus");
4762 static void test_customaction51(void)
4766 CreateDirectoryA("msitest", NULL
);
4767 create_file("msitest\\augustus", 500);
4769 create_database(msifile
, ca51_tables
, sizeof(ca51_tables
) / sizeof(msi_table
));
4771 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4773 r
= MsiInstallProductA(msifile
, NULL
);
4774 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4775 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4776 ok(delete_pf("msitest", FALSE
), "File installed\n");
4778 DeleteFile(msifile
);
4779 DeleteFile("msitest\\augustus");
4780 RemoveDirectory("msitest");
4783 static void test_installstate(void)
4787 CreateDirectoryA("msitest", NULL
);
4788 create_file("msitest\\alpha", 500);
4789 create_file("msitest\\beta", 500);
4790 create_file("msitest\\gamma", 500);
4791 create_file("msitest\\theta", 500);
4792 create_file("msitest\\delta", 500);
4793 create_file("msitest\\epsilon", 500);
4794 create_file("msitest\\zeta", 500);
4795 create_file("msitest\\iota", 500);
4796 create_file("msitest\\eta", 500);
4797 create_file("msitest\\kappa", 500);
4798 create_file("msitest\\lambda", 500);
4799 create_file("msitest\\mu", 500);
4801 create_database(msifile
, is_tables
, sizeof(is_tables
) / sizeof(msi_table
));
4803 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4805 r
= MsiInstallProductA(msifile
, NULL
);
4806 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4807 ok(delete_pf("msitest\\alpha", TRUE
), "File not installed\n");
4808 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4809 ok(delete_pf("msitest\\gamma", TRUE
), "File not installed\n");
4810 ok(delete_pf("msitest\\theta", TRUE
), "File not installed\n");
4811 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4812 ok(!delete_pf("msitest\\epsilon", TRUE
), "File installed\n");
4813 ok(!delete_pf("msitest\\zeta", TRUE
), "File installed\n");
4814 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4815 ok(!delete_pf("msitest\\eta", TRUE
), "File installed\n");
4816 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4817 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4818 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4819 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4821 r
= MsiInstallProductA(msifile
, "ADDLOCAL=\"one,two,three,four\"");
4822 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4823 ok(delete_pf("msitest\\alpha", TRUE
), "File not installed\n");
4824 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4825 ok(delete_pf("msitest\\gamma", TRUE
), "File not installed\n");
4826 ok(delete_pf("msitest\\theta", TRUE
), "File not installed\n");
4827 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4828 ok(delete_pf("msitest\\epsilon", TRUE
), "File not installed\n");
4829 ok(delete_pf("msitest\\zeta", TRUE
), "File not installed\n");
4830 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4831 ok(delete_pf("msitest\\eta", TRUE
), "File not installed\n");
4832 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4833 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4834 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4835 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4837 r
= MsiInstallProductA(msifile
, "ADDSOURCE=\"one,two,three,four\"");
4838 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4839 ok(delete_pf("msitest\\alpha", TRUE
), "File not installed\n");
4840 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4841 ok(!delete_pf("msitest\\gamma", TRUE
), "File installed\n");
4842 ok(delete_pf("msitest\\theta", TRUE
), "File not installed\n");
4843 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4844 ok(!delete_pf("msitest\\epsilon", TRUE
), "File installed\n");
4845 ok(delete_pf("msitest\\zeta", TRUE
), "File not installed\n");
4846 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4847 ok(!delete_pf("msitest\\eta", TRUE
), "File installed\n");
4848 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4849 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4850 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4851 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4853 r
= MsiInstallProductA(msifile
, "REMOVE=\"one,two,three,four\"");
4854 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4855 ok(!delete_pf("msitest\\alpha", TRUE
), "File installed\n");
4856 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4857 ok(!delete_pf("msitest\\gamma", TRUE
), "File installed\n");
4858 ok(!delete_pf("msitest\\theta", TRUE
), "File installed\n");
4859 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4860 ok(!delete_pf("msitest\\epsilon", TRUE
), "File installed\n");
4861 ok(!delete_pf("msitest\\zeta", TRUE
), "File installed\n");
4862 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4863 ok(!delete_pf("msitest\\eta", TRUE
), "File installed\n");
4864 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4865 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4866 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4867 ok(!delete_pf("msitest", FALSE
), "File installed\n");
4869 DeleteFile(msifile
);
4870 DeleteFile("msitest\\alpha");
4871 DeleteFile("msitest\\beta");
4872 DeleteFile("msitest\\gamma");
4873 DeleteFile("msitest\\theta");
4874 DeleteFile("msitest\\delta");
4875 DeleteFile("msitest\\epsilon");
4876 DeleteFile("msitest\\zeta");
4877 DeleteFile("msitest\\iota");
4878 DeleteFile("msitest\\eta");
4879 DeleteFile("msitest\\kappa");
4880 DeleteFile("msitest\\lambda");
4881 DeleteFile("msitest\\mu");
4882 RemoveDirectory("msitest");
4885 struct sourcepathmap
4887 BOOL sost
; /* shortone\shorttwo */
4888 BOOL solt
; /* shortone\longtwo */
4889 BOOL lost
; /* longone\shorttwo */
4890 BOOL lolt
; /* longone\longtwo */
4891 BOOL soste
; /* shortone\shorttwo source exists */
4892 BOOL solte
; /* shortone\longtwo source exists */
4893 BOOL loste
; /* longone\shorttwo source exists */
4894 BOOL lolte
; /* longone\longtwo source exists */
4899 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4900 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4901 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4902 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4903 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4904 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4905 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4906 {TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4907 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4908 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4909 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4910 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4911 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4912 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4913 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4914 {TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4915 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4916 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4917 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4918 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4919 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4920 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4921 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4922 {TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4923 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4924 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4925 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4926 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4927 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4928 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4929 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4930 {TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4931 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4932 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4933 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4934 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4935 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4936 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4937 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4938 {TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4939 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4940 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4941 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4942 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4943 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4944 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4945 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4946 {TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4947 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4948 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4949 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4950 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4951 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4952 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4953 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4954 {TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4955 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4956 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4957 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4958 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4959 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4960 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4961 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4962 {TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4963 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4964 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4965 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4966 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4967 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4968 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4969 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4970 {TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4971 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4972 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4973 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4974 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4975 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4976 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4977 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4978 {TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4979 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4980 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4981 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4982 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4983 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4984 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4985 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4986 {TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4987 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4988 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4989 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4990 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4991 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4992 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4993 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
4994 {TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4995 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
4996 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4997 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
4998 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
4999 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5000 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5001 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5002 {TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5003 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5004 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5005 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5006 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5007 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5008 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5009 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5010 {TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5011 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5012 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5013 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5014 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5015 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5016 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5017 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5018 {TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5019 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5020 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5021 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5022 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5023 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5024 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5025 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5026 {TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5027 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5028 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5029 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5030 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5031 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5032 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5033 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5034 {FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5035 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5036 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5037 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5038 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5039 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5040 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5041 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5042 {FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5043 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5044 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5045 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5046 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5047 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5048 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5049 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5050 {FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5051 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5052 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5053 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5054 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5055 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5056 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5057 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5058 {FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5059 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5060 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5061 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5062 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5063 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5064 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5065 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5066 {FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5067 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5068 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5069 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5070 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5071 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5072 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5073 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5074 {FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5075 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5076 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5077 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5078 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5079 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5080 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5081 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5082 {FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5083 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5084 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5085 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5086 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5087 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5088 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5089 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5090 {FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5091 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5092 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5093 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5094 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5095 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5096 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5097 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5098 {FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5099 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5100 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5101 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5102 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5103 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5104 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5105 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5106 {FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5107 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5108 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5109 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5110 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5111 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5112 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5113 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5114 {FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5115 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5116 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5117 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5118 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5119 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5120 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5121 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5122 {FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5123 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5124 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5125 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5126 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5127 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5128 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5129 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5130 {FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5131 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5132 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5133 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5134 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5135 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_SUCCESS
, 200},
5136 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5137 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_SUCCESS
, 200},
5138 {FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5139 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5140 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5141 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5142 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5143 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5144 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5145 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5146 {FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5147 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5148 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5149 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5150 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5151 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5152 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5153 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, ERROR_INSTALL_FAILURE
, 0},
5154 {FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, ERROR_INSTALL_FAILURE
, 0},
5157 static DWORD
get_pf_file_size(LPCSTR file
)
5159 CHAR path
[MAX_PATH
];
5163 lstrcpyA(path
, PROG_FILES_DIR
);
5164 lstrcatA(path
, "\\");
5165 lstrcatA(path
, file
);
5167 hfile
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, 0, NULL
);
5168 if (hfile
== INVALID_HANDLE_VALUE
)
5171 size
= GetFileSize(hfile
, NULL
);
5176 static void test_sourcepath(void)
5180 if (!winetest_interactive
)
5182 skip("Run in interactive mode to run source path tests.\n");
5186 create_database(msifile
, sp_tables
, sizeof(sp_tables
) / sizeof(msi_table
));
5188 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5190 for (i
= 0; i
< sizeof(spmap
) / sizeof(spmap
[0]); i
++)
5194 CreateDirectoryA("shortone", NULL
);
5195 CreateDirectoryA("shortone\\shorttwo", NULL
);
5200 CreateDirectoryA("shortone", NULL
);
5201 CreateDirectoryA("shortone\\longtwo", NULL
);
5206 CreateDirectoryA("longone", NULL
);
5207 CreateDirectoryA("longone\\shorttwo", NULL
);
5212 CreateDirectoryA("longone", NULL
);
5213 CreateDirectoryA("longone\\longtwo", NULL
);
5217 create_file("shortone\\shorttwo\\augustus", 50);
5219 create_file("shortone\\longtwo\\augustus", 100);
5221 create_file("longone\\shorttwo\\augustus", 150);
5223 create_file("longone\\longtwo\\augustus", 200);
5225 r
= MsiInstallProductA(msifile
, NULL
);
5226 ok(r
== spmap
[i
].err
, "%d: Expected %d, got %d\n", i
, spmap
[i
].err
, r
);
5227 ok(get_pf_file_size("msitest\\augustus") == spmap
[i
].size
,
5228 "%d: Expected %d, got %d\n", i
, spmap
[i
].size
,
5229 get_pf_file_size("msitest\\augustus"));
5231 if (r
== ERROR_SUCCESS
)
5233 ok(delete_pf("msitest\\augustus", TRUE
), "%d: File not installed\n", i
);
5234 ok(delete_pf("msitest", FALSE
), "%d: File not installed\n", i
);
5238 ok(!delete_pf("msitest\\augustus", TRUE
), "%d: File installed\n", i
);
5239 todo_wine
ok(!delete_pf("msitest", FALSE
), "%d: File installed\n", i
);
5242 DeleteFileA("shortone\\shorttwo\\augustus");
5243 DeleteFileA("shortone\\longtwo\\augustus");
5244 DeleteFileA("longone\\shorttwo\\augustus");
5245 DeleteFileA("longone\\longtwo\\augustus");
5246 RemoveDirectoryA("shortone\\shorttwo");
5247 RemoveDirectoryA("shortone\\longtwo");
5248 RemoveDirectoryA("longone\\shorttwo");
5249 RemoveDirectoryA("longone\\longtwo");
5250 RemoveDirectoryA("shortone");
5251 RemoveDirectoryA("longone");
5254 DeleteFileA(msifile
);
5257 static void test_MsiConfigureProductEx(void)
5263 CHAR keypath
[MAX_PATH
* 2];
5264 CHAR localpack
[MAX_PATH
];
5268 win_skip("Different registry keys on Win9x and WinMe\n");
5272 CreateDirectoryA("msitest", NULL
);
5273 create_file("msitest\\hydrogen", 500);
5274 create_file("msitest\\helium", 500);
5275 create_file("msitest\\lithium", 500);
5277 create_database(msifile
, mcp_tables
, sizeof(mcp_tables
) / sizeof(msi_table
));
5279 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5281 /* NULL szProduct */
5282 r
= MsiConfigureProductExA(NULL
, INSTALLLEVEL_DEFAULT
,
5283 INSTALLSTATE_DEFAULT
, "PROPVAR=42");
5284 ok(r
== ERROR_INVALID_PARAMETER
,
5285 "Expected ERROR_INVALID_PARAMETER, got %d\n", r
);
5287 /* empty szProduct */
5288 r
= MsiConfigureProductExA("", INSTALLLEVEL_DEFAULT
,
5289 INSTALLSTATE_DEFAULT
, "PROPVAR=42");
5290 ok(r
== ERROR_INVALID_PARAMETER
,
5291 "Expected ERROR_INVALID_PARAMETER, got %d\n", r
);
5293 /* garbage szProduct */
5294 r
= MsiConfigureProductExA("garbage", INSTALLLEVEL_DEFAULT
,
5295 INSTALLSTATE_DEFAULT
, "PROPVAR=42");
5296 ok(r
== ERROR_INVALID_PARAMETER
,
5297 "Expected ERROR_INVALID_PARAMETER, got %d\n", r
);
5299 /* guid without brackets */
5300 r
= MsiConfigureProductExA("6700E8CF-95AB-4D9C-BC2C-15840DEA7A5D",
5301 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_DEFAULT
,
5303 ok(r
== ERROR_INVALID_PARAMETER
,
5304 "Expected ERROR_INVALID_PARAMETER, got %d\n", r
);
5306 /* guid with brackets */
5307 r
= MsiConfigureProductExA("{6700E8CF-95AB-4D9C-BC2C-15840DEA7A5D}",
5308 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_DEFAULT
,
5310 ok(r
== ERROR_UNKNOWN_PRODUCT
,
5311 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
5313 /* same length as guid, but random */
5314 r
= MsiConfigureProductExA("A938G02JF-2NF3N93-VN3-2NNF-3KGKALDNF93",
5315 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_DEFAULT
,
5317 ok(r
== ERROR_UNKNOWN_PRODUCT
,
5318 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
5320 /* product not installed yet */
5321 r
= MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5322 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_DEFAULT
,
5324 ok(r
== ERROR_UNKNOWN_PRODUCT
,
5325 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
5327 /* install the product, per-user unmanaged */
5328 r
= MsiInstallProductA(msifile
, "INSTALLLEVEL=10 PROPVAR=42");
5329 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5330 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
5331 ok(pf_exists("msitest\\helium"), "File not installed\n");
5332 ok(pf_exists("msitest\\lithium"), "File not installed\n");
5333 ok(pf_exists("msitest"), "File not installed\n");
5335 /* product is installed per-user managed, remove it */
5336 r
= MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5337 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_ABSENT
,
5339 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
5340 ok(!delete_pf("msitest\\hydrogen", TRUE
), "File not removed\n");
5341 ok(!delete_pf("msitest\\helium", TRUE
), "File not removed\n");
5342 ok(!delete_pf("msitest\\lithium", TRUE
), "File not removed\n");
5345 ok(!delete_pf("msitest", FALSE
), "File not removed\n");
5348 /* product has been removed */
5349 r
= MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5350 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_DEFAULT
,
5352 ok(r
== ERROR_UNKNOWN_PRODUCT
,
5353 "Expected ERROR_UNKNOWN_PRODUCT, got %u\n", r
);
5355 /* install the product, machine */
5356 r
= MsiInstallProductA(msifile
, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
5357 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5358 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
5359 ok(pf_exists("msitest\\helium"), "File not installed\n");
5360 ok(pf_exists("msitest\\lithium"), "File not installed\n");
5361 ok(pf_exists("msitest"), "File not installed\n");
5363 /* product is installed machine, remove it */
5364 r
= MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5365 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_ABSENT
,
5367 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
5368 ok(!delete_pf("msitest\\hydrogen", TRUE
), "File not removed\n");
5369 ok(!delete_pf("msitest\\helium", TRUE
), "File not removed\n");
5370 ok(!delete_pf("msitest\\lithium", TRUE
), "File not removed\n");
5373 ok(!delete_pf("msitest", FALSE
), "File not removed\n");
5376 /* product has been removed */
5377 r
= MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5378 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_DEFAULT
,
5380 ok(r
== ERROR_UNKNOWN_PRODUCT
,
5381 "Expected ERROR_UNKNOWN_PRODUCT, got %u\n", r
);
5383 /* install the product, machine */
5384 r
= MsiInstallProductA(msifile
, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
5385 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5386 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
5387 ok(pf_exists("msitest\\helium"), "File not installed\n");
5388 ok(pf_exists("msitest\\lithium"), "File not installed\n");
5389 ok(pf_exists("msitest"), "File not installed\n");
5391 DeleteFileA(msifile
);
5393 /* local msifile is removed */
5394 r
= MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5395 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_ABSENT
,
5397 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
5398 ok(!delete_pf("msitest\\hydrogen", TRUE
), "File not removed\n");
5399 ok(!delete_pf("msitest\\helium", TRUE
), "File not removed\n");
5400 ok(!delete_pf("msitest\\lithium", TRUE
), "File not removed\n");
5403 ok(!delete_pf("msitest", FALSE
), "File not removed\n");
5406 create_database(msifile
, mcp_tables
, sizeof(mcp_tables
) / sizeof(msi_table
));
5408 /* install the product, machine */
5409 r
= MsiInstallProductA(msifile
, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
5410 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5411 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
5412 ok(pf_exists("msitest\\helium"), "File not installed\n");
5413 ok(pf_exists("msitest\\lithium"), "File not installed\n");
5414 ok(pf_exists("msitest"), "File not installed\n");
5416 DeleteFileA(msifile
);
5418 lstrcpyA(keypath
, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\");
5419 lstrcatA(keypath
, "Installer\\UserData\\S-1-5-18\\Products\\");
5420 lstrcatA(keypath
, "84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties");
5422 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &props
);
5423 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
5425 res
= RegSetValueExA(props
, "LocalPackage", 0, REG_SZ
,
5426 (const BYTE
*)"C:\\idontexist.msi", 18);
5427 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
5429 /* LocalPackage is used to find the cached msi package */
5430 r
= MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5431 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_ABSENT
,
5433 ok(r
== ERROR_INSTALL_SOURCE_ABSENT
,
5434 "Expected ERROR_INSTALL_SOURCE_ABSENT, got %d\n", r
);
5435 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
5436 ok(pf_exists("msitest\\helium"), "File not installed\n");
5437 ok(pf_exists("msitest\\lithium"), "File not installed\n");
5438 ok(pf_exists("msitest"), "File not installed\n");
5441 create_database(msifile
, mcp_tables
, sizeof(mcp_tables
) / sizeof(msi_table
));
5443 /* LastUsedSource (local msi package) can be used as a last resort */
5444 r
= MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5445 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_ABSENT
,
5447 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
5448 ok(!delete_pf("msitest\\hydrogen", TRUE
), "File not removed\n");
5449 ok(!delete_pf("msitest\\helium", TRUE
), "File not removed\n");
5450 ok(!delete_pf("msitest\\lithium", TRUE
), "File not removed\n");
5453 ok(!delete_pf("msitest", FALSE
), "File not removed\n");
5456 /* install the product, machine */
5457 r
= MsiInstallProductA(msifile
, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
5458 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5459 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
5460 ok(pf_exists("msitest\\helium"), "File not installed\n");
5461 ok(pf_exists("msitest\\lithium"), "File not installed\n");
5462 ok(pf_exists("msitest"), "File not installed\n");
5464 lstrcpyA(keypath
, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\");
5465 lstrcatA(keypath
, "Installer\\UserData\\S-1-5-18\\Products\\");
5466 lstrcatA(keypath
, "84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties");
5468 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &props
);
5469 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
5471 res
= RegSetValueExA(props
, "LocalPackage", 0, REG_SZ
,
5472 (const BYTE
*)"C:\\idontexist.msi", 18);
5473 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
5475 lstrcpyA(keypath
, "SOFTWARE\\Classes\\Installer\\Products\\");
5476 lstrcatA(keypath
, "84A88FD7F6998CE40A22FB59F6B9C2BB\\SourceList");
5478 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &source
);
5479 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
5483 res
= RegQueryValueExA(source
, "PackageName", NULL
, &type
,
5484 (LPBYTE
)localpack
, &size
);
5485 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
5487 res
= RegSetValueExA(source
, "PackageName", 0, REG_SZ
,
5488 (const BYTE
*)"idontexist.msi", 15);
5489 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
5491 /* SourceList is altered */
5492 r
= MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5493 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_ABSENT
,
5495 ok(r
== ERROR_INSTALL_SOURCE_ABSENT
,
5496 "Expected ERROR_INSTALL_SOURCE_ABSENT, got %d\n", r
);
5497 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
5498 ok(pf_exists("msitest\\helium"), "File not installed\n");
5499 ok(pf_exists("msitest\\lithium"), "File not installed\n");
5500 ok(pf_exists("msitest"), "File not installed\n");
5502 /* restore the SourceList */
5503 res
= RegSetValueExA(source
, "PackageName", 0, REG_SZ
,
5504 (const BYTE
*)localpack
, lstrlenA(localpack
) + 1);
5505 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
5507 /* finally remove the product */
5508 r
= MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
5509 INSTALLLEVEL_DEFAULT
, INSTALLSTATE_ABSENT
,
5511 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
5512 ok(!delete_pf("msitest\\hydrogen", TRUE
), "File not removed\n");
5513 ok(!delete_pf("msitest\\helium", TRUE
), "File not removed\n");
5514 ok(!delete_pf("msitest\\lithium", TRUE
), "File not removed\n");
5517 ok(!delete_pf("msitest", FALSE
), "File not removed\n");
5520 DeleteFileA(msifile
);
5521 RegCloseKey(source
);
5523 DeleteFileA("msitest\\hydrogen");
5524 DeleteFileA("msitest\\helium");
5525 DeleteFileA("msitest\\lithium");
5526 RemoveDirectoryA("msitest");
5529 static void test_missingcomponent(void)
5533 CreateDirectoryA("msitest", NULL
);
5534 create_file("msitest\\hydrogen", 500);
5535 create_file("msitest\\helium", 500);
5536 create_file("msitest\\lithium", 500);
5537 create_file("beryllium", 500);
5539 create_database(msifile
, mcomp_tables
, sizeof(mcomp_tables
) / sizeof(msi_table
));
5541 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5543 r
= MsiInstallProductA(msifile
, "INSTALLLEVEL=10 PROPVAR=42");
5544 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5545 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
5546 ok(pf_exists("msitest\\helium"), "File not installed\n");
5547 ok(pf_exists("msitest\\lithium"), "File not installed\n");
5548 ok(!pf_exists("msitest\\beryllium"), "File installed\n");
5549 ok(pf_exists("msitest"), "File not installed\n");
5551 r
= MsiInstallProductA(msifile
, "REMOVE=ALL INSTALLLEVEL=10 PROPVAR=42");
5552 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5553 ok(!delete_pf("msitest\\hydrogen", TRUE
), "File not removed\n");
5554 ok(!delete_pf("msitest\\helium", TRUE
), "File not removed\n");
5555 ok(!delete_pf("msitest\\lithium", TRUE
), "File not removed\n");
5556 ok(!pf_exists("msitest\\beryllium"), "File installed\n");
5559 ok(!delete_pf("msitest", FALSE
), "File not removed\n");
5562 DeleteFileA(msifile
);
5563 DeleteFileA("msitest\\hydrogen");
5564 DeleteFileA("msitest\\helium");
5565 DeleteFileA("msitest\\lithium");
5566 DeleteFileA("beryllium");
5567 RemoveDirectoryA("msitest");
5570 static void test_sourcedirprop(void)
5573 CHAR props
[MAX_PATH
];
5575 CreateDirectoryA("msitest", NULL
);
5576 create_file("msitest\\augustus", 500);
5578 create_database(msifile
, ca51_tables
, sizeof(ca51_tables
) / sizeof(msi_table
));
5580 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5582 r
= MsiInstallProductA(msifile
, NULL
);
5583 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5584 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
5585 ok(delete_pf("msitest", FALSE
), "File installed\n");
5587 DeleteFile("msitest\\augustus");
5588 RemoveDirectory("msitest");
5590 CreateDirectoryA("altsource", NULL
);
5591 CreateDirectoryA("altsource\\msitest", NULL
);
5592 create_file("altsource\\msitest\\augustus", 500);
5594 sprintf(props
, "SRCDIR=%s\\altsource\\", CURR_DIR
);
5596 r
= MsiInstallProductA(msifile
, props
);
5597 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5598 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
5599 ok(delete_pf("msitest", FALSE
), "File installed\n");
5601 DeleteFile(msifile
);
5602 DeleteFile("altsource\\msitest\\augustus");
5603 RemoveDirectory("altsource\\msitest");
5604 RemoveDirectory("altsource");
5607 static void test_adminimage(void)
5611 CreateDirectoryA("msitest", NULL
);
5612 CreateDirectoryA("msitest\\first", NULL
);
5613 CreateDirectoryA("msitest\\second", NULL
);
5614 CreateDirectoryA("msitest\\cabout", NULL
);
5615 CreateDirectoryA("msitest\\cabout\\new", NULL
);
5616 create_file("msitest\\one.txt", 100);
5617 create_file("msitest\\first\\two.txt", 100);
5618 create_file("msitest\\second\\three.txt", 100);
5619 create_file("msitest\\cabout\\four.txt", 100);
5620 create_file("msitest\\cabout\\new\\five.txt", 100);
5621 create_file("msitest\\filename", 100);
5622 create_file("msitest\\service.exe", 100);
5624 create_database_wordcount(msifile
, ai_tables
,
5625 sizeof(ai_tables
) / sizeof(msi_table
),
5626 msidbSumInfoSourceTypeAdminImage
);
5628 r
= MsiInstallProductA(msifile
, NULL
);
5629 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5631 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
5632 ok(delete_pf("msitest\\cabout\\new", FALSE
), "File not installed\n");
5633 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
5634 ok(delete_pf("msitest\\cabout", FALSE
), "File not installed\n");
5635 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
5636 ok(delete_pf("msitest\\changed", FALSE
), "File not installed\n");
5637 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
5638 ok(delete_pf("msitest\\first", FALSE
), "File not installed\n");
5639 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
5640 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
5641 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
5642 ok(delete_pf("msitest", FALSE
), "File not installed\n");
5644 DeleteFileA("msitest.msi");
5645 DeleteFileA("msitest\\cabout\\new\\five.txt");
5646 DeleteFileA("msitest\\cabout\\four.txt");
5647 DeleteFileA("msitest\\second\\three.txt");
5648 DeleteFileA("msitest\\first\\two.txt");
5649 DeleteFileA("msitest\\one.txt");
5650 DeleteFileA("msitest\\service.exe");
5651 DeleteFileA("msitest\\filename");
5652 RemoveDirectoryA("msitest\\cabout\\new");
5653 RemoveDirectoryA("msitest\\cabout");
5654 RemoveDirectoryA("msitest\\second");
5655 RemoveDirectoryA("msitest\\first");
5656 RemoveDirectoryA("msitest");
5659 static void test_propcase(void)
5663 CreateDirectoryA("msitest", NULL
);
5664 create_file("msitest\\augustus", 500);
5666 create_database(msifile
, pc_tables
, sizeof(pc_tables
) / sizeof(msi_table
));
5668 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
5670 r
= MsiInstallProductA(msifile
, "MyProp=42");
5671 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
5672 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
5673 ok(delete_pf("msitest", FALSE
), "File not installed\n");
5675 DeleteFile(msifile
);
5676 DeleteFile("msitest\\augustus");
5677 RemoveDirectory("msitest");
5683 char temp_path
[MAX_PATH
], prev_path
[MAX_PATH
];
5684 STATEMGRSTATUS status
;
5687 init_functionpointers();
5689 on_win9x
= check_win9x();
5691 GetCurrentDirectoryA(MAX_PATH
, prev_path
);
5692 GetTempPath(MAX_PATH
, temp_path
);
5693 SetCurrentDirectoryA(temp_path
);
5695 lstrcpyA(CURR_DIR
, temp_path
);
5696 len
= lstrlenA(CURR_DIR
);
5698 if(len
&& (CURR_DIR
[len
- 1] == '\\'))
5699 CURR_DIR
[len
- 1] = 0;
5701 get_program_files_dir(PROG_FILES_DIR
, COMMON_FILES_DIR
);
5703 /* Create a restore point ourselves so we circumvent the multitude of restore points
5704 * that would have been created by all the installation and removal tests.
5706 if (pSRSetRestorePointA
)
5708 memset(&status
, 0, sizeof(status
));
5709 ret
= notify_system_change(BEGIN_NESTED_SYSTEM_CHANGE
, &status
);
5712 /* Create only one log file and don't append. We have to pass something
5713 * for the log mode for this to work.
5715 MsiEnableLogA(INSTALLLOGMODE_FATALEXIT
, "msitest.log", 0);
5717 test_MsiInstallProduct();
5718 test_MsiSetComponentState();
5719 test_packagecoltypes();
5720 test_continuouscabs();
5723 test_samesequence();
5724 test_uiLevelFlags();
5725 test_readonlyfile();
5726 test_setdirproperty();
5727 test_cabisextracted();
5728 test_concurrentinstall();
5729 test_setpropertyfolder();
5730 test_publish_registerproduct();
5731 test_publish_publishproduct();
5732 test_publish_publishfeatures();
5733 test_publish_registeruser();
5734 test_publish_processcomponents();
5736 test_publishsourcelist();
5737 test_transformprop();
5738 test_currentworkingdir();
5744 test_duplicatefiles();
5745 test_writeregistryvalues();
5746 test_sourcefolder();
5747 test_customaction51();
5748 test_installstate();
5750 test_MsiConfigureProductEx();
5751 test_missingcomponent();
5752 test_sourcedirprop();
5756 DeleteFileA("msitest.log");
5758 if (pSRSetRestorePointA
&& ret
)
5760 ret
= notify_system_change(END_NESTED_SYSTEM_CHANGE
, &status
);
5762 remove_restore_point(status
.llSequenceNumber
);
5764 FreeLibrary(hsrclient
);
5766 SetCurrentDirectoryA(prev_path
);