msi: Rewrite the ProcessComponents test to only check the registry changes.
[wine/multimedia.git] / dlls / msi / tests / install.c
blobd20a4fe46b6e2581269d6c9c2efdf33a3b264640
1 /*
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
22 #define COBJMACROS
24 #include <stdio.h>
26 #include <windows.h>
27 #include <msiquery.h>
28 #include <msidefs.h>
29 #include <msi.h>
30 #include <fci.h>
31 #include <objidl.h>
33 #include "wine/test.h"
35 static UINT (WINAPI *pMsiQueryComponentStateA)
36 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPCSTR, INSTALLSTATE*);
37 static UINT (WINAPI *pMsiSourceListEnumSourcesA)
38 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD);
39 static UINT (WINAPI *pMsiSourceListGetInfoA)
40 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD);
42 static const char *msifile = "msitest.msi";
43 static const char *msifile2 = "winetest2.msi";
44 static const char *mstfile = "winetest.mst";
45 static CHAR CURR_DIR[MAX_PATH];
46 static CHAR PROG_FILES_DIR[MAX_PATH];
47 static CHAR COMMON_FILES_DIR[MAX_PATH];
49 /* msi database data */
51 static const CHAR component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
52 "s72\tS38\ts72\ti2\tS255\tS72\n"
53 "Component\tComponent\n"
54 "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n"
55 "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n"
56 "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\t\tone.txt\n"
57 "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n"
58 "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n"
59 "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n"
60 "component\t\tMSITESTDIR\t0\t1\tfile\n"
61 "service_comp\t\tMSITESTDIR\t0\t1\tservice_file";
63 static const CHAR directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n"
64 "s72\tS72\tl255\n"
65 "Directory\tDirectory\n"
66 "CABOUTDIR\tMSITESTDIR\tcabout\n"
67 "CHANGEDDIR\tMSITESTDIR\tchanged:second\n"
68 "FIRSTDIR\tMSITESTDIR\tfirst\n"
69 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
70 "NEWDIR\tCABOUTDIR\tnew\n"
71 "ProgramFilesFolder\tTARGETDIR\t.\n"
72 "TARGETDIR\t\tSourceDir";
74 static const CHAR feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
75 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
76 "Feature\tFeature\n"
77 "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n"
78 "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n"
79 "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n"
80 "Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n"
81 "Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n"
82 "feature\t\t\t\t2\t1\tTARGETDIR\t0\n"
83 "service_feature\t\t\t\t2\t1\tTARGETDIR\t0";
85 static const CHAR feature_comp_dat[] = "Feature_\tComponent_\n"
86 "s38\ts72\n"
87 "FeatureComponents\tFeature_\tComponent_\n"
88 "Five\tFive\n"
89 "Four\tFour\n"
90 "One\tOne\n"
91 "Three\tThree\n"
92 "Two\tTwo\n"
93 "feature\tcomponent\n"
94 "service_feature\tservice_comp\n";
96 static const CHAR file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
97 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
98 "File\tFile\n"
99 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
100 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
101 "one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n"
102 "three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n"
103 "two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n"
104 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
105 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1";
107 static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
108 "s72\tS255\tI2\n"
109 "InstallExecuteSequence\tAction\n"
110 "AllocateRegistrySpace\tNOT Installed\t1550\n"
111 "CostFinalize\t\t1000\n"
112 "CostInitialize\t\t800\n"
113 "FileCost\t\t900\n"
114 "ResolveSource\t\t950\n"
115 "MoveFiles\t\t1700\n"
116 "InstallFiles\t\t4000\n"
117 "DuplicateFiles\t\t4500\n"
118 "InstallServices\t\t5000\n"
119 "InstallFinalize\t\t6600\n"
120 "InstallInitialize\t\t1500\n"
121 "InstallValidate\t\t1400\n"
122 "LaunchConditions\t\t100\n"
123 "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000";
125 static const CHAR media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
126 "i2\ti4\tL64\tS255\tS32\tS72\n"
127 "Media\tDiskId\n"
128 "1\t3\t\t\tDISK1\t\n"
129 "2\t5\t\tmsitest.cab\tDISK2\t\n";
131 static const CHAR property_dat[] = "Property\tValue\n"
132 "s72\tl0\n"
133 "Property\tProperty\n"
134 "DefaultUIFont\tDlgFont8\n"
135 "HASUIRUN\t0\n"
136 "INSTALLLEVEL\t3\n"
137 "InstallMode\tTypical\n"
138 "Manufacturer\tWine\n"
139 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
140 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
141 "ProductID\tnone\n"
142 "ProductLanguage\t1033\n"
143 "ProductName\tMSITEST\n"
144 "ProductVersion\t1.1.1\n"
145 "PROMPTROLLBACKCOST\tP\n"
146 "Setup\tSetup\n"
147 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
148 "AdminProperties\tPOSTADMIN\n"
149 "ROOTDRIVE\tC:\\\n"
150 "SERVNAME\tTestService\n"
151 "SERVDISP\tTestServiceDisp\n";
153 static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
154 "s72\ti2\tl255\tL255\tL0\ts72\n"
155 "Registry\tRegistry\n"
156 "Apples\t2\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n"
157 "Oranges\t2\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n"
158 "regdata\t2\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n"
159 "OrderTest\t2\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent";
161 static const CHAR service_install_dat[] = "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
162 "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n"
163 "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n"
164 "ServiceInstall\tServiceInstall\n"
165 "TestService\t[SERVNAME]\t[SERVDISP]\t2\t3\t0\t\t\tTestService\t\t\tservice_comp\t\t";
167 static const CHAR service_control_dat[] = "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
168 "s72\tl255\ti2\tL255\tI2\ts72\n"
169 "ServiceControl\tServiceControl\n"
170 "ServiceControl\tTestService\t8\t\t0\tservice_comp";
172 /* tables for test_continuouscabs */
173 static const CHAR cc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
174 "s72\tS38\ts72\ti2\tS255\tS72\n"
175 "Component\tComponent\n"
176 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
177 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
178 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
180 static const CHAR cc2_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\t0\taugustus\n"
185 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
187 static const CHAR cc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
188 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
189 "Feature\tFeature\n"
190 "feature\t\t\t\t2\t1\tTARGETDIR\t0";
192 static const CHAR cc_feature_comp_dat[] = "Feature_\tComponent_\n"
193 "s38\ts72\n"
194 "FeatureComponents\tFeature_\tComponent_\n"
195 "feature\tmaximus\n"
196 "feature\taugustus\n"
197 "feature\tcaesar";
199 static const CHAR cc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
200 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
201 "File\tFile\n"
202 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
203 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
204 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
206 static const CHAR cc2_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
207 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
208 "File\tFile\n"
209 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
210 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
211 "tiberius\tmaximus\ttiberius\t500\t\t\t16384\t3\n"
212 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12";
214 static const CHAR cc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
215 "i2\ti4\tL64\tS255\tS32\tS72\n"
216 "Media\tDiskId\n"
217 "1\t10\t\ttest1.cab\tDISK1\t\n"
218 "2\t2\t\ttest2.cab\tDISK2\t\n"
219 "3\t12\t\ttest3.cab\tDISK3\t\n";
221 static const CHAR co_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
222 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
223 "File\tFile\n"
224 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
225 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
226 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
228 static const CHAR co_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
229 "i2\ti4\tL64\tS255\tS32\tS72\n"
230 "Media\tDiskId\n"
231 "1\t10\t\ttest1.cab\tDISK1\t\n"
232 "2\t2\t\ttest2.cab\tDISK2\t\n"
233 "3\t3\t\ttest3.cab\tDISK3\t\n";
235 static const CHAR co2_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
236 "i2\ti4\tL64\tS255\tS32\tS72\n"
237 "Media\tDiskId\n"
238 "1\t10\t\ttest1.cab\tDISK1\t\n"
239 "2\t12\t\ttest3.cab\tDISK3\t\n"
240 "3\t2\t\ttest2.cab\tDISK2\t\n";
242 static const CHAR mm_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
243 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
244 "File\tFile\n"
245 "maximus\tmaximus\tmaximus\t500\t\t\t512\t1\n"
246 "augustus\taugustus\taugustus\t500\t\t\t512\t2\n"
247 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3";
249 static const CHAR mm_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
250 "i2\ti4\tL64\tS255\tS32\tS72\n"
251 "Media\tDiskId\n"
252 "1\t3\t\ttest1.cab\tDISK1\t\n";
254 static const CHAR ss_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
255 "i2\ti4\tL64\tS255\tS32\tS72\n"
256 "Media\tDiskId\n"
257 "1\t2\t\ttest1.cab\tDISK1\t\n"
258 "2\t2\t\ttest2.cab\tDISK2\t\n"
259 "3\t12\t\ttest3.cab\tDISK3\t\n";
261 /* tables for test_uiLevelFlags */
262 static const CHAR ui_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
263 "s72\tS38\ts72\ti2\tS255\tS72\n"
264 "Component\tComponent\n"
265 "maximus\t\tMSITESTDIR\t0\tHASUIRUN=1\tmaximus\n"
266 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
267 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n";
269 static const CHAR ui_install_ui_seq_dat[] = "Action\tCondition\tSequence\n"
270 "s72\tS255\tI2\n"
271 "InstallUISequence\tAction\n"
272 "SetUIProperty\t\t5\n"
273 "ExecuteAction\t\t1100\n";
275 static const CHAR ui_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
276 "s72\ti2\tS64\tS0\tS255\n"
277 "CustomAction\tAction\n"
278 "SetUIProperty\t51\tHASUIRUN\t1\t\n";
280 static const CHAR rof_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
281 "s72\tS38\ts72\ti2\tS255\tS72\n"
282 "Component\tComponent\n"
283 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n";
285 static const CHAR rof_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
286 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
287 "Feature\tFeature\n"
288 "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n"
289 "montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0";
291 static const CHAR rof_feature_comp_dat[] = "Feature_\tComponent_\n"
292 "s38\ts72\n"
293 "FeatureComponents\tFeature_\tComponent_\n"
294 "feature\tmaximus\n"
295 "montecristo\tmaximus";
297 static const CHAR rof_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
298 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
299 "File\tFile\n"
300 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1";
302 static const CHAR rof_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
303 "i2\ti4\tL64\tS255\tS32\tS72\n"
304 "Media\tDiskId\n"
305 "1\t1\t\t\tDISK1\t\n";
307 static const CHAR sdp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
308 "s72\tS255\tI2\n"
309 "InstallExecuteSequence\tAction\n"
310 "AllocateRegistrySpace\tNOT Installed\t1550\n"
311 "CostFinalize\t\t1000\n"
312 "CostInitialize\t\t800\n"
313 "FileCost\t\t900\n"
314 "InstallFiles\t\t4000\n"
315 "InstallFinalize\t\t6600\n"
316 "InstallInitialize\t\t1500\n"
317 "InstallValidate\t\t1400\n"
318 "LaunchConditions\t\t100\n"
319 "SetDirProperty\t\t950";
321 static const CHAR sdp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
322 "s72\ti2\tS64\tS0\tS255\n"
323 "CustomAction\tAction\n"
324 "SetDirProperty\t51\tMSITESTDIR\t[CommonFilesFolder]msitest\\\t\n";
326 static const CHAR cie_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
327 "s72\tS38\ts72\ti2\tS255\tS72\n"
328 "Component\tComponent\n"
329 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
330 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
331 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
332 "gaius\t\tMSITESTDIR\t0\t1\tgaius\n";
334 static const CHAR cie_feature_comp_dat[] = "Feature_\tComponent_\n"
335 "s38\ts72\n"
336 "FeatureComponents\tFeature_\tComponent_\n"
337 "feature\tmaximus\n"
338 "feature\taugustus\n"
339 "feature\tcaesar\n"
340 "feature\tgaius";
342 static const CHAR cie_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
343 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
344 "File\tFile\n"
345 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
346 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n"
347 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12\n"
348 "gaius\tgaius\tgaius\t500\t\t\t8192\t11";
350 static const CHAR cie_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
351 "i2\ti4\tL64\tS255\tS32\tS72\n"
352 "Media\tDiskId\n"
353 "1\t1\t\ttest1.cab\tDISK1\t\n"
354 "2\t2\t\ttest2.cab\tDISK2\t\n"
355 "3\t12\t\ttest3.cab\tDISK3\t\n";
357 static const CHAR ci_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
358 "s72\tS255\tI2\n"
359 "InstallExecuteSequence\tAction\n"
360 "CostFinalize\t\t1000\n"
361 "CostInitialize\t\t800\n"
362 "FileCost\t\t900\n"
363 "InstallFiles\t\t4000\n"
364 "InstallServices\t\t5000\n"
365 "InstallFinalize\t\t6600\n"
366 "InstallInitialize\t\t1500\n"
367 "RunInstall\t\t1600\n"
368 "InstallValidate\t\t1400\n"
369 "LaunchConditions\t\t100";
371 static const CHAR ci_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
372 "s72\ti2\tS64\tS0\tS255\n"
373 "CustomAction\tAction\n"
374 "RunInstall\t87\tmsitest\\concurrent.msi\tMYPROP=[UILevel]\t\n";
376 static const CHAR ci_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
377 "s72\tS38\ts72\ti2\tS255\tS72\n"
378 "Component\tComponent\n"
379 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n";
381 static const CHAR ci2_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
382 "s72\tS38\ts72\ti2\tS255\tS72\n"
383 "Component\tComponent\n"
384 "augustus\t\tMSITESTDIR\t0\tUILevel=3 AND MYPROP=5\taugustus\n";
386 static const CHAR ci2_feature_comp_dat[] = "Feature_\tComponent_\n"
387 "s38\ts72\n"
388 "FeatureComponents\tFeature_\tComponent_\n"
389 "feature\taugustus";
391 static const CHAR ci2_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
392 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
393 "File\tFile\n"
394 "augustus\taugustus\taugustus\t500\t\t\t8192\t1";
396 static const CHAR spf_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
397 "s72\ti2\tS64\tS0\tS255\n"
398 "CustomAction\tAction\n"
399 "SetFolderProp\t51\tMSITESTDIR\t[ProgramFilesFolder]\\msitest\\added\t\n";
401 static const CHAR spf_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
402 "s72\tS255\tI2\n"
403 "InstallExecuteSequence\tAction\n"
404 "CostFinalize\t\t1000\n"
405 "CostInitialize\t\t800\n"
406 "FileCost\t\t900\n"
407 "SetFolderProp\t\t950\n"
408 "InstallFiles\t\t4000\n"
409 "InstallServices\t\t5000\n"
410 "InstallFinalize\t\t6600\n"
411 "InstallInitialize\t\t1500\n"
412 "InstallValidate\t\t1400\n"
413 "LaunchConditions\t\t100";
415 static const CHAR spf_install_ui_seq_dat[] = "Action\tCondition\tSequence\n"
416 "s72\tS255\tI2\n"
417 "InstallUISequence\tAction\n"
418 "CostInitialize\t\t800\n"
419 "FileCost\t\t900\n"
420 "CostFinalize\t\t1000\n"
421 "ExecuteAction\t\t1100\n";
423 static const CHAR pp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
424 "s72\tS255\tI2\n"
425 "InstallExecuteSequence\tAction\n"
426 "ValidateProductID\t\t700\n"
427 "CostInitialize\t\t800\n"
428 "FileCost\t\t900\n"
429 "CostFinalize\t\t1000\n"
430 "InstallValidate\t\t1400\n"
431 "InstallInitialize\t\t1500\n"
432 "ProcessComponents\tPROCESS_COMPONENTS=1 Or FULL=1\t1600\n"
433 "UnpublishFeatures\tUNPUBLISH_FEATURES=1 Or FULL=1\t1800\n"
434 "RemoveFiles\t\t3500\n"
435 "InstallFiles\t\t4000\n"
436 "RegisterUser\tREGISTER_USER=1 Or FULL=1\t6000\n"
437 "RegisterProduct\tREGISTER_PRODUCT=1 Or FULL=1\t6100\n"
438 "PublishFeatures\tPUBLISH_FEATURES=1 Or FULL=1\t6300\n"
439 "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n"
440 "InstallFinalize\t\t6600";
442 static const CHAR tp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
443 "s72\tS38\ts72\ti2\tS255\tS72\n"
444 "Component\tComponent\n"
445 "augustus\t\tMSITESTDIR\t0\tprop=\"val\"\taugustus\n";
447 static const CHAR cwd_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
448 "s72\tS38\ts72\ti2\tS255\tS72\n"
449 "Component\tComponent\n"
450 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
452 static const CHAR adm_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
453 "s72\tS38\ts72\ti2\tS255\tS72\n"
454 "Component\tComponent\n"
455 "augustus\t\tMSITESTDIR\t0\tPOSTADMIN=1\taugustus";
457 static const CHAR adm_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
458 "s72\ti2\tS64\tS0\tS255\n"
459 "CustomAction\tAction\n"
460 "SetPOSTADMIN\t51\tPOSTADMIN\t1\t\n";
462 static const CHAR adm_admin_exec_seq_dat[] = "Action\tCondition\tSequence\n"
463 "s72\tS255\tI2\n"
464 "AdminExecuteSequence\tAction\n"
465 "CostFinalize\t\t1000\n"
466 "CostInitialize\t\t800\n"
467 "FileCost\t\t900\n"
468 "SetPOSTADMIN\t\t950\n"
469 "InstallFiles\t\t4000\n"
470 "InstallFinalize\t\t6600\n"
471 "InstallInitialize\t\t1500\n"
472 "InstallValidate\t\t1400\n"
473 "LaunchConditions\t\t100";
475 static const CHAR amp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
476 "s72\tS38\ts72\ti2\tS255\tS72\n"
477 "Component\tComponent\n"
478 "augustus\t\tMSITESTDIR\t0\tMYPROP=2718\taugustus\n";
480 static const CHAR rem_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
481 "s72\tS38\ts72\ti2\tS255\tS72\n"
482 "Component\tComponent\n"
483 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t0\t\thydrogen\n"
484 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\thelium\n"
485 "lithium\t\tMSITESTDIR\t2\t\tlithium\n";
487 static const CHAR rem_feature_comp_dat[] = "Feature_\tComponent_\n"
488 "s38\ts72\n"
489 "FeatureComponents\tFeature_\tComponent_\n"
490 "feature\thydrogen\n"
491 "feature\thelium\n"
492 "feature\tlithium";
494 static const CHAR rem_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
495 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
496 "File\tFile\n"
497 "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n"
498 "helium\thelium\thelium\t0\t\t\t8192\t1\n"
499 "lithium\tlithium\tlithium\t0\t\t\t8192\t1";
501 static const CHAR rem_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
502 "s72\tS255\tI2\n"
503 "InstallExecuteSequence\tAction\n"
504 "ValidateProductID\t\t700\n"
505 "CostInitialize\t\t800\n"
506 "FileCost\t\t900\n"
507 "CostFinalize\t\t1000\n"
508 "InstallValidate\t\t1400\n"
509 "InstallInitialize\t\t1500\n"
510 "ProcessComponents\t\t1600\n"
511 "UnpublishFeatures\t\t1800\n"
512 "RemoveFiles\t\t3500\n"
513 "InstallFiles\t\t4000\n"
514 "RegisterProduct\t\t6100\n"
515 "PublishFeatures\t\t6300\n"
516 "PublishProduct\t\t6400\n"
517 "InstallFinalize\t\t6600";
519 static const CHAR rem_remove_files_dat[] = "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n"
520 "s72\ts72\tS255\ts72\tI2\n"
521 "RemoveFile\tFileKey\n"
522 "furlong\thydrogen\tfurlong\tMSITESTDIR\t1\n"
523 "firkin\thelium\tfirkin\tMSITESTDIR\t1\n"
524 "fortnight\tlithium\tfortnight\tMSITESTDIR\t1\n"
525 "becquerel\thydrogen\tbecquerel\tMSITESTDIR\t2\n"
526 "dioptre\thelium\tdioptre\tMSITESTDIR\t2\n"
527 "attoparsec\tlithium\tattoparsec\tMSITESTDIR\t2\n"
528 "storeys\thydrogen\tstoreys\tMSITESTDIR\t3\n"
529 "block\thelium\tblock\tMSITESTDIR\t3\n"
530 "siriometer\tlithium\tsiriometer\tMSITESTDIR\t3\n";
532 static const CHAR mov_move_file_dat[] = "FileKey\tComponent_\tSourceName\tDestName\tSourceFolder\tDestFolder\tOptions\n"
533 "s72\ts72\tS255\tS255\tS72\ts72\ti2\n"
534 "MoveFile\tFileKey\n"
535 "abkhazia\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t0\n"
536 "bahamas\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t1\n"
537 "cambodia\taugustus\tcameroon\tcanada\tSourceDir\tMSITESTDIR\t0\n"
538 "denmark\taugustus\tdjibouti\tdominica\tSourceDir\tMSITESTDIR\t1\n"
539 "ecuador\taugustus\tegypt\telsalvador\tNotAProp\tMSITESTDIR\t1\n"
540 "fiji\taugustus\tfinland\tfrance\tSourceDir\tNotAProp\t1\n"
541 "gabon\taugustus\tgambia\tgeorgia\tSOURCEFULL\tMSITESTDIR\t1\n"
542 "haiti\taugustus\thonduras\thungary\tSourceDir\tDESTFULL\t1\n"
543 "iceland\taugustus\tindia\tindonesia\tMSITESTDIR\tMSITESTDIR\t1\n"
544 "jamaica\taugustus\tjapan\tjordan\tFILEPATHBAD\tMSITESTDIR\t1\n"
545 "kazakhstan\taugustus\t\tkiribati\tFILEPATHGOOD\tMSITESTDIR\t1\n"
546 "laos\taugustus\tlatvia\tlebanon\tSourceDir\tMSITESTDIR\t1\n"
547 "namibia\taugustus\tnauru\tkiribati\tSourceDir\tMSITESTDIR\t1\n"
548 "wildcard\taugustus\tapp*\twildcard\tSourceDir\tMSITESTDIR\t1\n"
549 "single\taugustus\tf?o\tsingle\tSourceDir\tMSITESTDIR\t1\n"
550 "wildcardnodest\taugustus\tbudd*\t\tSourceDir\tMSITESTDIR\t1\n"
551 "singlenodest\taugustus\tb?r\t\tSourceDir\tMSITESTDIR\t1\n";
553 static const CHAR mc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
554 "s72\tS38\ts72\ti2\tS255\tS72\n"
555 "Component\tComponent\n"
556 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"
557 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n"
558 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"
559 "gaius\t\tMSITESTDIR\t0\tGAIUS=1\tgaius\n";
561 static const CHAR mc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
562 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
563 "File\tFile\n"
564 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n"
565 "augustus\taugustus\taugustus\t500\t\t\t0\t2\n"
566 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3\n"
567 "gaius\tgaius\tgaius\t500\t\t\t16384\t4";
569 static const CHAR mc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
570 "i2\ti4\tL64\tS255\tS32\tS72\n"
571 "Media\tDiskId\n"
572 "1\t1\t\ttest1.cab\tDISK1\t\n"
573 "2\t2\t\ttest2.cab\tDISK2\t\n"
574 "3\t3\t\ttest3.cab\tDISK3\t\n"
575 "4\t4\t\ttest3.cab\tDISK3\t\n";
577 static const CHAR mc_file_hash_dat[] = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"
578 "s72\ti2\ti4\ti4\ti4\ti4\n"
579 "MsiFileHash\tFile_\n"
580 "caesar\t0\t850433704\t-241429251\t675791761\t-1221108824";
582 static const CHAR df_directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n"
583 "s72\tS72\tl255\n"
584 "Directory\tDirectory\n"
585 "THIS\tMSITESTDIR\tthis\n"
586 "DOESNOT\tTHIS\tdoesnot\n"
587 "NONEXISTENT\tDOESNOT\texist\n"
588 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
589 "ProgramFilesFolder\tTARGETDIR\t.\n"
590 "TARGETDIR\t\tSourceDir";
592 static const CHAR df_duplicate_file_dat[] = "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n"
593 "s72\ts72\ts72\tS255\tS72\n"
594 "DuplicateFile\tFileKey\n"
595 "maximus\tmaximus\tmaximus\taugustus\t\n"
596 "caesar\tmaximus\tmaximus\t\tNONEXISTENT\n";
598 static const CHAR wrv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
599 "s72\tS38\ts72\ti2\tS255\tS72\n"
600 "Component\tComponent\n"
601 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
603 static const CHAR wrv_registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
604 "s72\ti2\tl255\tL255\tL0\ts72\n"
605 "Registry\tRegistry\n"
606 "regdata\t2\tSOFTWARE\\Wine\\msitest\tValue\t[~]one[~]two[~]three\taugustus";
608 static const CHAR ca51_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
609 "s72\tS38\ts72\ti2\tS255\tS72\n"
610 "Component\tComponent\n"
611 "augustus\t\tMSITESTDIR\t0\tMYPROP=42\taugustus\n";
613 static const CHAR ca51_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
614 "s72\tS255\tI2\n"
615 "InstallExecuteSequence\tAction\n"
616 "ValidateProductID\t\t700\n"
617 "GoodSetProperty\t\t725\n"
618 "BadSetProperty\t\t750\n"
619 "CostInitialize\t\t800\n"
620 "FileCost\t\t900\n"
621 "CostFinalize\t\t1000\n"
622 "InstallValidate\t\t1400\n"
623 "InstallInitialize\t\t1500\n"
624 "InstallFiles\t\t4000\n"
625 "InstallFinalize\t\t6600";
627 static const CHAR ca51_custom_action_dat[] = "Action\tType\tSource\tTarget\n"
628 "s72\ti2\tS64\tS0\n"
629 "CustomAction\tAction\n"
630 "GoodSetProperty\t51\tMYPROP\t42\n"
631 "BadSetProperty\t51\t\tMYPROP\n";
633 static const CHAR is_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
634 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
635 "Feature\tFeature\n"
636 "one\t\t\t\t2\t1\t\t0\n" /* favorLocal */
637 "two\t\t\t\t2\t1\t\t1\n" /* favorSource */
638 "three\t\t\t\t2\t1\t\t4\n" /* favorAdvertise */
639 "four\t\t\t\t2\t0\t\t0"; /* disabled */
641 static const CHAR is_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
642 "s72\tS38\ts72\ti2\tS255\tS72\n"
643 "Component\tComponent\n"
644 "alpha\t\tMSITESTDIR\t0\t\talpha_file\n" /* favorLocal:Local */
645 "beta\t\tMSITESTDIR\t1\t\tbeta_file\n" /* favorLocal:Source */
646 "gamma\t\tMSITESTDIR\t2\t\tgamma_file\n" /* favorLocal:Optional */
647 "theta\t\tMSITESTDIR\t0\t\ttheta_file\n" /* favorSource:Local */
648 "delta\t\tMSITESTDIR\t1\t\tdelta_file\n" /* favorSource:Source */
649 "epsilon\t\tMSITESTDIR\t2\t\tepsilon_file\n" /* favorSource:Optional */
650 "zeta\t\tMSITESTDIR\t0\t\tzeta_file\n" /* favorAdvertise:Local */
651 "iota\t\tMSITESTDIR\t1\t\tiota_file\n" /* favorAdvertise:Source */
652 "eta\t\tMSITESTDIR\t2\t\teta_file\n" /* favorAdvertise:Optional */
653 "kappa\t\tMSITESTDIR\t0\t\tkappa_file\n" /* disabled:Local */
654 "lambda\t\tMSITESTDIR\t1\t\tlambda_file\n" /* disabled:Source */
655 "mu\t\tMSITESTDIR\t2\t\tmu_file\n"; /* disabled:Optional */
657 static const CHAR is_feature_comp_dat[] = "Feature_\tComponent_\n"
658 "s38\ts72\n"
659 "FeatureComponents\tFeature_\tComponent_\n"
660 "one\talpha\n"
661 "one\tbeta\n"
662 "one\tgamma\n"
663 "two\ttheta\n"
664 "two\tdelta\n"
665 "two\tepsilon\n"
666 "three\tzeta\n"
667 "three\tiota\n"
668 "three\teta\n"
669 "four\tkappa\n"
670 "four\tlambda\n"
671 "four\tmu";
673 static const CHAR is_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
674 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
675 "File\tFile\n"
676 "alpha_file\talpha\talpha\t500\t\t\t8192\t1\n"
677 "beta_file\tbeta\tbeta\t500\t\t\t8291\t2\n"
678 "gamma_file\tgamma\tgamma\t500\t\t\t8192\t3\n"
679 "theta_file\ttheta\ttheta\t500\t\t\t8192\t4\n"
680 "delta_file\tdelta\tdelta\t500\t\t\t8192\t5\n"
681 "epsilon_file\tepsilon\tepsilon\t500\t\t\t8192\t6\n"
682 "zeta_file\tzeta\tzeta\t500\t\t\t8192\t7\n"
683 "iota_file\tiota\tiota\t500\t\t\t8192\t8\n"
684 "eta_file\teta\teta\t500\t\t\t8192\t9\n"
685 "kappa_file\tkappa\tkappa\t500\t\t\t8192\t10\n"
686 "lambda_file\tlambda\tlambda\t500\t\t\t8192\t11\n"
687 "mu_file\tmu\tmu\t500\t\t\t8192\t12";
689 static const CHAR is_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
690 "i2\ti4\tL64\tS255\tS32\tS72\n"
691 "Media\tDiskId\n"
692 "1\t12\t\t\tDISK1\t\n";
694 typedef struct _msi_table
696 const CHAR *filename;
697 const CHAR *data;
698 int size;
699 } msi_table;
701 #define ADD_TABLE(x) {#x".idt", x##_dat, sizeof(x##_dat)}
703 static const msi_table tables[] =
705 ADD_TABLE(component),
706 ADD_TABLE(directory),
707 ADD_TABLE(feature),
708 ADD_TABLE(feature_comp),
709 ADD_TABLE(file),
710 ADD_TABLE(install_exec_seq),
711 ADD_TABLE(media),
712 ADD_TABLE(property),
713 ADD_TABLE(registry),
714 ADD_TABLE(service_install),
715 ADD_TABLE(service_control)
718 static const msi_table cc_tables[] =
720 ADD_TABLE(cc_component),
721 ADD_TABLE(directory),
722 ADD_TABLE(cc_feature),
723 ADD_TABLE(cc_feature_comp),
724 ADD_TABLE(cc_file),
725 ADD_TABLE(install_exec_seq),
726 ADD_TABLE(cc_media),
727 ADD_TABLE(property),
730 static const msi_table cc2_tables[] =
732 ADD_TABLE(cc2_component),
733 ADD_TABLE(directory),
734 ADD_TABLE(cc_feature),
735 ADD_TABLE(cc_feature_comp),
736 ADD_TABLE(cc2_file),
737 ADD_TABLE(install_exec_seq),
738 ADD_TABLE(cc_media),
739 ADD_TABLE(property),
742 static const msi_table co_tables[] =
744 ADD_TABLE(cc_component),
745 ADD_TABLE(directory),
746 ADD_TABLE(cc_feature),
747 ADD_TABLE(cc_feature_comp),
748 ADD_TABLE(co_file),
749 ADD_TABLE(install_exec_seq),
750 ADD_TABLE(co_media),
751 ADD_TABLE(property),
754 static const msi_table co2_tables[] =
756 ADD_TABLE(cc_component),
757 ADD_TABLE(directory),
758 ADD_TABLE(cc_feature),
759 ADD_TABLE(cc_feature_comp),
760 ADD_TABLE(cc_file),
761 ADD_TABLE(install_exec_seq),
762 ADD_TABLE(co2_media),
763 ADD_TABLE(property),
766 static const msi_table mm_tables[] =
768 ADD_TABLE(cc_component),
769 ADD_TABLE(directory),
770 ADD_TABLE(cc_feature),
771 ADD_TABLE(cc_feature_comp),
772 ADD_TABLE(mm_file),
773 ADD_TABLE(install_exec_seq),
774 ADD_TABLE(mm_media),
775 ADD_TABLE(property),
778 static const msi_table ss_tables[] =
780 ADD_TABLE(cc_component),
781 ADD_TABLE(directory),
782 ADD_TABLE(cc_feature),
783 ADD_TABLE(cc_feature_comp),
784 ADD_TABLE(cc_file),
785 ADD_TABLE(install_exec_seq),
786 ADD_TABLE(ss_media),
787 ADD_TABLE(property),
790 static const msi_table ui_tables[] =
792 ADD_TABLE(ui_component),
793 ADD_TABLE(directory),
794 ADD_TABLE(cc_feature),
795 ADD_TABLE(cc_feature_comp),
796 ADD_TABLE(cc_file),
797 ADD_TABLE(install_exec_seq),
798 ADD_TABLE(ui_install_ui_seq),
799 ADD_TABLE(ui_custom_action),
800 ADD_TABLE(cc_media),
801 ADD_TABLE(property),
804 static const msi_table rof_tables[] =
806 ADD_TABLE(rof_component),
807 ADD_TABLE(directory),
808 ADD_TABLE(rof_feature),
809 ADD_TABLE(rof_feature_comp),
810 ADD_TABLE(rof_file),
811 ADD_TABLE(install_exec_seq),
812 ADD_TABLE(rof_media),
813 ADD_TABLE(property),
816 static const msi_table sdp_tables[] =
818 ADD_TABLE(rof_component),
819 ADD_TABLE(directory),
820 ADD_TABLE(rof_feature),
821 ADD_TABLE(rof_feature_comp),
822 ADD_TABLE(rof_file),
823 ADD_TABLE(sdp_install_exec_seq),
824 ADD_TABLE(sdp_custom_action),
825 ADD_TABLE(rof_media),
826 ADD_TABLE(property),
829 static const msi_table cie_tables[] =
831 ADD_TABLE(cie_component),
832 ADD_TABLE(directory),
833 ADD_TABLE(cc_feature),
834 ADD_TABLE(cie_feature_comp),
835 ADD_TABLE(cie_file),
836 ADD_TABLE(install_exec_seq),
837 ADD_TABLE(cie_media),
838 ADD_TABLE(property),
841 static const msi_table ci_tables[] =
843 ADD_TABLE(ci_component),
844 ADD_TABLE(directory),
845 ADD_TABLE(rof_feature),
846 ADD_TABLE(rof_feature_comp),
847 ADD_TABLE(rof_file),
848 ADD_TABLE(ci_install_exec_seq),
849 ADD_TABLE(rof_media),
850 ADD_TABLE(property),
851 ADD_TABLE(ci_custom_action),
854 static const msi_table ci2_tables[] =
856 ADD_TABLE(ci2_component),
857 ADD_TABLE(directory),
858 ADD_TABLE(rof_feature),
859 ADD_TABLE(ci2_feature_comp),
860 ADD_TABLE(ci2_file),
861 ADD_TABLE(install_exec_seq),
862 ADD_TABLE(rof_media),
863 ADD_TABLE(property),
866 static const msi_table spf_tables[] =
868 ADD_TABLE(ci_component),
869 ADD_TABLE(directory),
870 ADD_TABLE(rof_feature),
871 ADD_TABLE(rof_feature_comp),
872 ADD_TABLE(rof_file),
873 ADD_TABLE(spf_install_exec_seq),
874 ADD_TABLE(rof_media),
875 ADD_TABLE(property),
876 ADD_TABLE(spf_custom_action),
877 ADD_TABLE(spf_install_ui_seq),
880 static const msi_table pp_tables[] =
882 ADD_TABLE(ci_component),
883 ADD_TABLE(directory),
884 ADD_TABLE(rof_feature),
885 ADD_TABLE(rof_feature_comp),
886 ADD_TABLE(rof_file),
887 ADD_TABLE(pp_install_exec_seq),
888 ADD_TABLE(rof_media),
889 ADD_TABLE(property),
892 static const msi_table tp_tables[] =
894 ADD_TABLE(tp_component),
895 ADD_TABLE(directory),
896 ADD_TABLE(rof_feature),
897 ADD_TABLE(ci2_feature_comp),
898 ADD_TABLE(ci2_file),
899 ADD_TABLE(install_exec_seq),
900 ADD_TABLE(rof_media),
901 ADD_TABLE(property),
904 static const msi_table cwd_tables[] =
906 ADD_TABLE(cwd_component),
907 ADD_TABLE(directory),
908 ADD_TABLE(rof_feature),
909 ADD_TABLE(ci2_feature_comp),
910 ADD_TABLE(ci2_file),
911 ADD_TABLE(install_exec_seq),
912 ADD_TABLE(rof_media),
913 ADD_TABLE(property),
916 static const msi_table adm_tables[] =
918 ADD_TABLE(adm_component),
919 ADD_TABLE(directory),
920 ADD_TABLE(rof_feature),
921 ADD_TABLE(ci2_feature_comp),
922 ADD_TABLE(ci2_file),
923 ADD_TABLE(install_exec_seq),
924 ADD_TABLE(rof_media),
925 ADD_TABLE(property),
926 ADD_TABLE(adm_custom_action),
927 ADD_TABLE(adm_admin_exec_seq),
930 static const msi_table amp_tables[] =
932 ADD_TABLE(amp_component),
933 ADD_TABLE(directory),
934 ADD_TABLE(rof_feature),
935 ADD_TABLE(ci2_feature_comp),
936 ADD_TABLE(ci2_file),
937 ADD_TABLE(install_exec_seq),
938 ADD_TABLE(rof_media),
939 ADD_TABLE(property),
942 static const msi_table rem_tables[] =
944 ADD_TABLE(rem_component),
945 ADD_TABLE(directory),
946 ADD_TABLE(rof_feature),
947 ADD_TABLE(rem_feature_comp),
948 ADD_TABLE(rem_file),
949 ADD_TABLE(rem_install_exec_seq),
950 ADD_TABLE(rof_media),
951 ADD_TABLE(property),
952 ADD_TABLE(rem_remove_files),
955 static const msi_table mov_tables[] =
957 ADD_TABLE(cwd_component),
958 ADD_TABLE(directory),
959 ADD_TABLE(rof_feature),
960 ADD_TABLE(ci2_feature_comp),
961 ADD_TABLE(ci2_file),
962 ADD_TABLE(install_exec_seq),
963 ADD_TABLE(rof_media),
964 ADD_TABLE(property),
965 ADD_TABLE(mov_move_file),
968 static const msi_table mc_tables[] =
970 ADD_TABLE(mc_component),
971 ADD_TABLE(directory),
972 ADD_TABLE(cc_feature),
973 ADD_TABLE(cie_feature_comp),
974 ADD_TABLE(mc_file),
975 ADD_TABLE(install_exec_seq),
976 ADD_TABLE(mc_media),
977 ADD_TABLE(property),
978 ADD_TABLE(mc_file_hash),
981 static const msi_table df_tables[] =
983 ADD_TABLE(rof_component),
984 ADD_TABLE(df_directory),
985 ADD_TABLE(rof_feature),
986 ADD_TABLE(rof_feature_comp),
987 ADD_TABLE(rof_file),
988 ADD_TABLE(install_exec_seq),
989 ADD_TABLE(rof_media),
990 ADD_TABLE(property),
991 ADD_TABLE(df_duplicate_file),
994 static const msi_table wrv_tables[] =
996 ADD_TABLE(wrv_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),
1004 ADD_TABLE(wrv_registry),
1007 static const msi_table sf_tables[] =
1009 ADD_TABLE(wrv_component),
1010 ADD_TABLE(directory),
1011 ADD_TABLE(rof_feature),
1012 ADD_TABLE(ci2_feature_comp),
1013 ADD_TABLE(ci2_file),
1014 ADD_TABLE(install_exec_seq),
1015 ADD_TABLE(rof_media),
1016 ADD_TABLE(property),
1019 static const msi_table ca51_tables[] =
1021 ADD_TABLE(ca51_component),
1022 ADD_TABLE(directory),
1023 ADD_TABLE(rof_feature),
1024 ADD_TABLE(ci2_feature_comp),
1025 ADD_TABLE(ci2_file),
1026 ADD_TABLE(ca51_install_exec_seq),
1027 ADD_TABLE(rof_media),
1028 ADD_TABLE(property),
1029 ADD_TABLE(ca51_custom_action),
1032 static const msi_table is_tables[] =
1034 ADD_TABLE(is_component),
1035 ADD_TABLE(directory),
1036 ADD_TABLE(is_feature),
1037 ADD_TABLE(is_feature_comp),
1038 ADD_TABLE(is_file),
1039 ADD_TABLE(install_exec_seq),
1040 ADD_TABLE(is_media),
1041 ADD_TABLE(property),
1044 /* cabinet definitions */
1046 /* make the max size large so there is only one cab file */
1047 #define MEDIA_SIZE 0x7FFFFFFF
1048 #define FOLDER_THRESHOLD 900000
1050 /* the FCI callbacks */
1052 static void *mem_alloc(ULONG cb)
1054 return HeapAlloc(GetProcessHeap(), 0, cb);
1057 static void mem_free(void *memory)
1059 HeapFree(GetProcessHeap(), 0, memory);
1062 static BOOL get_next_cabinet(PCCAB pccab, ULONG cbPrevCab, void *pv)
1064 sprintf(pccab->szCab, pv, pccab->iCab);
1065 return TRUE;
1068 static long progress(UINT typeStatus, ULONG cb1, ULONG cb2, void *pv)
1070 return 0;
1073 static int file_placed(PCCAB pccab, char *pszFile, long cbFile,
1074 BOOL fContinuation, void *pv)
1076 return 0;
1079 static INT_PTR fci_open(char *pszFile, int oflag, int pmode, int *err, void *pv)
1081 HANDLE handle;
1082 DWORD dwAccess = 0;
1083 DWORD dwShareMode = 0;
1084 DWORD dwCreateDisposition = OPEN_EXISTING;
1086 dwAccess = GENERIC_READ | GENERIC_WRITE;
1087 /* FILE_SHARE_DELETE is not supported by Windows Me/98/95 */
1088 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
1090 if (GetFileAttributesA(pszFile) != INVALID_FILE_ATTRIBUTES)
1091 dwCreateDisposition = OPEN_EXISTING;
1092 else
1093 dwCreateDisposition = CREATE_NEW;
1095 handle = CreateFileA(pszFile, dwAccess, dwShareMode, NULL,
1096 dwCreateDisposition, 0, NULL);
1098 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszFile);
1100 return (INT_PTR)handle;
1103 static UINT fci_read(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
1105 HANDLE handle = (HANDLE)hf;
1106 DWORD dwRead;
1107 BOOL res;
1109 res = ReadFile(handle, memory, cb, &dwRead, NULL);
1110 ok(res, "Failed to ReadFile\n");
1112 return dwRead;
1115 static UINT fci_write(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
1117 HANDLE handle = (HANDLE)hf;
1118 DWORD dwWritten;
1119 BOOL res;
1121 res = WriteFile(handle, memory, cb, &dwWritten, NULL);
1122 ok(res, "Failed to WriteFile\n");
1124 return dwWritten;
1127 static int fci_close(INT_PTR hf, int *err, void *pv)
1129 HANDLE handle = (HANDLE)hf;
1130 ok(CloseHandle(handle), "Failed to CloseHandle\n");
1132 return 0;
1135 static long fci_seek(INT_PTR hf, long dist, int seektype, int *err, void *pv)
1137 HANDLE handle = (HANDLE)hf;
1138 DWORD ret;
1140 ret = SetFilePointer(handle, dist, NULL, seektype);
1141 ok(ret != INVALID_SET_FILE_POINTER, "Failed to SetFilePointer\n");
1143 return ret;
1146 static int fci_delete(char *pszFile, int *err, void *pv)
1148 BOOL ret = DeleteFileA(pszFile);
1149 ok(ret, "Failed to DeleteFile %s\n", pszFile);
1151 return 0;
1154 static void init_functionpointers(void)
1156 HMODULE hmsi = GetModuleHandleA("msi.dll");
1158 #define GET_PROC(func) \
1159 p ## func = (void*)GetProcAddress(hmsi, #func); \
1160 if(!p ## func) \
1161 trace("GetProcAddress(%s) failed\n", #func);
1163 GET_PROC(MsiQueryComponentStateA);
1164 GET_PROC(MsiSourceListEnumSourcesA);
1165 GET_PROC(MsiSourceListGetInfoA);
1167 #undef GET_PROC
1170 static BOOL check_record(MSIHANDLE rec, UINT field, LPCSTR val)
1172 CHAR buffer[0x20];
1173 UINT r;
1174 DWORD sz;
1176 sz = sizeof buffer;
1177 r = MsiRecordGetString(rec, field, buffer, &sz);
1178 return (r == ERROR_SUCCESS ) && !strcmp(val, buffer);
1181 static BOOL get_temp_file(char *pszTempName, int cbTempName, void *pv)
1183 LPSTR tempname;
1185 tempname = HeapAlloc(GetProcessHeap(), 0, MAX_PATH);
1186 GetTempFileNameA(".", "xx", 0, tempname);
1188 if (tempname && (strlen(tempname) < (unsigned)cbTempName))
1190 lstrcpyA(pszTempName, tempname);
1191 HeapFree(GetProcessHeap(), 0, tempname);
1192 return TRUE;
1195 HeapFree(GetProcessHeap(), 0, tempname);
1197 return FALSE;
1200 static INT_PTR get_open_info(char *pszName, USHORT *pdate, USHORT *ptime,
1201 USHORT *pattribs, int *err, void *pv)
1203 BY_HANDLE_FILE_INFORMATION finfo;
1204 FILETIME filetime;
1205 HANDLE handle;
1206 DWORD attrs;
1207 BOOL res;
1209 handle = CreateFile(pszName, GENERIC_READ, FILE_SHARE_READ, NULL,
1210 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
1212 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszName);
1214 res = GetFileInformationByHandle(handle, &finfo);
1215 ok(res, "Expected GetFileInformationByHandle to succeed\n");
1217 FileTimeToLocalFileTime(&finfo.ftLastWriteTime, &filetime);
1218 FileTimeToDosDateTime(&filetime, pdate, ptime);
1220 attrs = GetFileAttributes(pszName);
1221 ok(attrs != INVALID_FILE_ATTRIBUTES, "Failed to GetFileAttributes\n");
1223 return (INT_PTR)handle;
1226 static BOOL add_file(HFCI hfci, const char *file, TCOMP compress)
1228 char path[MAX_PATH];
1229 char filename[MAX_PATH];
1231 lstrcpyA(path, CURR_DIR);
1232 lstrcatA(path, "\\");
1233 lstrcatA(path, file);
1235 lstrcpyA(filename, file);
1237 return FCIAddFile(hfci, path, filename, FALSE, get_next_cabinet,
1238 progress, get_open_info, compress);
1241 static void set_cab_parameters(PCCAB pCabParams, const CHAR *name, DWORD max_size)
1243 ZeroMemory(pCabParams, sizeof(CCAB));
1245 pCabParams->cb = max_size;
1246 pCabParams->cbFolderThresh = FOLDER_THRESHOLD;
1247 pCabParams->setID = 0xbeef;
1248 pCabParams->iCab = 1;
1249 lstrcpyA(pCabParams->szCabPath, CURR_DIR);
1250 lstrcatA(pCabParams->szCabPath, "\\");
1251 lstrcpyA(pCabParams->szCab, name);
1254 static void create_cab_file(const CHAR *name, DWORD max_size, const CHAR *files)
1256 CCAB cabParams;
1257 LPCSTR ptr;
1258 HFCI hfci;
1259 ERF erf;
1260 BOOL res;
1262 set_cab_parameters(&cabParams, name, max_size);
1264 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open,
1265 fci_read, fci_write, fci_close, fci_seek, fci_delete,
1266 get_temp_file, &cabParams, NULL);
1268 ok(hfci != NULL, "Failed to create an FCI context\n");
1270 ptr = files;
1271 while (*ptr)
1273 res = add_file(hfci, ptr, tcompTYPE_MSZIP);
1274 ok(res, "Failed to add file: %s\n", ptr);
1275 ptr += lstrlen(ptr) + 1;
1278 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress);
1279 ok(res, "Failed to flush the cabinet\n");
1281 res = FCIDestroy(hfci);
1282 ok(res, "Failed to destroy the cabinet\n");
1285 static BOOL get_program_files_dir(LPSTR buf, LPSTR buf2)
1287 HKEY hkey;
1288 DWORD type, size;
1290 if (RegOpenKey(HKEY_LOCAL_MACHINE,
1291 "Software\\Microsoft\\Windows\\CurrentVersion", &hkey))
1292 return FALSE;
1294 size = MAX_PATH;
1295 if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)buf, &size)) {
1296 RegCloseKey(hkey);
1297 return FALSE;
1300 size = MAX_PATH;
1301 if (RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)buf2, &size)) {
1302 RegCloseKey(hkey);
1303 return FALSE;
1306 RegCloseKey(hkey);
1307 return TRUE;
1310 static void create_file_data(LPCSTR name, LPCSTR data, DWORD size)
1312 HANDLE file;
1313 DWORD written;
1315 file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
1316 ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name);
1317 WriteFile(file, data, strlen(data), &written, NULL);
1319 if (size)
1321 SetFilePointer(file, size, NULL, FILE_BEGIN);
1322 SetEndOfFile(file);
1325 CloseHandle(file);
1328 #define create_file(name, size) create_file_data(name, name, size)
1330 static void create_test_files(void)
1332 CreateDirectoryA("msitest", NULL);
1333 create_file("msitest\\one.txt", 100);
1334 CreateDirectoryA("msitest\\first", NULL);
1335 create_file("msitest\\first\\two.txt", 100);
1336 CreateDirectoryA("msitest\\second", NULL);
1337 create_file("msitest\\second\\three.txt", 100);
1339 create_file("four.txt", 100);
1340 create_file("five.txt", 100);
1341 create_cab_file("msitest.cab", MEDIA_SIZE, "four.txt\0five.txt\0");
1343 create_file("msitest\\filename", 100);
1344 create_file("msitest\\service.exe", 100);
1346 DeleteFileA("four.txt");
1347 DeleteFileA("five.txt");
1350 static BOOL delete_pf(const CHAR *rel_path, BOOL is_file)
1352 CHAR path[MAX_PATH];
1354 lstrcpyA(path, PROG_FILES_DIR);
1355 lstrcatA(path, "\\");
1356 lstrcatA(path, rel_path);
1358 if (is_file)
1359 return DeleteFileA(path);
1360 else
1361 return RemoveDirectoryA(path);
1364 static BOOL delete_cf(const CHAR *rel_path, BOOL is_file)
1366 CHAR path[MAX_PATH];
1368 lstrcpyA(path, COMMON_FILES_DIR);
1369 lstrcatA(path, "\\");
1370 lstrcatA(path, rel_path);
1372 if (is_file)
1373 return DeleteFileA(path);
1374 else
1375 return RemoveDirectoryA(path);
1378 static void delete_test_files(void)
1380 DeleteFileA("msitest.msi");
1381 DeleteFileA("msitest.cab");
1382 DeleteFileA("msitest\\second\\three.txt");
1383 DeleteFileA("msitest\\first\\two.txt");
1384 DeleteFileA("msitest\\one.txt");
1385 DeleteFileA("msitest\\service.exe");
1386 DeleteFileA("msitest\\filename");
1387 RemoveDirectoryA("msitest\\second");
1388 RemoveDirectoryA("msitest\\first");
1389 RemoveDirectoryA("msitest");
1392 static void write_file(const CHAR *filename, const char *data, int data_size)
1394 DWORD size;
1396 HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL,
1397 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
1399 WriteFile(hf, data, data_size, &size, NULL);
1400 CloseHandle(hf);
1403 static void write_msi_summary_info(MSIHANDLE db)
1405 MSIHANDLE summary;
1406 UINT r;
1408 r = MsiGetSummaryInformationA(db, NULL, 5, &summary);
1409 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1411 r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, ";1033");
1412 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1414 r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL,
1415 "{004757CA-5092-49c2-AD20-28E1CE0DF5F2}");
1416 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1418 r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, 100, NULL, NULL);
1419 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1421 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, 0, NULL, NULL);
1422 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1424 r = MsiSummaryInfoSetPropertyA(summary, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
1425 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1427 /* write the summary changes back to the stream */
1428 r = MsiSummaryInfoPersist(summary);
1429 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1431 MsiCloseHandle(summary);
1434 static void create_database(const CHAR *name, const msi_table *tables, int num_tables)
1436 MSIHANDLE db;
1437 UINT r;
1438 int j;
1440 r = MsiOpenDatabaseA(name, MSIDBOPEN_CREATE, &db);
1441 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1443 /* import the tables into the database */
1444 for (j = 0; j < num_tables; j++)
1446 const msi_table *table = &tables[j];
1448 write_file(table->filename, table->data, (table->size - 1) * sizeof(char));
1450 r = MsiDatabaseImportA(db, CURR_DIR, table->filename);
1451 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1453 DeleteFileA(table->filename);
1456 write_msi_summary_info(db);
1458 r = MsiDatabaseCommit(db);
1459 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1461 MsiCloseHandle(db);
1464 static void check_service_is_installed(void)
1466 SC_HANDLE scm, service;
1467 BOOL res;
1469 scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
1470 ok(scm != NULL, "Failed to open the SC Manager\n");
1472 service = OpenService(scm, "TestService", SC_MANAGER_ALL_ACCESS);
1473 ok(service != NULL, "Failed to open TestService\n");
1475 res = DeleteService(service);
1476 ok(res, "Failed to delete TestService\n");
1478 CloseServiceHandle(service);
1479 CloseServiceHandle(scm);
1482 static void test_MsiInstallProduct(void)
1484 UINT r;
1485 CHAR path[MAX_PATH];
1486 LONG res;
1487 HKEY hkey;
1488 DWORD num, size, type;
1489 SC_HANDLE scm;
1491 scm = OpenSCManager(NULL, NULL, GENERIC_ALL);
1492 if (!scm && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED))
1494 skip("Services are not implemented, we are most likely on win9x\n");
1495 return;
1497 CloseServiceHandle(scm);
1499 create_test_files();
1500 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
1502 r = MsiInstallProductA(msifile, NULL);
1503 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1505 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
1506 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
1507 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
1508 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
1509 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
1510 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
1511 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
1512 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
1513 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
1514 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
1515 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
1516 ok(delete_pf("msitest", FALSE), "File not installed\n");
1518 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
1519 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1521 size = MAX_PATH;
1522 type = REG_SZ;
1523 res = RegQueryValueExA(hkey, "Name", NULL, &type, (LPBYTE)path, &size);
1524 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1525 ok(!lstrcmpA(path, "imaname"), "Expected imaname, got %s\n", path);
1527 size = MAX_PATH;
1528 type = REG_SZ;
1529 res = RegQueryValueExA(hkey, "blah", NULL, &type, (LPBYTE)path, &size);
1530 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
1532 size = sizeof(num);
1533 type = REG_DWORD;
1534 res = RegQueryValueExA(hkey, "number", NULL, &type, (LPBYTE)&num, &size);
1535 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1536 ok(num == 314, "Expected 314, got %d\n", num);
1538 size = MAX_PATH;
1539 type = REG_SZ;
1540 res = RegQueryValueExA(hkey, "OrderTestName", NULL, &type, (LPBYTE)path, &size);
1541 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1542 ok(!lstrcmpA(path, "OrderTestValue"), "Expected imaname, got %s\n", path);
1544 check_service_is_installed();
1546 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
1548 delete_test_files();
1551 static void test_MsiSetComponentState(void)
1553 INSTALLSTATE installed, action;
1554 MSIHANDLE package;
1555 char path[MAX_PATH];
1556 UINT r;
1558 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
1560 CoInitialize(NULL);
1562 lstrcpy(path, CURR_DIR);
1563 lstrcat(path, "\\");
1564 lstrcat(path, msifile);
1566 r = MsiOpenPackage(path, &package);
1567 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1569 r = MsiDoAction(package, "CostInitialize");
1570 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1572 r = MsiDoAction(package, "FileCost");
1573 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1575 r = MsiDoAction(package, "CostFinalize");
1576 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1578 r = MsiGetComponentState(package, "dangler", &installed, &action);
1579 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1580 ok(installed == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", installed);
1581 ok(action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
1583 r = MsiSetComponentState(package, "dangler", INSTALLSTATE_SOURCE);
1584 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1586 MsiCloseHandle(package);
1587 CoUninitialize();
1589 DeleteFileA(msifile);
1592 static void test_packagecoltypes(void)
1594 MSIHANDLE hdb, view, rec;
1595 char path[MAX_PATH];
1596 LPCSTR query;
1597 UINT r, count;
1599 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
1601 CoInitialize(NULL);
1603 lstrcpy(path, CURR_DIR);
1604 lstrcat(path, "\\");
1605 lstrcat(path, msifile);
1607 r = MsiOpenDatabase(path, MSIDBOPEN_READONLY, &hdb);
1608 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1610 query = "SELECT * FROM `Media`";
1611 r = MsiDatabaseOpenView( hdb, query, &view );
1612 ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
1614 r = MsiViewGetColumnInfo( view, MSICOLINFO_NAMES, &rec );
1615 count = MsiRecordGetFieldCount( rec );
1616 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n");
1617 ok(count == 6, "Expected 6, got %d\n", count);
1618 ok(check_record(rec, 1, "DiskId"), "wrong column label\n");
1619 ok(check_record(rec, 2, "LastSequence"), "wrong column label\n");
1620 ok(check_record(rec, 3, "DiskPrompt"), "wrong column label\n");
1621 ok(check_record(rec, 4, "Cabinet"), "wrong column label\n");
1622 ok(check_record(rec, 5, "VolumeLabel"), "wrong column label\n");
1623 ok(check_record(rec, 6, "Source"), "wrong column label\n");
1624 MsiCloseHandle(rec);
1626 r = MsiViewGetColumnInfo( view, MSICOLINFO_TYPES, &rec );
1627 count = MsiRecordGetFieldCount( rec );
1628 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n");
1629 ok(count == 6, "Expected 6, got %d\n", count);
1630 ok(check_record(rec, 1, "i2"), "wrong column label\n");
1631 ok(check_record(rec, 2, "i4"), "wrong column label\n");
1632 ok(check_record(rec, 3, "L64"), "wrong column label\n");
1633 ok(check_record(rec, 4, "S255"), "wrong column label\n");
1634 ok(check_record(rec, 5, "S32"), "wrong column label\n");
1635 ok(check_record(rec, 6, "S72"), "wrong column label\n");
1637 MsiCloseHandle(rec);
1638 MsiCloseHandle(view);
1639 MsiCloseHandle(hdb);
1640 DeleteFile(msifile);
1643 static void create_cc_test_files(void)
1645 CCAB cabParams;
1646 HFCI hfci;
1647 ERF erf;
1648 static CHAR cab_context[] = "test%d.cab";
1649 BOOL res;
1651 create_file("maximus", 500);
1652 create_file("augustus", 50000);
1653 create_file("tiberius", 500);
1654 create_file("caesar", 500);
1656 set_cab_parameters(&cabParams, "test1.cab", 40000);
1658 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open,
1659 fci_read, fci_write, fci_close, fci_seek, fci_delete,
1660 get_temp_file, &cabParams, cab_context);
1661 ok(hfci != NULL, "Failed to create an FCI context\n");
1663 res = add_file(hfci, "maximus", tcompTYPE_NONE);
1664 ok(res, "Failed to add file maximus\n");
1666 res = add_file(hfci, "augustus", tcompTYPE_NONE);
1667 ok(res, "Failed to add file augustus\n");
1669 res = add_file(hfci, "tiberius", tcompTYPE_NONE);
1670 ok(res, "Failed to add file tiberius\n");
1672 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress);
1673 ok(res, "Failed to flush the cabinet\n");
1675 res = FCIDestroy(hfci);
1676 ok(res, "Failed to destroy the cabinet\n");
1678 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
1680 DeleteFile("maximus");
1681 DeleteFile("augustus");
1682 DeleteFile("tiberius");
1683 DeleteFile("caesar");
1686 static void delete_cab_files(void)
1688 SHFILEOPSTRUCT shfl;
1689 CHAR path[MAX_PATH+10];
1691 lstrcpyA(path, CURR_DIR);
1692 lstrcatA(path, "\\*.cab");
1693 path[strlen(path) + 1] = '\0';
1695 shfl.hwnd = NULL;
1696 shfl.wFunc = FO_DELETE;
1697 shfl.pFrom = path;
1698 shfl.pTo = NULL;
1699 shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT;
1701 SHFileOperation(&shfl);
1704 static void test_continuouscabs(void)
1706 UINT r;
1708 create_cc_test_files();
1709 create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table));
1711 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1713 r = MsiInstallProductA(msifile, NULL);
1714 if (r == ERROR_SUCCESS) /* win9x has a problem with this */
1716 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1717 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
1718 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1719 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1720 ok(delete_pf("msitest", FALSE), "File not installed\n");
1723 delete_cab_files();
1724 DeleteFile(msifile);
1726 create_cc_test_files();
1727 create_database(msifile, cc2_tables, sizeof(cc2_tables) / sizeof(msi_table));
1729 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1731 r = MsiInstallProductA(msifile, NULL);
1732 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1733 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1734 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
1735 ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n");
1736 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1737 ok(delete_pf("msitest", FALSE), "File not installed\n");
1739 delete_cab_files();
1740 DeleteFile(msifile);
1743 static void test_caborder(void)
1745 UINT r;
1747 create_file("imperator", 100);
1748 create_file("maximus", 500);
1749 create_file("augustus", 50000);
1750 create_file("caesar", 500);
1752 create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table));
1754 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1756 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
1757 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0");
1758 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
1760 r = MsiInstallProductA(msifile, NULL);
1761 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
1762 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
1763 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
1764 todo_wine
1766 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
1767 ok(!delete_pf("msitest", FALSE), "File is installed\n");
1770 delete_cab_files();
1772 create_cab_file("test1.cab", MEDIA_SIZE, "imperator\0");
1773 create_cab_file("test2.cab", MEDIA_SIZE, "maximus\0augustus\0");
1774 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
1776 r = MsiInstallProductA(msifile, NULL);
1777 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
1778 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
1779 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
1780 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
1781 todo_wine
1783 ok(!delete_pf("msitest", FALSE), "File is installed\n");
1786 delete_cab_files();
1787 DeleteFile(msifile);
1789 create_cc_test_files();
1790 create_database(msifile, co_tables, sizeof(co_tables) / sizeof(msi_table));
1792 r = MsiInstallProductA(msifile, NULL);
1793 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
1794 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
1795 ok(!delete_pf("msitest", FALSE), "File is installed\n");
1796 todo_wine
1798 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
1799 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
1802 delete_cab_files();
1803 DeleteFile(msifile);
1805 create_cc_test_files();
1806 create_database(msifile, co2_tables, sizeof(co2_tables) / sizeof(msi_table));
1808 r = MsiInstallProductA(msifile, NULL);
1809 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
1810 todo_wine
1812 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
1813 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
1814 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
1815 ok(!delete_pf("msitest", FALSE), "File is installed\n");
1818 delete_cab_files();
1819 DeleteFile("imperator");
1820 DeleteFile("maximus");
1821 DeleteFile("augustus");
1822 DeleteFile("caesar");
1823 DeleteFile(msifile);
1826 static void test_mixedmedia(void)
1828 UINT r;
1830 CreateDirectoryA("msitest", NULL);
1831 create_file("msitest\\maximus", 500);
1832 create_file("msitest\\augustus", 500);
1833 create_file("caesar", 500);
1835 create_database(msifile, mm_tables, sizeof(mm_tables) / sizeof(msi_table));
1837 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1839 create_cab_file("test1.cab", MEDIA_SIZE, "caesar\0");
1841 r = MsiInstallProductA(msifile, NULL);
1842 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1843 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
1844 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1845 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1846 ok(delete_pf("msitest", FALSE), "File not installed\n");
1848 /* Delete the files in the temp (current) folder */
1849 DeleteFile("msitest\\maximus");
1850 DeleteFile("msitest\\augustus");
1851 RemoveDirectory("msitest");
1852 DeleteFile("caesar");
1853 DeleteFile("test1.cab");
1854 DeleteFile(msifile);
1857 static void test_samesequence(void)
1859 UINT r;
1861 create_cc_test_files();
1862 create_database(msifile, ss_tables, sizeof(ss_tables) / sizeof(msi_table));
1864 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1866 r = MsiInstallProductA(msifile, NULL);
1867 if (r == ERROR_SUCCESS) /* win9x has a problem with this */
1869 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1870 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
1871 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1872 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1873 ok(delete_pf("msitest", FALSE), "File not installed\n");
1876 delete_cab_files();
1877 DeleteFile(msifile);
1880 static void test_uiLevelFlags(void)
1882 UINT r;
1884 create_cc_test_files();
1885 create_database(msifile, ui_tables, sizeof(ui_tables) / sizeof(msi_table));
1887 MsiSetInternalUI(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY, NULL);
1889 r = MsiInstallProductA(msifile, NULL);
1890 if (r == ERROR_SUCCESS) /* win9x has a problem with this */
1892 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1893 ok(!delete_pf("msitest\\maximus", TRUE), "UI install occurred, but execute-only was requested.\n");
1894 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1895 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
1896 ok(delete_pf("msitest", FALSE), "File not installed\n");
1899 delete_cab_files();
1900 DeleteFile(msifile);
1903 static BOOL file_matches(LPSTR path)
1905 CHAR buf[MAX_PATH];
1906 HANDLE file;
1907 DWORD size;
1909 file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
1910 NULL, OPEN_EXISTING, 0, NULL);
1912 ZeroMemory(buf, MAX_PATH);
1913 ReadFile(file, buf, 15, &size, NULL);
1914 CloseHandle(file);
1916 return !lstrcmp(buf, "msitest\\maximus");
1919 static void test_readonlyfile(void)
1921 UINT r;
1922 DWORD size;
1923 HANDLE file;
1924 CHAR path[MAX_PATH];
1926 CreateDirectoryA("msitest", NULL);
1927 create_file("msitest\\maximus", 500);
1928 create_database(msifile, rof_tables, sizeof(rof_tables) / sizeof(msi_table));
1930 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1932 lstrcpy(path, PROG_FILES_DIR);
1933 lstrcat(path, "\\msitest");
1934 CreateDirectory(path, NULL);
1936 lstrcat(path, "\\maximus");
1937 file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
1938 NULL, CREATE_NEW, FILE_ATTRIBUTE_READONLY, NULL);
1940 WriteFile(file, "readonlyfile", 20, &size, NULL);
1941 CloseHandle(file);
1943 r = MsiInstallProductA(msifile, NULL);
1944 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1945 ok(file_matches(path), "Expected file to be overwritten\n");
1946 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1947 ok(delete_pf("msitest", FALSE), "File not installed\n");
1949 /* Delete the files in the temp (current) folder */
1950 DeleteFile("msitest\\maximus");
1951 RemoveDirectory("msitest");
1952 DeleteFile(msifile);
1955 static void test_setdirproperty(void)
1957 UINT r;
1959 CreateDirectoryA("msitest", NULL);
1960 create_file("msitest\\maximus", 500);
1961 create_database(msifile, sdp_tables, sizeof(sdp_tables) / sizeof(msi_table));
1963 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1965 r = MsiInstallProductA(msifile, NULL);
1966 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1967 ok(delete_cf("msitest\\maximus", TRUE), "File not installed\n");
1968 ok(delete_cf("msitest", FALSE), "File not installed\n");
1970 /* Delete the files in the temp (current) folder */
1971 DeleteFile(msifile);
1972 DeleteFile("msitest\\maximus");
1973 RemoveDirectory("msitest");
1976 static void test_cabisextracted(void)
1978 UINT r;
1980 CreateDirectoryA("msitest", NULL);
1981 create_file("msitest\\gaius", 500);
1982 create_file("maximus", 500);
1983 create_file("augustus", 500);
1984 create_file("caesar", 500);
1986 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
1987 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0");
1988 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
1990 create_database(msifile, cie_tables, sizeof(cie_tables) / sizeof(msi_table));
1992 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1994 r = MsiInstallProductA(msifile, NULL);
1995 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1996 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1997 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
1998 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1999 ok(delete_pf("msitest\\gaius", TRUE), "File not installed\n");
2000 ok(delete_pf("msitest", FALSE), "File not installed\n");
2002 /* Delete the files in the temp (current) folder */
2003 delete_cab_files();
2004 DeleteFile(msifile);
2005 DeleteFile("maximus");
2006 DeleteFile("augustus");
2007 DeleteFile("caesar");
2008 DeleteFile("msitest\\gaius");
2009 RemoveDirectory("msitest");
2012 static void test_concurrentinstall(void)
2014 UINT r;
2015 CHAR path[MAX_PATH];
2017 CreateDirectoryA("msitest", NULL);
2018 CreateDirectoryA("msitest\\msitest", NULL);
2019 create_file("msitest\\maximus", 500);
2020 create_file("msitest\\msitest\\augustus", 500);
2022 create_database(msifile, ci_tables, sizeof(ci_tables) / sizeof(msi_table));
2024 lstrcpyA(path, CURR_DIR);
2025 lstrcatA(path, "\\msitest\\concurrent.msi");
2026 create_database(path, ci2_tables, sizeof(ci2_tables) / sizeof(msi_table));
2028 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2030 r = MsiInstallProductA(msifile, NULL);
2031 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2032 if (!delete_pf("msitest\\augustus", TRUE))
2033 trace("concurrent installs not supported\n");
2034 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2035 ok(delete_pf("msitest", FALSE), "File not installed\n");
2037 DeleteFile(path);
2039 r = MsiInstallProductA(msifile, NULL);
2040 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2041 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2042 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
2043 ok(delete_pf("msitest", FALSE), "File not installed\n");
2045 DeleteFile(msifile);
2046 DeleteFile("msitest\\msitest\\augustus");
2047 DeleteFile("msitest\\maximus");
2048 RemoveDirectory("msitest\\msitest");
2049 RemoveDirectory("msitest");
2052 static void test_setpropertyfolder(void)
2054 UINT r;
2055 CHAR path[MAX_PATH];
2057 lstrcpyA(path, PROG_FILES_DIR);
2058 lstrcatA(path, "\\msitest\\added");
2060 CreateDirectoryA("msitest", NULL);
2061 create_file("msitest\\maximus", 500);
2063 create_database(msifile, spf_tables, sizeof(spf_tables) / sizeof(msi_table));
2065 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2067 r = MsiInstallProductA(msifile, NULL);
2068 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2069 if (GetFileAttributesA(path) == FILE_ATTRIBUTE_DIRECTORY)
2071 ok(delete_pf("msitest\\added\\maximus", TRUE), "File not installed\n");
2072 ok(delete_pf("msitest\\added", FALSE), "File not installed\n");
2073 ok(delete_pf("msitest", FALSE), "File not installed\n");
2075 else
2077 trace("changing folder property not supported\n");
2078 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2079 ok(delete_pf("msitest", FALSE), "File not installed\n");
2082 /* Delete the files in the temp (current) folder */
2083 DeleteFile(msifile);
2084 DeleteFile("msitest\\maximus");
2085 RemoveDirectory("msitest");
2088 static BOOL file_exists(LPCSTR file)
2090 return GetFileAttributes(file) != INVALID_FILE_ATTRIBUTES;
2093 static BOOL pf_exists(LPCSTR file)
2095 CHAR path[MAX_PATH];
2097 lstrcpyA(path, PROG_FILES_DIR);
2098 lstrcatA(path, "\\");
2099 lstrcatA(path, file);
2101 return file_exists(path);
2104 static void delete_pfmsitest_files(void)
2106 SHFILEOPSTRUCT shfl;
2107 CHAR path[MAX_PATH+11];
2109 lstrcpyA(path, PROG_FILES_DIR);
2110 lstrcatA(path, "\\msitest\\*");
2111 path[strlen(path) + 1] = '\0';
2113 shfl.hwnd = NULL;
2114 shfl.wFunc = FO_DELETE;
2115 shfl.pFrom = path;
2116 shfl.pTo = NULL;
2117 shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT;
2119 SHFileOperation(&shfl);
2121 lstrcpyA(path, PROG_FILES_DIR);
2122 lstrcatA(path, "\\msitest");
2123 RemoveDirectoryA(path);
2126 static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase, DWORD line)
2128 char val[MAX_PATH];
2129 DWORD size, type;
2130 LONG res;
2132 size = MAX_PATH;
2133 val[0] = '\0';
2134 res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)val, &size);
2136 if (res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ))
2138 ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
2139 return;
2142 if (!expected)
2143 ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val);
2144 else
2146 if (bcase)
2147 ok_(__FILE__, line)(!lstrcmpA(val, expected), "Expected %s, got %s\n", expected, val);
2148 else
2149 ok_(__FILE__, line)(!lstrcmpiA(val, expected), "Expected %s, got %s\n", expected, val);
2153 static void check_reg_dword(HKEY prodkey, LPCSTR name, DWORD expected, DWORD line)
2155 DWORD val, size, type;
2156 LONG res;
2158 size = sizeof(DWORD);
2159 res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size);
2161 if (res != ERROR_SUCCESS || type != REG_DWORD)
2163 ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
2164 return;
2167 ok_(__FILE__, line)(val == expected, "Expected %d, got %d\n", expected, val);
2170 #define CHECK_REG_STR(prodkey, name, expected) \
2171 check_reg_str(prodkey, name, expected, TRUE, __LINE__);
2173 #define CHECK_REG_ISTR(prodkey, name, expected) \
2174 check_reg_str(prodkey, name, expected, FALSE, __LINE__);
2176 #define CHECK_REG_DWORD(prodkey, name, expected) \
2177 check_reg_dword(prodkey, name, expected, __LINE__);
2179 static void get_date_str(LPSTR date)
2181 SYSTEMTIME systime;
2183 static const char date_fmt[] = "%d%02d%02d";
2184 GetLocalTime(&systime);
2185 sprintf(date, date_fmt, systime.wYear, systime.wMonth, systime.wDay);
2188 static void test_publish_registerproduct(void)
2190 UINT r;
2191 LONG res;
2192 HKEY uninstall, prodkey;
2193 INSTALLSTATE state;
2194 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2195 char date[MAX_PATH];
2196 char temp[MAX_PATH];
2198 static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2200 if (!pMsiQueryComponentStateA)
2202 skip("MsiQueryComponentStateA is not available\n");
2203 return;
2206 get_date_str(date);
2207 GetTempPath(MAX_PATH, temp);
2209 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &uninstall);
2210 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2212 CreateDirectoryA("msitest", NULL);
2213 create_file("msitest\\maximus", 500);
2215 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2217 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2219 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2220 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2222 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2223 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2225 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2226 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2228 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2229 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2230 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2231 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2233 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2234 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2236 /* RegisterProduct */
2237 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
2238 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2239 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2240 ok(pf_exists("msitest"), "File not installed\n");
2242 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2243 ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
2245 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2246 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2248 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2249 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2251 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2252 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2253 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
2254 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2256 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2257 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2259 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
2260 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
2261 CHECK_REG_STR(prodkey, "InstallDate", date);
2262 CHECK_REG_STR(prodkey, "InstallSource", temp);
2263 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2264 CHECK_REG_STR(prodkey, "Publisher", "Wine");
2265 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2266 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
2267 CHECK_REG_STR(prodkey, "Comments", NULL);
2268 CHECK_REG_STR(prodkey, "Contact", NULL);
2269 CHECK_REG_STR(prodkey, "HelpLink", NULL);
2270 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
2271 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
2272 CHECK_REG_STR(prodkey, "Readme", NULL);
2273 CHECK_REG_STR(prodkey, "Size", NULL);
2274 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
2275 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
2276 CHECK_REG_DWORD(prodkey, "Language", 1033);
2277 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
2278 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
2279 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
2280 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
2281 todo_wine
2283 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
2286 RegCloseKey(prodkey);
2288 /* try to uninstall after RegisterProduct */
2289 r = MsiInstallProductA(msifile, "REMOVE=ALL");
2290 todo_wine
2292 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2294 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2295 ok(pf_exists("msitest"), "File deleted\n");
2297 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2298 todo_wine
2300 ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
2303 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2304 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2306 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2307 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2309 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2310 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2311 todo_wine
2313 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
2315 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2317 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2318 todo_wine
2320 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2323 todo_wine
2325 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
2326 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
2327 CHECK_REG_STR(prodkey, "InstallDate", date);
2328 CHECK_REG_STR(prodkey, "InstallSource", temp);
2329 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2330 CHECK_REG_STR(prodkey, "Publisher", "Wine");
2331 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2332 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
2333 CHECK_REG_STR(prodkey, "Comments", NULL);
2334 CHECK_REG_STR(prodkey, "Contact", NULL);
2335 CHECK_REG_STR(prodkey, "HelpLink", NULL);
2336 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
2337 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
2338 CHECK_REG_STR(prodkey, "Readme", NULL);
2339 CHECK_REG_STR(prodkey, "Size", NULL);
2340 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
2341 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
2342 CHECK_REG_DWORD(prodkey, "Language", 1033);
2343 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
2344 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
2345 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
2346 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
2347 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
2350 RegCloseKey(prodkey);
2352 /* full install to remove */
2353 r = MsiInstallProductA(msifile, "FULL=1");
2354 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2355 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
2356 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2358 RegCloseKey(uninstall);
2359 DeleteFile(msifile);
2360 DeleteFile("msitest\\maximus");
2361 RemoveDirectory("msitest");
2362 delete_pfmsitest_files();
2365 static void test_publish_publishproduct(void)
2367 UINT r;
2368 LONG res;
2369 HKEY uninstall, prodkey;
2370 INSTALLSTATE state;
2371 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2373 static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2375 if (!pMsiQueryComponentStateA)
2377 skip("MsiQueryComponentStateA is not available\n");
2378 return;
2381 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &uninstall);
2382 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2384 CreateDirectoryA("msitest", NULL);
2385 create_file("msitest\\maximus", 500);
2387 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2389 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2391 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2392 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2394 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2395 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2397 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2398 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2400 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2401 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2402 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2403 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2405 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2406 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2408 /* PublishProduct */
2409 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
2410 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2411 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2412 ok(pf_exists("msitest"), "File not installed\n");
2414 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2415 ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
2417 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2418 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2420 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2421 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2423 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2424 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2425 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
2426 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2428 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2429 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2431 /* try to uninstall after PublishProduct */
2432 r = MsiInstallProductA(msifile, "REMOVE=ALL");
2433 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2434 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2435 ok(pf_exists("msitest"), "File deleted\n");
2437 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2438 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2440 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2441 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2443 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2444 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2446 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2447 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2448 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2449 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2451 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2452 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2454 /* full install to remove */
2455 r = MsiInstallProductA(msifile, "FULL=1");
2456 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2457 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
2458 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2460 RegCloseKey(uninstall);
2461 DeleteFile(msifile);
2462 DeleteFile("msitest\\maximus");
2463 RemoveDirectory("msitest");
2464 delete_pfmsitest_files();
2467 static void test_publish_publishfeatures(void)
2469 UINT r;
2470 LONG res;
2471 HKEY uninstall, prodkey;
2472 INSTALLSTATE state;
2473 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2475 static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2477 if (!pMsiQueryComponentStateA)
2479 skip("MsiQueryComponentStateA is not available\n");
2480 return;
2483 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &uninstall);
2484 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2486 CreateDirectoryA("msitest", NULL);
2487 create_file("msitest\\maximus", 500);
2489 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2491 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2493 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2494 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2496 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2497 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2499 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2500 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2502 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2503 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2504 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2505 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2507 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2508 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2510 /* PublishFeatures */
2511 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1");
2512 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2513 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2514 ok(pf_exists("msitest"), "File not installed\n");
2516 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2517 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2519 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2520 ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
2522 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2523 ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
2525 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2526 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2527 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2528 ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
2530 /* try to uninstall after PublishFeatures */
2531 r = MsiInstallProductA(msifile, "REMOVE=ALL");
2532 todo_wine
2534 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2536 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2537 ok(pf_exists("msitest"), "File deleted\n");
2539 /* PublishFeatures and PublishProduct */
2540 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 PUBLISH_FEATURES=1");
2541 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2542 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2543 ok(pf_exists("msitest"), "File not installed\n");
2545 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2546 ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
2548 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2549 ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
2551 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2552 ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
2554 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2555 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2556 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
2557 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2559 /* PublishFeatures and RegisterProduct */
2560 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 PUBLISH_FEATURES=1");
2561 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2562 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2563 ok(pf_exists("msitest"), "File not installed\n");
2565 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2566 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
2568 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2569 ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
2571 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2572 ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
2574 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2575 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2576 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
2577 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2579 /* full install to remove */
2580 r = MsiInstallProductA(msifile, "FULL=1");
2581 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2582 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
2583 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2585 RegCloseKey(uninstall);
2586 DeleteFile(msifile);
2587 DeleteFile("msitest\\maximus");
2588 RemoveDirectory("msitest");
2589 delete_pfmsitest_files();
2592 static void test_publish_registeruser(void)
2594 UINT r;
2595 LONG res;
2596 HKEY uninstall, prodkey;
2597 INSTALLSTATE state;
2598 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2600 static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2602 if (!pMsiQueryComponentStateA)
2604 skip("MsiQueryComponentStateA is not available\n");
2605 return;
2608 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &uninstall);
2609 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2611 CreateDirectoryA("msitest", NULL);
2612 create_file("msitest\\maximus", 500);
2614 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2616 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2618 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2619 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2621 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2622 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2624 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2625 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2627 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2628 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2629 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2630 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2632 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2633 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2635 /* RegisterUser */
2636 r = MsiInstallProductA(msifile, "REGISTER_USER=1");
2637 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2638 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2639 ok(pf_exists("msitest"), "File not installed\n");
2641 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2642 todo_wine
2644 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2647 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2648 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2650 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2651 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2653 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2654 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2655 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2656 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2658 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2659 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2661 /* try to uninstall after RegisterUser */
2662 r = MsiInstallProductA(msifile, "REMOVE=ALL");
2663 todo_wine
2665 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2667 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2668 ok(pf_exists("msitest"), "File deleted\n");
2670 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2671 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2673 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2674 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2676 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2677 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2679 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2680 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2681 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2682 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2684 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2685 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2687 /* full install to remove */
2688 r = MsiInstallProductA(msifile, "FULL=1");
2689 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2690 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
2691 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2693 RegCloseKey(uninstall);
2694 DeleteFile(msifile);
2695 DeleteFile("msitest\\maximus");
2696 RemoveDirectory("msitest");
2697 delete_pfmsitest_files();
2700 static void get_user_sid(LPSTR *usersid)
2702 HANDLE token;
2703 BYTE buf[1024];
2704 DWORD size;
2705 PTOKEN_USER user;
2706 HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
2707 static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
2709 *usersid = NULL;
2710 pConvertSidToStringSidA = (void *)GetProcAddress(hadvapi32, "ConvertSidToStringSidA");
2711 if (!pConvertSidToStringSidA)
2712 return;
2714 OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
2715 size = sizeof(buf);
2716 GetTokenInformation(token, TokenUser, (void *)buf, size, &size);
2717 user = (PTOKEN_USER)buf;
2718 pConvertSidToStringSidA(user->User.Sid, usersid);
2721 static void test_publish_processcomponents(void)
2723 UINT r;
2724 LONG res;
2725 DWORD size;
2726 HKEY comp, hkey;
2727 LPSTR usersid;
2728 CHAR val[MAX_PATH];
2729 CHAR keypath[MAX_PATH];
2731 static const CHAR keyfmt[] =
2732 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
2733 "UserData\\%s\\Components\\CBABC2FDCCB35E749A8944D8C1C098B5";
2734 static const CHAR compkey[] =
2735 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Components";
2737 get_user_sid(&usersid);
2738 if (!usersid)
2740 skip("ConvertSidToStringSidA is not available\n");
2741 return;
2744 CreateDirectoryA("msitest", NULL);
2745 create_file("msitest\\maximus", 500);
2747 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2749 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2751 /* ProcessComponents, per-user */
2752 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1");
2753 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2754 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2755 ok(delete_pf("msitest", FALSE), "File not installed\n");
2757 sprintf(keypath, keyfmt, usersid);
2759 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp);
2760 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2762 size = MAX_PATH;
2763 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
2764 NULL, NULL, (LPBYTE)val, &size);
2765 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2766 ok(!lstrcmpA(val, "C:\\Program Files\\msitest\\maximus"),
2767 "Expected \"%s\", got \"%s\"\n", "C:\\Program Files\\msitest\\maximus", val);
2769 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey);
2770 todo_wine
2772 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2775 if (res == ERROR_SUCCESS)
2776 RegCloseKey(hkey);
2778 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
2779 RegDeleteKeyA(comp, "");
2780 RegCloseKey(comp);
2782 DeleteFile(msifile);
2783 DeleteFile("msitest\\maximus");
2784 RemoveDirectory("msitest");
2787 static void test_publish(void)
2789 UINT r;
2790 LONG res;
2791 HKEY uninstall, prodkey;
2792 INSTALLSTATE state;
2793 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2794 char date[MAX_PATH];
2795 char temp[MAX_PATH];
2797 static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2799 if (!pMsiQueryComponentStateA)
2801 skip("MsiQueryComponentStateA is not available\n");
2802 return;
2805 get_date_str(date);
2806 GetTempPath(MAX_PATH, temp);
2808 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &uninstall);
2809 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2811 CreateDirectoryA("msitest", NULL);
2812 create_file("msitest\\maximus", 500);
2814 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2816 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2818 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2819 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2821 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2822 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2824 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2825 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2827 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2828 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2829 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2830 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2832 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2833 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2835 /* nothing published */
2836 r = MsiInstallProductA(msifile, NULL);
2837 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2838 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2839 ok(pf_exists("msitest"), "File not installed\n");
2841 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2842 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2844 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2845 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2847 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2848 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2850 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2851 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2852 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2853 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2855 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2856 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2858 /* PublishProduct and RegisterProduct */
2859 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 PUBLISH_PRODUCT=1");
2860 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2861 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2862 ok(pf_exists("msitest"), "File not installed\n");
2864 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2865 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
2867 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2868 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2870 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2871 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2873 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2874 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2875 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
2876 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2878 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2879 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2881 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
2882 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
2883 CHECK_REG_STR(prodkey, "InstallDate", date);
2884 CHECK_REG_STR(prodkey, "InstallSource", temp);
2885 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2886 CHECK_REG_STR(prodkey, "Publisher", "Wine");
2887 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2888 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
2889 CHECK_REG_STR(prodkey, "Comments", NULL);
2890 CHECK_REG_STR(prodkey, "Contact", NULL);
2891 CHECK_REG_STR(prodkey, "HelpLink", NULL);
2892 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
2893 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
2894 CHECK_REG_STR(prodkey, "Readme", NULL);
2895 CHECK_REG_STR(prodkey, "Size", NULL);
2896 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
2897 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
2898 CHECK_REG_DWORD(prodkey, "Language", 1033);
2899 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
2900 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
2901 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
2902 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
2903 todo_wine
2905 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
2908 RegCloseKey(prodkey);
2910 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
2911 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2912 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2913 ok(pf_exists("msitest"), "File deleted\n");
2915 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2916 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2918 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2919 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2921 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2922 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2924 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2925 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2926 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2927 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2929 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2930 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2932 /* complete install */
2933 r = MsiInstallProductA(msifile, "FULL=1");
2934 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2935 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2936 ok(pf_exists("msitest"), "File not installed\n");
2938 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2939 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
2941 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2942 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
2944 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2945 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
2947 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2948 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2949 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2950 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
2952 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2953 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2955 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
2956 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
2957 CHECK_REG_STR(prodkey, "InstallDate", date);
2958 CHECK_REG_STR(prodkey, "InstallSource", temp);
2959 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2960 CHECK_REG_STR(prodkey, "Publisher", "Wine");
2961 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2962 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
2963 CHECK_REG_STR(prodkey, "Comments", NULL);
2964 CHECK_REG_STR(prodkey, "Contact", NULL);
2965 CHECK_REG_STR(prodkey, "HelpLink", NULL);
2966 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
2967 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
2968 CHECK_REG_STR(prodkey, "Readme", NULL);
2969 CHECK_REG_STR(prodkey, "Size", NULL);
2970 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
2971 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
2972 CHECK_REG_DWORD(prodkey, "Language", 1033);
2973 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
2974 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
2975 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
2976 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
2977 todo_wine
2979 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
2982 RegCloseKey(prodkey);
2984 /* no UnpublishFeatures */
2985 r = MsiInstallProductA(msifile, "REMOVE=ALL");
2986 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2987 todo_wine
2989 ok(!pf_exists("msitest\\maximus"), "File deleted\n");
2990 ok(!pf_exists("msitest"), "File deleted\n");
2993 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2994 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2996 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2997 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2999 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3000 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3002 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3003 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3004 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3005 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3007 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3008 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3010 /* complete install */
3011 r = MsiInstallProductA(msifile, "FULL=1");
3012 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3013 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3014 ok(pf_exists("msitest"), "File not installed\n");
3016 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3017 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3019 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3020 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3022 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3023 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3025 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3026 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3027 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3028 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3030 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3031 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3033 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3034 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3035 CHECK_REG_STR(prodkey, "InstallDate", date);
3036 CHECK_REG_STR(prodkey, "InstallSource", temp);
3037 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3038 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3039 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3040 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3041 CHECK_REG_STR(prodkey, "Comments", NULL);
3042 CHECK_REG_STR(prodkey, "Contact", NULL);
3043 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3044 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3045 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3046 CHECK_REG_STR(prodkey, "Readme", NULL);
3047 CHECK_REG_STR(prodkey, "Size", NULL);
3048 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3049 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3050 CHECK_REG_DWORD(prodkey, "Language", 1033);
3051 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3052 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3053 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3054 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3055 todo_wine
3057 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3060 RegCloseKey(prodkey);
3062 /* UnpublishFeatures, only feature removed. Only works when entire product is removed */
3063 r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature");
3064 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3065 ok(pf_exists("msitest\\maximus"), "File deleted\n");
3066 ok(pf_exists("msitest"), "File deleted\n");
3068 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3069 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3071 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3072 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3074 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3075 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3077 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3078 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3079 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3080 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3082 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3083 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3085 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3086 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3087 CHECK_REG_STR(prodkey, "InstallDate", date);
3088 CHECK_REG_STR(prodkey, "InstallSource", temp);
3089 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3090 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3091 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3092 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3093 CHECK_REG_STR(prodkey, "Comments", NULL);
3094 CHECK_REG_STR(prodkey, "Contact", NULL);
3095 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3096 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3097 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3098 CHECK_REG_STR(prodkey, "Readme", NULL);
3099 CHECK_REG_STR(prodkey, "Size", NULL);
3100 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3101 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3102 CHECK_REG_DWORD(prodkey, "Language", 1033);
3103 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3104 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3105 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3106 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3107 todo_wine
3109 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3112 RegCloseKey(prodkey);
3114 /* complete install */
3115 r = MsiInstallProductA(msifile, "FULL=1");
3116 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3117 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3118 ok(pf_exists("msitest"), "File not installed\n");
3120 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3121 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3123 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3124 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3126 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3127 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3129 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3130 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3131 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3132 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3134 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3135 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3137 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3138 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3139 CHECK_REG_STR(prodkey, "InstallDate", date);
3140 CHECK_REG_STR(prodkey, "InstallSource", temp);
3141 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3142 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3143 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3144 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3145 CHECK_REG_STR(prodkey, "Comments", NULL);
3146 CHECK_REG_STR(prodkey, "Contact", NULL);
3147 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3148 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3149 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3150 CHECK_REG_STR(prodkey, "Readme", NULL);
3151 CHECK_REG_STR(prodkey, "Size", NULL);
3152 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3153 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3154 CHECK_REG_DWORD(prodkey, "Language", 1033);
3155 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3156 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3157 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3158 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3159 todo_wine
3161 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3164 RegCloseKey(prodkey);
3166 /* UnpublishFeatures, both features removed */
3167 r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo");
3168 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3169 todo_wine
3171 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3172 ok(!pf_exists("msitest"), "File not deleted\n");
3175 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3176 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3178 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3179 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3181 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3182 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3184 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3185 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3186 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3187 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3189 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3190 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3192 /* complete install */
3193 r = MsiInstallProductA(msifile, "FULL=1");
3194 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3195 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3196 ok(pf_exists("msitest"), "File not installed\n");
3198 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3199 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3201 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3202 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3204 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3205 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3207 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3208 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3209 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3210 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3212 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3213 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3215 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3216 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3217 CHECK_REG_STR(prodkey, "InstallDate", date);
3218 CHECK_REG_STR(prodkey, "InstallSource", temp);
3219 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3220 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3221 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3222 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3223 CHECK_REG_STR(prodkey, "Comments", NULL);
3224 CHECK_REG_STR(prodkey, "Contact", NULL);
3225 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3226 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3227 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3228 CHECK_REG_STR(prodkey, "Readme", NULL);
3229 CHECK_REG_STR(prodkey, "Size", NULL);
3230 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3231 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3232 CHECK_REG_DWORD(prodkey, "Language", 1033);
3233 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3234 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3235 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3236 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3237 todo_wine
3239 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3242 RegCloseKey(prodkey);
3244 /* complete uninstall */
3245 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3246 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3247 todo_wine
3249 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3250 ok(!pf_exists("msitest"), "File not deleted\n");
3253 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3254 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3256 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3257 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3259 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3260 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3262 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3263 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3264 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3265 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3267 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3268 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3270 /* make sure 'Program Files\msitest' is removed */
3271 delete_pfmsitest_files();
3273 RegCloseKey(uninstall);
3274 DeleteFile(msifile);
3275 DeleteFile("msitest\\maximus");
3276 RemoveDirectory("msitest");
3279 static void test_publishsourcelist(void)
3281 UINT r;
3282 DWORD size;
3283 CHAR value[MAX_PATH];
3284 CHAR path[MAX_PATH];
3285 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
3287 if (!pMsiSourceListEnumSourcesA || !pMsiSourceListGetInfoA)
3289 skip("MsiSourceListEnumSourcesA and/or MsiSourceListGetInfoA are not available\n");
3290 return;
3293 CreateDirectoryA("msitest", NULL);
3294 create_file("msitest\\maximus", 500);
3296 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
3298 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
3300 r = MsiInstallProductA(msifile, NULL);
3301 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3302 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3303 ok(pf_exists("msitest"), "File not installed\n");
3305 /* nothing published */
3306 size = 0xdeadbeef;
3307 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3308 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3309 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3310 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3312 size = 0xdeadbeef;
3313 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3314 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3315 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3316 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3318 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
3319 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3320 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3321 ok(pf_exists("msitest"), "File not installed\n");
3323 /* after RegisterProduct */
3324 size = 0xdeadbeef;
3325 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3326 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3327 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3328 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3330 size = 0xdeadbeef;
3331 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3332 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3333 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3334 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3336 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1");
3337 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3338 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3339 ok(pf_exists("msitest"), "File not installed\n");
3341 /* after ProcessComponents */
3342 size = 0xdeadbeef;
3343 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3344 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3345 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3346 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3348 size = 0xdeadbeef;
3349 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3350 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3351 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3352 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3354 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1");
3355 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3356 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3357 ok(pf_exists("msitest"), "File not installed\n");
3359 /* after PublishFeatures */
3360 size = 0xdeadbeef;
3361 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3362 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3363 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3364 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3366 size = 0xdeadbeef;
3367 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3368 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3369 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3370 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3372 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
3373 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3374 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3375 ok(pf_exists("msitest"), "File not installed\n");
3377 /* after PublishProduct */
3378 size = MAX_PATH;
3379 lstrcpyA(value, "aaa");
3380 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3381 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size);
3382 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3383 ok(!lstrcmpA(value, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value);
3384 ok(size == 11, "Expected 11, got %d\n", size);
3386 size = MAX_PATH;
3387 lstrcpyA(value, "aaa");
3388 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3389 MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATH, value, &size);
3390 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3391 ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
3392 ok(size == 0, "Expected 0, got %d\n", size);
3394 size = MAX_PATH;
3395 lstrcpyA(value, "aaa");
3396 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3397 MSICODE_PRODUCT, INSTALLPROPERTY_DISKPROMPT, value, &size);
3398 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3399 ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
3400 ok(size == 0, "Expected 0, got %d\n", size);
3402 lstrcpyA(path, CURR_DIR);
3403 lstrcatA(path, "\\");
3405 size = MAX_PATH;
3406 lstrcpyA(value, "aaa");
3407 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3408 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3409 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3410 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3411 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3413 size = MAX_PATH;
3414 lstrcpyA(value, "aaa");
3415 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3416 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPE, value, &size);
3417 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3418 ok(!lstrcmpA(value, "n"), "Expected \"n\", got \"%s\"\n", value);
3419 ok(size == 1, "Expected 1, got %d\n", size);
3421 size = MAX_PATH;
3422 lstrcpyA(value, "aaa");
3423 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3424 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
3425 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
3426 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
3427 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
3429 size = MAX_PATH;
3430 lstrcpyA(value, "aaa");
3431 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3432 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
3433 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3434 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3435 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3437 size = MAX_PATH;
3438 lstrcpyA(value, "aaa");
3439 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3440 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 1, value, &size);
3441 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
3442 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
3443 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
3445 /* complete uninstall */
3446 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3447 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3448 todo_wine
3450 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3451 ok(!pf_exists("msitest"), "File not deleted\n");
3454 /* make sure 'Program Files\msitest' is removed */
3455 delete_pfmsitest_files();
3457 DeleteFile(msifile);
3458 DeleteFile("msitest\\maximus");
3459 RemoveDirectory("msitest");
3462 static UINT run_query(MSIHANDLE hdb, MSIHANDLE hrec, const char *query)
3464 MSIHANDLE hview = 0;
3465 UINT r;
3467 r = MsiDatabaseOpenView(hdb, query, &hview);
3468 if(r != ERROR_SUCCESS)
3469 return r;
3471 r = MsiViewExecute(hview, hrec);
3472 if(r == ERROR_SUCCESS)
3473 r = MsiViewClose(hview);
3474 MsiCloseHandle(hview);
3475 return r;
3478 static void set_transform_summary_info(void)
3480 UINT r;
3481 MSIHANDLE suminfo = 0;
3483 /* build summary info */
3484 r = MsiGetSummaryInformation(0, mstfile, 3, &suminfo);
3485 todo_wine
3487 ok(r == ERROR_SUCCESS , "Failed to open summaryinfo\n");
3490 r = MsiSummaryInfoSetProperty(suminfo, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
3491 todo_wine
3493 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3496 r = MsiSummaryInfoSetProperty(suminfo, PID_REVNUMBER, VT_LPSTR, 0, NULL,
3497 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3498 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3499 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}");
3500 todo_wine
3502 ok(r == ERROR_SUCCESS , "Failed to set summary info\n");
3505 r = MsiSummaryInfoSetProperty(suminfo, PID_PAGECOUNT, VT_I4, 100, NULL, NULL);
3506 todo_wine
3508 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3511 r = MsiSummaryInfoPersist(suminfo);
3512 todo_wine
3514 ok(r == ERROR_SUCCESS , "Failed to make summary info persist\n");
3517 r = MsiCloseHandle(suminfo);
3518 ok(r == ERROR_SUCCESS , "Failed to close suminfo\n");
3521 static void generate_transform(void)
3523 MSIHANDLE hdb1, hdb2;
3524 LPCSTR query;
3525 UINT r;
3527 /* start with two identical databases */
3528 CopyFile(msifile, msifile2, FALSE);
3530 r = MsiOpenDatabase(msifile2, MSIDBOPEN_TRANSACT, &hdb1);
3531 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3533 r = MsiDatabaseCommit(hdb1);
3534 ok(r == ERROR_SUCCESS , "Failed to commit database\n");
3536 r = MsiOpenDatabase(msifile, MSIDBOPEN_READONLY, &hdb2);
3537 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3539 query = "INSERT INTO `Property` ( `Property`, `Value` ) VALUES ( 'prop', 'val' )";
3540 r = run_query(hdb1, 0, query);
3541 ok(r == ERROR_SUCCESS, "failed to add property\n");
3543 /* database needs to be committed */
3544 MsiDatabaseCommit(hdb1);
3546 r = MsiDatabaseGenerateTransform(hdb1, hdb2, mstfile, 0, 0);
3547 ok(r == ERROR_SUCCESS, "return code %d, should be ERROR_SUCCESS\n", r);
3549 #if 0 /* not implemented in wine yet */
3550 r = MsiCreateTransformSummaryInfo(hdb2, hdb2, mstfile, 0, 0);
3551 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3552 #endif
3554 MsiCloseHandle(hdb1);
3555 MsiCloseHandle(hdb2);
3558 /* data for generating a transform */
3560 /* tables transform names - encoded as they would be in an msi database file */
3561 static const WCHAR name1[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */
3562 static const WCHAR name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */
3563 static const WCHAR name3[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */
3565 /* data in each table */
3566 static const char data1[] = /* _StringData */
3567 "propval"; /* all the strings squashed together */
3569 static const WCHAR data2[] = { /* _StringPool */
3570 /* len, refs */
3571 0, 0, /* string 0 '' */
3572 4, 1, /* string 1 'prop' */
3573 3, 1, /* string 2 'val' */
3576 static const WCHAR data3[] = { /* Property */
3577 0x0201, 0x0001, 0x0002,
3580 static const struct {
3581 LPCWSTR name;
3582 const void *data;
3583 DWORD size;
3584 } table_transform_data[] =
3586 { name1, data1, sizeof data1 - 1 },
3587 { name2, data2, sizeof data2 },
3588 { name3, data3, sizeof data3 },
3591 #define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0])
3593 static void generate_transform_manual(void)
3595 IStorage *stg = NULL;
3596 IStream *stm;
3597 WCHAR name[0x20];
3598 HRESULT r;
3599 DWORD i, count;
3600 const DWORD mode = STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE;
3602 const CLSID CLSID_MsiTransform = { 0xc1082,0,0,{0xc0,0,0,0,0,0,0,0x46}};
3604 MultiByteToWideChar(CP_ACP, 0, mstfile, -1, name, 0x20);
3606 r = StgCreateDocfile(name, mode, 0, &stg);
3607 ok(r == S_OK, "failed to create storage\n");
3608 if (!stg)
3609 return;
3611 r = IStorage_SetClass(stg, &CLSID_MsiTransform);
3612 ok(r == S_OK, "failed to set storage type\n");
3614 for (i=0; i<NUM_TRANSFORM_TABLES; i++)
3616 r = IStorage_CreateStream(stg, table_transform_data[i].name,
3617 STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3618 if (FAILED(r))
3620 ok(0, "failed to create stream %08x\n", r);
3621 continue;
3624 r = IStream_Write(stm, table_transform_data[i].data,
3625 table_transform_data[i].size, &count);
3626 if (FAILED(r) || count != table_transform_data[i].size)
3627 ok(0, "failed to write stream\n");
3628 IStream_Release(stm);
3631 IStorage_Release(stg);
3633 set_transform_summary_info();
3636 static void test_transformprop(void)
3638 UINT r;
3640 CreateDirectoryA("msitest", NULL);
3641 create_file("msitest\\augustus", 500);
3643 create_database(msifile, tp_tables, sizeof(tp_tables) / sizeof(msi_table));
3645 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3647 r = MsiInstallProductA(msifile, NULL);
3648 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3649 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3650 ok(!delete_pf("msitest", FALSE), "File installed\n");
3652 if (0)
3653 generate_transform();
3654 else
3655 generate_transform_manual();
3657 r = MsiInstallProductA(msifile, "TRANSFORMS=winetest.mst");
3658 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3659 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3660 ok(delete_pf("msitest", FALSE), "File not installed\n");
3662 /* Delete the files in the temp (current) folder */
3663 DeleteFile(msifile);
3664 DeleteFile(msifile2);
3665 DeleteFile(mstfile);
3666 DeleteFile("msitest\\augustus");
3667 RemoveDirectory("msitest");
3670 static void test_currentworkingdir(void)
3672 UINT r;
3673 CHAR path[MAX_PATH];
3674 LPSTR ptr, ptr2;
3676 CreateDirectoryA("msitest", NULL);
3677 create_file("msitest\\augustus", 500);
3679 create_database(msifile, cwd_tables, sizeof(cwd_tables) / sizeof(msi_table));
3681 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3683 CreateDirectoryA("diffdir", NULL);
3684 SetCurrentDirectoryA("diffdir");
3686 sprintf(path, "..\\%s", msifile);
3687 r = MsiInstallProductA(path, NULL);
3688 todo_wine
3690 ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
3691 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3692 ok(!delete_pf("msitest", FALSE), "File installed\n");
3695 sprintf(path, "%s\\%s", CURR_DIR, msifile);
3696 r = MsiInstallProductA(path, NULL);
3697 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3698 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3699 ok(delete_pf("msitest", FALSE), "File not installed\n");
3701 lstrcpyA(path, CURR_DIR);
3702 if (path[lstrlenA(path) - 1] != '\\')
3703 lstrcatA(path, "\\");
3704 lstrcatA(path, "msitest.msi");
3706 ptr2 = strrchr(path, '\\');
3707 *ptr2 = '\0';
3708 ptr = strrchr(path, '\\');
3709 *ptr2 = '\\';
3710 *(ptr++) = '\0';
3712 SetCurrentDirectoryA(path);
3714 r = MsiInstallProductA(ptr, NULL);
3715 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3716 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3717 ok(delete_pf("msitest", FALSE), "File not installed\n");
3719 SetCurrentDirectoryA(CURR_DIR);
3721 DeleteFile(msifile);
3722 DeleteFile("msitest\\augustus");
3723 RemoveDirectory("msitest");
3724 RemoveDirectory("diffdir");
3727 static void set_admin_summary_info(const CHAR *name)
3729 MSIHANDLE db, summary;
3730 UINT r;
3732 r = MsiOpenDatabaseA(name, MSIDBOPEN_DIRECT, &db);
3733 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3735 r = MsiGetSummaryInformationA(db, NULL, 1, &summary);
3736 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3738 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, 5, NULL, NULL);
3739 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3741 /* write the summary changes back to the stream */
3742 r = MsiSummaryInfoPersist(summary);
3743 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3745 MsiCloseHandle(summary);
3747 r = MsiDatabaseCommit(db);
3748 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3750 MsiCloseHandle(db);
3753 static void test_admin(void)
3755 UINT r;
3757 CreateDirectoryA("msitest", NULL);
3758 create_file("msitest\\augustus", 500);
3760 create_database(msifile, adm_tables, sizeof(adm_tables) / sizeof(msi_table));
3761 set_admin_summary_info(msifile);
3763 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3765 r = MsiInstallProductA(msifile, NULL);
3766 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3767 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3768 ok(!delete_pf("msitest", FALSE), "File installed\n");
3769 ok(!DeleteFile("c:\\msitest\\augustus"), "File installed\n");
3770 ok(!RemoveDirectory("c:\\msitest"), "File installed\n");
3772 r = MsiInstallProductA(msifile, "ACTION=ADMIN");
3773 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3774 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3775 ok(!delete_pf("msitest", FALSE), "File installed\n");
3776 todo_wine
3778 ok(DeleteFile("c:\\msitest\\augustus"), "File not installed\n");
3779 ok(RemoveDirectory("c:\\msitest"), "File not installed\n");
3782 DeleteFile(msifile);
3783 DeleteFile("msitest\\augustus");
3784 RemoveDirectory("msitest");
3787 static void set_admin_property_stream(LPCSTR file)
3789 IStorage *stg;
3790 IStream *stm;
3791 WCHAR fileW[MAX_PATH];
3792 HRESULT hr;
3793 DWORD count;
3794 const DWORD mode = STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE;
3796 /* AdminProperties */
3797 static const WCHAR stmname[] = {0x41ca,0x4330,0x3e71,0x44b5,0x4233,0x45f5,0x422c,0x4836,0};
3798 static const WCHAR data[] = {'M','Y','P','R','O','P','=','2','7','1','8',0};
3800 MultiByteToWideChar(CP_ACP, 0, file, -1, fileW, MAX_PATH);
3802 hr = StgOpenStorage(fileW, NULL, mode, NULL, 0, &stg);
3803 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3804 if (!stg)
3805 return;
3807 hr = IStorage_CreateStream(stg, stmname, STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3808 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3810 hr = IStream_Write(stm, data, sizeof(data), &count);
3811 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3813 IStream_Release(stm);
3814 IStorage_Release(stg);
3817 static void test_adminprops(void)
3819 UINT r;
3821 CreateDirectoryA("msitest", NULL);
3822 create_file("msitest\\augustus", 500);
3824 create_database(msifile, amp_tables, sizeof(amp_tables) / sizeof(msi_table));
3825 set_admin_summary_info(msifile);
3826 set_admin_property_stream(msifile);
3828 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3830 r = MsiInstallProductA(msifile, NULL);
3831 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3832 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
3833 ok(delete_pf("msitest", FALSE), "File installed\n");
3835 DeleteFile(msifile);
3836 DeleteFile("msitest\\augustus");
3837 RemoveDirectory("msitest");
3840 static void create_pf_data(LPCSTR file, LPCSTR data, BOOL is_file)
3842 CHAR path[MAX_PATH];
3844 lstrcpyA(path, PROG_FILES_DIR);
3845 lstrcatA(path, "\\");
3846 lstrcatA(path, file);
3848 if (is_file)
3849 create_file_data(path, data, 500);
3850 else
3851 CreateDirectoryA(path, NULL);
3854 #define create_pf(file, is_file) create_pf_data(file, file, is_file)
3856 static void test_removefiles(void)
3858 UINT r;
3860 CreateDirectoryA("msitest", NULL);
3861 create_file("msitest\\hydrogen", 500);
3862 create_file("msitest\\helium", 500);
3863 create_file("msitest\\lithium", 500);
3865 create_database(msifile, rem_tables, sizeof(rem_tables) / sizeof(msi_table));
3867 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
3869 r = MsiInstallProductA(msifile, NULL);
3870 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3871 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3872 ok(!pf_exists("msitest\\helium"), "File installed\n");
3873 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3874 ok(pf_exists("msitest"), "File not installed\n");
3876 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3877 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3878 ok(!pf_exists("msitest\\helium"), "File not deleted\n");
3879 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
3880 todo_wine
3882 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
3883 ok(delete_pf("msitest", FALSE), "File deleted\n");
3886 create_pf("msitest", FALSE);
3887 create_pf("msitest\\hydrogen", TRUE);
3888 create_pf("msitest\\helium", TRUE);
3889 create_pf("msitest\\lithium", TRUE);
3891 r = MsiInstallProductA(msifile, NULL);
3892 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3893 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3894 ok(pf_exists("msitest\\helium"), "File not installed\n");
3895 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3896 ok(pf_exists("msitest"), "File not installed\n");
3898 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3899 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3900 ok(delete_pf("msitest\\helium", TRUE), "File deleted\n");
3901 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
3902 todo_wine
3904 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
3905 ok(delete_pf("msitest", FALSE), "File deleted\n");
3908 create_pf("msitest", FALSE);
3909 create_pf("msitest\\furlong", TRUE);
3910 create_pf("msitest\\firkin", TRUE);
3911 create_pf("msitest\\fortnight", TRUE);
3912 create_pf("msitest\\becquerel", TRUE);
3913 create_pf("msitest\\dioptre", TRUE);
3914 create_pf("msitest\\attoparsec", TRUE);
3915 create_pf("msitest\\storeys", TRUE);
3916 create_pf("msitest\\block", TRUE);
3917 create_pf("msitest\\siriometer", TRUE);
3919 r = MsiInstallProductA(msifile, NULL);
3920 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3921 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3922 ok(!pf_exists("msitest\\helium"), "File installed\n");
3923 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3924 ok(pf_exists("msitest\\becquerel"), "File not installed\n");
3925 ok(pf_exists("msitest\\dioptre"), "File not installed\n");
3926 ok(pf_exists("msitest\\attoparsec"), "File not installed\n");
3927 ok(pf_exists("msitest"), "File not installed\n");
3928 todo_wine
3930 ok(!pf_exists("msitest\\firkin"), "File not deleted\n");
3931 ok(!pf_exists("msitest\\fortnight"), "File not deleted\n");
3932 ok(!pf_exists("msitest\\furlong"), "File not deleted\n");
3933 ok(!pf_exists("msitest\\storeys"), "File not deleted\n");
3934 ok(!pf_exists("msitest\\block"), "File not deleted\n");
3935 ok(!pf_exists("msitest\\siriometer"), "File not deleted\n");
3938 create_pf("msitest\\furlong", TRUE);
3939 create_pf("msitest\\firkin", TRUE);
3940 create_pf("msitest\\fortnight", TRUE);
3941 create_pf("msitest\\storeys", TRUE);
3942 create_pf("msitest\\block", TRUE);
3943 create_pf("msitest\\siriometer", TRUE);
3945 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3946 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3947 ok(!delete_pf("msitest\\helium", TRUE), "File not deleted\n");
3948 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
3949 ok(delete_pf("msitest\\furlong", TRUE), "File deleted\n");
3950 ok(delete_pf("msitest\\firkin", TRUE), "File deleted\n");
3951 ok(delete_pf("msitest\\fortnight", TRUE), "File deleted\n");
3952 ok(delete_pf("msitest\\attoparsec", TRUE), "File deleted\n");
3953 ok(delete_pf("msitest\\siriometer", TRUE), "File deleted\n");
3954 todo_wine
3956 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not deleted\n");
3957 ok(!delete_pf("msitest\\becquerel", TRUE), "File not deleted\n");
3958 ok(!delete_pf("msitest\\dioptre", TRUE), "File not deleted\n");
3959 ok(!delete_pf("msitest\\storeys", TRUE), "File not deleted\n");
3960 ok(!delete_pf("msitest\\block", TRUE), "File not deleted\n");
3962 ok(delete_pf("msitest", FALSE), "File deleted\n");
3964 DeleteFile(msifile);
3965 DeleteFile("msitest\\hydrogen");
3966 DeleteFile("msitest\\helium");
3967 DeleteFile("msitest\\lithium");
3968 RemoveDirectory("msitest");
3971 static void test_movefiles(void)
3973 UINT r;
3974 char props[MAX_PATH];
3976 CreateDirectoryA("msitest", NULL);
3977 create_file("msitest\\augustus", 100);
3978 create_file("cameroon", 100);
3979 create_file("djibouti", 100);
3980 create_file("egypt", 100);
3981 create_file("finland", 100);
3982 create_file("gambai", 100);
3983 create_file("honduras", 100);
3984 create_file("msitest\\india", 100);
3985 create_file("japan", 100);
3986 create_file("kenya", 100);
3987 CreateDirectoryA("latvia", NULL);
3988 create_file("nauru", 100);
3989 create_file("apple", 100);
3990 create_file("application", 100);
3991 create_file("ape", 100);
3992 create_file("foo", 100);
3993 create_file("fao", 100);
3994 create_file("fbod", 100);
3995 create_file("budding", 100);
3996 create_file("buddy", 100);
3997 create_file("bud", 100);
3998 create_file("bar", 100);
3999 create_file("bur", 100);
4000 create_file("bird", 100);
4002 create_database(msifile, mov_tables, sizeof(mov_tables) / sizeof(msi_table));
4004 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
4006 /* if the source or dest property is not a full path,
4007 * windows tries to access it as a network resource
4010 sprintf(props, "SOURCEFULL=\"%s\\\" DESTFULL=\"%s\\msitest\" "
4011 "FILEPATHBAD=\"%s\\japan\" FILEPATHGOOD=\"%s\\kenya\"",
4012 CURR_DIR, PROG_FILES_DIR, CURR_DIR, CURR_DIR);
4014 r = MsiInstallProductA(msifile, props);
4015 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4016 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
4017 ok(!delete_pf("msitest\\dest", TRUE), "File copied\n");
4018 ok(delete_pf("msitest\\canada", TRUE), "File not copied\n");
4019 ok(delete_pf("msitest\\dominica", TRUE), "File not moved\n");
4020 ok(!delete_pf("msitest\\elsalvador", TRUE), "File moved\n");
4021 ok(!delete_pf("msitest\\france", TRUE), "File moved\n");
4022 ok(!delete_pf("msitest\\georgia", TRUE), "File moved\n");
4023 ok(delete_pf("msitest\\hungary", TRUE), "File not moved\n");
4024 ok(!delete_pf("msitest\\indonesia", TRUE), "File moved\n");
4025 ok(!delete_pf("msitest\\jordan", TRUE), "File moved\n");
4026 ok(delete_pf("msitest\\kiribati", TRUE), "File not moved\n");
4027 ok(!delete_pf("msitest\\lebanon", TRUE), "File moved\n");
4028 ok(!delete_pf("msitest\\lebanon", FALSE), "Directory moved\n");
4029 /* either apple or application will be moved depending on directory order */
4030 if (!delete_pf("msitest\\apple", TRUE))
4031 ok(delete_pf("msitest\\application", TRUE), "File not moved\n");
4032 else
4033 ok(!delete_pf("msitest\\application", TRUE), "File should not exist\n");
4034 ok(delete_pf("msitest\\wildcard", TRUE), "File not moved\n");
4035 ok(!delete_pf("msitest\\ape", TRUE), "File moved\n");
4036 /* either fao or foo will be moved depending on directory order */
4037 if (delete_pf("msitest\\foo", TRUE))
4038 ok(!delete_pf("msitest\\fao", TRUE), "File should not exist\n");
4039 else
4040 ok(delete_pf("msitest\\fao", TRUE), "File not moved\n");
4041 ok(delete_pf("msitest\\single", TRUE), "File not moved\n");
4042 ok(!delete_pf("msitest\\fbod", TRUE), "File moved\n");
4043 ok(delete_pf("msitest\\budding", TRUE), "File not moved\n");
4044 ok(delete_pf("msitest\\buddy", TRUE), "File not moved\n");
4045 ok(!delete_pf("msitest\\bud", TRUE), "File moved\n");
4046 ok(delete_pf("msitest\\bar", TRUE), "File not moved\n");
4047 ok(delete_pf("msitest\\bur", TRUE), "File not moved\n");
4048 ok(!delete_pf("msitest\\bird", TRUE), "File moved\n");
4049 ok(delete_pf("msitest", FALSE), "File not installed\n");
4050 ok(DeleteFileA("cameroon"), "File moved\n");
4051 ok(!DeleteFileA("djibouti"), "File not moved\n");
4052 ok(DeleteFileA("egypt"), "File moved\n");
4053 ok(DeleteFileA("finland"), "File moved\n");
4054 ok(DeleteFileA("gambai"), "File moved\n");
4055 ok(!DeleteFileA("honduras"), "File not moved\n");
4056 ok(DeleteFileA("msitest\\india"), "File moved\n");
4057 ok(DeleteFileA("japan"), "File moved\n");
4058 ok(!DeleteFileA("kenya"), "File not moved\n");
4059 ok(RemoveDirectoryA("latvia"), "Directory moved\n");
4060 ok(!DeleteFileA("nauru"), "File not moved\n");
4061 ok(!DeleteFileA("apple"), "File not moved\n");
4062 ok(!DeleteFileA("application"), "File not moved\n");
4063 ok(DeleteFileA("ape"), "File moved\n");
4064 ok(!DeleteFileA("foo"), "File not moved\n");
4065 ok(!DeleteFileA("fao"), "File not moved\n");
4066 ok(DeleteFileA("fbod"), "File moved\n");
4067 ok(!DeleteFileA("budding"), "File not moved\n");
4068 ok(!DeleteFileA("buddy"), "File not moved\n");
4069 ok(DeleteFileA("bud"), "File moved\n");
4070 ok(!DeleteFileA("bar"), "File not moved\n");
4071 ok(!DeleteFileA("bur"), "File not moved\n");
4072 ok(DeleteFileA("bird"), "File moved\n");
4074 DeleteFile("msitest\\augustus");
4075 RemoveDirectory("msitest");
4076 DeleteFile(msifile);
4079 static void test_missingcab(void)
4081 UINT r;
4083 CreateDirectoryA("msitest", NULL);
4084 create_file("msitest\\augustus", 500);
4085 create_file("maximus", 500);
4087 create_database(msifile, mc_tables, sizeof(mc_tables) / sizeof(msi_table));
4089 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4091 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
4093 create_pf("msitest", FALSE);
4094 create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
4096 r = MsiInstallProductA(msifile, NULL);
4097 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4098 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
4099 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
4100 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
4101 ok(!delete_pf("msitest\\gaius", TRUE), "File installed\n");
4102 ok(delete_pf("msitest", FALSE), "File not installed\n");
4104 create_pf("msitest", FALSE);
4105 create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
4106 create_pf("msitest\\gaius", TRUE);
4108 r = MsiInstallProductA(msifile, "GAIUS=1");
4109 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4110 todo_wine
4112 ok(!delete_pf("msitest\\maximus", TRUE), "File installed\n");
4113 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4115 ok(delete_pf("msitest\\caesar", TRUE), "File removed\n");
4116 ok(delete_pf("msitest\\gaius", TRUE), "File removed\n");
4117 ok(delete_pf("msitest", FALSE), "File not installed\n");
4119 DeleteFile("msitest\\augustus");
4120 RemoveDirectory("msitest");
4121 DeleteFile("maximus");
4122 DeleteFile("test1.cab");
4123 DeleteFile(msifile);
4126 static void test_duplicatefiles(void)
4128 UINT r;
4130 CreateDirectoryA("msitest", NULL);
4131 create_file("msitest\\maximus", 500);
4132 create_database(msifile, df_tables, sizeof(df_tables) / sizeof(msi_table));
4134 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4136 /* fails if the destination folder is not a valid property */
4138 r = MsiInstallProductA(msifile, NULL);
4139 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4140 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
4141 ok(delete_pf("msitest\\augustus", TRUE), "File not duplicated\n");
4142 ok(delete_pf("msitest\\this\\doesnot\\exist\\maximus", TRUE), "File not duplicated\n");
4143 ok(delete_pf("msitest\\this\\doesnot\\exist", FALSE), "File not duplicated\n");
4144 ok(delete_pf("msitest\\this\\doesnot", FALSE), "File not duplicated\n");
4145 ok(delete_pf("msitest\\this", FALSE), "File not duplicated\n");
4146 ok(delete_pf("msitest", FALSE), "File not installed\n");
4148 DeleteFile("msitest\\maximus");
4149 RemoveDirectory("msitest");
4150 DeleteFile(msifile);
4153 static void test_writeregistryvalues(void)
4155 UINT r;
4156 LONG res;
4157 HKEY hkey;
4158 DWORD type, size;
4159 CHAR path[MAX_PATH];
4161 CreateDirectoryA("msitest", NULL);
4162 create_file("msitest\\augustus", 500);
4164 create_database(msifile, wrv_tables, sizeof(wrv_tables) / sizeof(msi_table));
4166 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4168 r = MsiInstallProductA(msifile, NULL);
4169 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4170 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
4171 ok(delete_pf("msitest", FALSE), "File installed\n");
4173 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
4174 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4176 size = MAX_PATH;
4177 type = REG_MULTI_SZ;
4178 memset(path, 'a', MAX_PATH);
4179 res = RegQueryValueExA(hkey, "Value", NULL, &type, (LPBYTE)path, &size);
4180 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4181 ok(!memcmp(path, "one\0two\0three\0\0", size), "Wrong multi-sz data\n");
4182 ok(size == 15, "Expected 15, got %d\n", size);
4183 ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
4185 DeleteFile(msifile);
4186 DeleteFile("msitest\\augustus");
4187 RemoveDirectory("msitest");
4189 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
4190 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine");
4193 static void test_sourcefolder(void)
4195 UINT r;
4197 CreateDirectoryA("msitest", NULL);
4198 create_file("augustus", 500);
4200 create_database(msifile, sf_tables, sizeof(sf_tables) / sizeof(msi_table));
4202 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4204 r = MsiInstallProductA(msifile, NULL);
4205 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4206 todo_wine
4208 ok(r == ERROR_INSTALL_FAILURE,
4209 "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4210 ok(!delete_pf("msitest", FALSE), "File installed\n");
4213 RemoveDirectoryA("msitest");
4215 r = MsiInstallProductA(msifile, NULL);
4216 todo_wine
4218 ok(r == ERROR_INSTALL_FAILURE,
4219 "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4220 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4221 ok(!delete_pf("msitest", FALSE), "File installed\n");
4224 DeleteFile(msifile);
4225 DeleteFile("augustus");
4228 static void test_customaction51(void)
4230 UINT r;
4232 CreateDirectoryA("msitest", NULL);
4233 create_file("msitest\\augustus", 500);
4235 create_database(msifile, ca51_tables, sizeof(ca51_tables) / sizeof(msi_table));
4237 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4239 r = MsiInstallProductA(msifile, NULL);
4240 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4241 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
4242 ok(delete_pf("msitest", FALSE), "File installed\n");
4244 DeleteFile(msifile);
4245 DeleteFile("msitest\\augustus");
4246 RemoveDirectory("msitest");
4249 static void test_installstate(void)
4251 UINT r;
4253 CreateDirectoryA("msitest", NULL);
4254 create_file("msitest\\alpha", 500);
4255 create_file("msitest\\beta", 500);
4256 create_file("msitest\\gamma", 500);
4257 create_file("msitest\\theta", 500);
4258 create_file("msitest\\delta", 500);
4259 create_file("msitest\\epsilon", 500);
4260 create_file("msitest\\zeta", 500);
4261 create_file("msitest\\iota", 500);
4262 create_file("msitest\\eta", 500);
4263 create_file("msitest\\kappa", 500);
4264 create_file("msitest\\lambda", 500);
4265 create_file("msitest\\mu", 500);
4267 create_database(msifile, is_tables, sizeof(is_tables) / sizeof(msi_table));
4269 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4271 r = MsiInstallProductA(msifile, NULL);
4272 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4273 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4274 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4275 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n");
4276 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4277 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4278 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4279 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n");
4280 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4281 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4282 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4283 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4284 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4285 ok(delete_pf("msitest", FALSE), "File not installed\n");
4287 r = MsiInstallProductA(msifile, "ADDLOCAL=\"one,two,three,four\"");
4288 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4289 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4290 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4291 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n");
4292 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4293 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4294 ok(delete_pf("msitest\\epsilon", TRUE), "File not installed\n");
4295 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n");
4296 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4297 ok(delete_pf("msitest\\eta", TRUE), "File not installed\n");
4298 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4299 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4300 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4301 ok(delete_pf("msitest", FALSE), "File not installed\n");
4303 r = MsiInstallProductA(msifile, "ADDSOURCE=\"one,two,three,four\"");
4304 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4305 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4306 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4307 ok(!delete_pf("msitest\\gamma", TRUE), "File installed\n");
4308 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4309 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4310 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4311 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n");
4312 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4313 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4314 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4315 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4316 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4317 ok(delete_pf("msitest", FALSE), "File not installed\n");
4319 r = MsiInstallProductA(msifile, "REMOVE=\"one,two,three,four\"");
4320 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4321 ok(!delete_pf("msitest\\alpha", TRUE), "File installed\n");
4322 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4323 ok(!delete_pf("msitest\\gamma", TRUE), "File installed\n");
4324 ok(!delete_pf("msitest\\theta", TRUE), "File installed\n");
4325 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4326 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4327 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n");
4328 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4329 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4330 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4331 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4332 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4333 ok(!delete_pf("msitest", FALSE), "File installed\n");
4335 DeleteFile(msifile);
4336 DeleteFile("msitest\\alpha");
4337 DeleteFile("msitest\\beta");
4338 DeleteFile("msitest\\gamma");
4339 DeleteFile("msitest\\theta");
4340 DeleteFile("msitest\\delta");
4341 DeleteFile("msitest\\epsilon");
4342 DeleteFile("msitest\\zeta");
4343 DeleteFile("msitest\\iota");
4344 DeleteFile("msitest\\eta");
4345 DeleteFile("msitest\\kappa");
4346 DeleteFile("msitest\\lambda");
4347 DeleteFile("msitest\\mu");
4348 RemoveDirectory("msitest");
4351 START_TEST(install)
4353 DWORD len;
4354 char temp_path[MAX_PATH], prev_path[MAX_PATH];
4356 init_functionpointers();
4358 GetCurrentDirectoryA(MAX_PATH, prev_path);
4359 GetTempPath(MAX_PATH, temp_path);
4360 SetCurrentDirectoryA(temp_path);
4362 lstrcpyA(CURR_DIR, temp_path);
4363 len = lstrlenA(CURR_DIR);
4365 if(len && (CURR_DIR[len - 1] == '\\'))
4366 CURR_DIR[len - 1] = 0;
4368 get_program_files_dir(PROG_FILES_DIR, COMMON_FILES_DIR);
4370 test_MsiInstallProduct();
4371 test_MsiSetComponentState();
4372 test_packagecoltypes();
4373 test_continuouscabs();
4374 test_caborder();
4375 test_mixedmedia();
4376 test_samesequence();
4377 test_uiLevelFlags();
4378 test_readonlyfile();
4379 test_setdirproperty();
4380 test_cabisextracted();
4381 test_concurrentinstall();
4382 test_setpropertyfolder();
4383 test_publish_registerproduct();
4384 test_publish_publishproduct();
4385 test_publish_publishfeatures();
4386 test_publish_registeruser();
4387 test_publish_processcomponents();
4388 test_publish();
4389 test_publishsourcelist();
4390 test_transformprop();
4391 test_currentworkingdir();
4392 test_admin();
4393 test_adminprops();
4394 test_removefiles();
4395 test_movefiles();
4396 test_missingcab();
4397 test_duplicatefiles();
4398 test_writeregistryvalues();
4399 test_sourcefolder();
4400 test_customaction51();
4401 test_installstate();
4403 SetCurrentDirectoryA(prev_path);