msi: Fix the ProcessComponents action to handle the package context.
[wine.git] / dlls / msi / tests / install.c
blobbf329a1d7628c9b7e9bea2a9e71cdf17a38added
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 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2772 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
2773 RegDeleteKeyA(comp, "");
2774 RegCloseKey(comp);
2776 /* ProcessComponents, machine */
2777 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1 ALLUSERS=1");
2778 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2779 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2780 ok(delete_pf("msitest", FALSE), "File not installed\n");
2782 sprintf(keypath, keyfmt, "S-1-5-18");
2784 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp);
2785 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2787 size = MAX_PATH;
2788 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
2789 NULL, NULL, (LPBYTE)val, &size);
2790 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2791 ok(!lstrcmpA(val, "C:\\Program Files\\msitest\\maximus"),
2792 "Expected \"%s\", got \"%s\"\n", "C:\\Program Files\\msitest\\maximus", val);
2794 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey);
2795 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2797 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
2798 RegDeleteKeyA(comp, "");
2799 RegCloseKey(comp);
2801 DeleteFile(msifile);
2802 DeleteFile("msitest\\maximus");
2803 RemoveDirectory("msitest");
2806 static void test_publish(void)
2808 UINT r;
2809 LONG res;
2810 HKEY uninstall, prodkey;
2811 INSTALLSTATE state;
2812 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2813 char date[MAX_PATH];
2814 char temp[MAX_PATH];
2816 static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2818 if (!pMsiQueryComponentStateA)
2820 skip("MsiQueryComponentStateA is not available\n");
2821 return;
2824 get_date_str(date);
2825 GetTempPath(MAX_PATH, temp);
2827 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &uninstall);
2828 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2830 CreateDirectoryA("msitest", NULL);
2831 create_file("msitest\\maximus", 500);
2833 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2835 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2837 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2838 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2840 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2841 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2843 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2844 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2846 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2847 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2848 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2849 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2851 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2852 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2854 /* nothing published */
2855 r = MsiInstallProductA(msifile, NULL);
2856 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2857 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2858 ok(pf_exists("msitest"), "File not installed\n");
2860 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2861 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2863 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2864 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2866 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2867 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2869 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2870 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2871 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2872 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2874 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2875 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2877 /* PublishProduct and RegisterProduct */
2878 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 PUBLISH_PRODUCT=1");
2879 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2880 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2881 ok(pf_exists("msitest"), "File not installed\n");
2883 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2884 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
2886 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2887 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2889 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2890 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2892 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2893 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2894 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
2895 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2897 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2898 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2900 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
2901 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
2902 CHECK_REG_STR(prodkey, "InstallDate", date);
2903 CHECK_REG_STR(prodkey, "InstallSource", temp);
2904 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2905 CHECK_REG_STR(prodkey, "Publisher", "Wine");
2906 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2907 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
2908 CHECK_REG_STR(prodkey, "Comments", NULL);
2909 CHECK_REG_STR(prodkey, "Contact", NULL);
2910 CHECK_REG_STR(prodkey, "HelpLink", NULL);
2911 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
2912 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
2913 CHECK_REG_STR(prodkey, "Readme", NULL);
2914 CHECK_REG_STR(prodkey, "Size", NULL);
2915 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
2916 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
2917 CHECK_REG_DWORD(prodkey, "Language", 1033);
2918 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
2919 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
2920 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
2921 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
2922 todo_wine
2924 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
2927 RegCloseKey(prodkey);
2929 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
2930 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2931 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2932 ok(pf_exists("msitest"), "File deleted\n");
2934 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2935 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2937 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2938 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2940 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2941 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2943 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2944 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2945 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2946 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2948 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2949 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2951 /* complete install */
2952 r = MsiInstallProductA(msifile, "FULL=1");
2953 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2954 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2955 ok(pf_exists("msitest"), "File not installed\n");
2957 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2958 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
2960 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2961 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
2963 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2964 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
2966 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2967 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2968 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2969 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
2971 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2972 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2974 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
2975 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
2976 CHECK_REG_STR(prodkey, "InstallDate", date);
2977 CHECK_REG_STR(prodkey, "InstallSource", temp);
2978 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2979 CHECK_REG_STR(prodkey, "Publisher", "Wine");
2980 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2981 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
2982 CHECK_REG_STR(prodkey, "Comments", NULL);
2983 CHECK_REG_STR(prodkey, "Contact", NULL);
2984 CHECK_REG_STR(prodkey, "HelpLink", NULL);
2985 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
2986 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
2987 CHECK_REG_STR(prodkey, "Readme", NULL);
2988 CHECK_REG_STR(prodkey, "Size", NULL);
2989 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
2990 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
2991 CHECK_REG_DWORD(prodkey, "Language", 1033);
2992 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
2993 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
2994 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
2995 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
2996 todo_wine
2998 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3001 RegCloseKey(prodkey);
3003 /* no UnpublishFeatures */
3004 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3005 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3006 todo_wine
3008 ok(!pf_exists("msitest\\maximus"), "File deleted\n");
3009 ok(!pf_exists("msitest"), "File deleted\n");
3012 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3013 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3015 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3016 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3018 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3019 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3021 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3022 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3023 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3024 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3026 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3027 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3029 /* complete install */
3030 r = MsiInstallProductA(msifile, "FULL=1");
3031 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3032 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3033 ok(pf_exists("msitest"), "File not installed\n");
3035 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3036 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3038 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3039 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3041 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3042 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3044 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3045 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3046 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3047 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3049 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3050 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3052 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3053 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3054 CHECK_REG_STR(prodkey, "InstallDate", date);
3055 CHECK_REG_STR(prodkey, "InstallSource", temp);
3056 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3057 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3058 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3059 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3060 CHECK_REG_STR(prodkey, "Comments", NULL);
3061 CHECK_REG_STR(prodkey, "Contact", NULL);
3062 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3063 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3064 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3065 CHECK_REG_STR(prodkey, "Readme", NULL);
3066 CHECK_REG_STR(prodkey, "Size", NULL);
3067 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3068 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3069 CHECK_REG_DWORD(prodkey, "Language", 1033);
3070 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3071 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3072 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3073 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3074 todo_wine
3076 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3079 RegCloseKey(prodkey);
3081 /* UnpublishFeatures, only feature removed. Only works when entire product is removed */
3082 r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature");
3083 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3084 ok(pf_exists("msitest\\maximus"), "File deleted\n");
3085 ok(pf_exists("msitest"), "File deleted\n");
3087 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3088 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3090 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3091 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3093 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3094 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3096 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3097 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3098 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3099 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3101 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3102 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3104 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3105 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3106 CHECK_REG_STR(prodkey, "InstallDate", date);
3107 CHECK_REG_STR(prodkey, "InstallSource", temp);
3108 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3109 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3110 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3111 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3112 CHECK_REG_STR(prodkey, "Comments", NULL);
3113 CHECK_REG_STR(prodkey, "Contact", NULL);
3114 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3115 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3116 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3117 CHECK_REG_STR(prodkey, "Readme", NULL);
3118 CHECK_REG_STR(prodkey, "Size", NULL);
3119 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3120 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3121 CHECK_REG_DWORD(prodkey, "Language", 1033);
3122 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3123 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3124 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3125 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3126 todo_wine
3128 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3131 RegCloseKey(prodkey);
3133 /* complete install */
3134 r = MsiInstallProductA(msifile, "FULL=1");
3135 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3136 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3137 ok(pf_exists("msitest"), "File not installed\n");
3139 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3140 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3142 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3143 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3145 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3146 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3148 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3149 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3150 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3151 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3153 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3154 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3156 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3157 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3158 CHECK_REG_STR(prodkey, "InstallDate", date);
3159 CHECK_REG_STR(prodkey, "InstallSource", temp);
3160 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3161 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3162 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3163 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3164 CHECK_REG_STR(prodkey, "Comments", NULL);
3165 CHECK_REG_STR(prodkey, "Contact", NULL);
3166 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3167 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3168 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3169 CHECK_REG_STR(prodkey, "Readme", NULL);
3170 CHECK_REG_STR(prodkey, "Size", NULL);
3171 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3172 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3173 CHECK_REG_DWORD(prodkey, "Language", 1033);
3174 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3175 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3176 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3177 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3178 todo_wine
3180 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3183 RegCloseKey(prodkey);
3185 /* UnpublishFeatures, both features removed */
3186 r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo");
3187 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3188 todo_wine
3190 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3191 ok(!pf_exists("msitest"), "File not deleted\n");
3194 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3195 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3197 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3198 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3200 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3201 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3203 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3204 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3205 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3206 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3208 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3209 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3211 /* complete install */
3212 r = MsiInstallProductA(msifile, "FULL=1");
3213 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3214 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3215 ok(pf_exists("msitest"), "File not installed\n");
3217 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3218 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3220 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3221 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3223 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3224 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3226 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3227 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3228 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3229 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3231 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3232 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3234 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3235 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3236 CHECK_REG_STR(prodkey, "InstallDate", date);
3237 CHECK_REG_STR(prodkey, "InstallSource", temp);
3238 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3239 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3240 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3241 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3242 CHECK_REG_STR(prodkey, "Comments", NULL);
3243 CHECK_REG_STR(prodkey, "Contact", NULL);
3244 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3245 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3246 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3247 CHECK_REG_STR(prodkey, "Readme", NULL);
3248 CHECK_REG_STR(prodkey, "Size", NULL);
3249 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3250 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3251 CHECK_REG_DWORD(prodkey, "Language", 1033);
3252 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3253 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3254 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3255 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3256 todo_wine
3258 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3261 RegCloseKey(prodkey);
3263 /* complete uninstall */
3264 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3265 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3266 todo_wine
3268 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3269 ok(!pf_exists("msitest"), "File not deleted\n");
3272 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3273 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3275 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3276 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3278 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3279 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3281 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3282 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3283 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3284 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3286 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3287 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3289 /* make sure 'Program Files\msitest' is removed */
3290 delete_pfmsitest_files();
3292 RegCloseKey(uninstall);
3293 DeleteFile(msifile);
3294 DeleteFile("msitest\\maximus");
3295 RemoveDirectory("msitest");
3298 static void test_publishsourcelist(void)
3300 UINT r;
3301 DWORD size;
3302 CHAR value[MAX_PATH];
3303 CHAR path[MAX_PATH];
3304 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
3306 if (!pMsiSourceListEnumSourcesA || !pMsiSourceListGetInfoA)
3308 skip("MsiSourceListEnumSourcesA and/or MsiSourceListGetInfoA are not available\n");
3309 return;
3312 CreateDirectoryA("msitest", NULL);
3313 create_file("msitest\\maximus", 500);
3315 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
3317 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
3319 r = MsiInstallProductA(msifile, NULL);
3320 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3321 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3322 ok(pf_exists("msitest"), "File not installed\n");
3324 /* nothing published */
3325 size = 0xdeadbeef;
3326 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3327 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3328 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3329 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3331 size = 0xdeadbeef;
3332 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3333 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3334 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3335 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3337 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
3338 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3339 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3340 ok(pf_exists("msitest"), "File not installed\n");
3342 /* after RegisterProduct */
3343 size = 0xdeadbeef;
3344 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3345 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3346 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3347 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3349 size = 0xdeadbeef;
3350 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3351 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3352 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3353 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3355 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1");
3356 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3357 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3358 ok(pf_exists("msitest"), "File not installed\n");
3360 /* after ProcessComponents */
3361 size = 0xdeadbeef;
3362 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3363 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3364 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3365 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3367 size = 0xdeadbeef;
3368 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3369 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3370 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3371 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3373 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1");
3374 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3375 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3376 ok(pf_exists("msitest"), "File not installed\n");
3378 /* after PublishFeatures */
3379 size = 0xdeadbeef;
3380 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3381 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3382 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3383 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3385 size = 0xdeadbeef;
3386 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3387 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3388 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3389 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3391 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
3392 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3393 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3394 ok(pf_exists("msitest"), "File not installed\n");
3396 /* after PublishProduct */
3397 size = MAX_PATH;
3398 lstrcpyA(value, "aaa");
3399 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3400 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size);
3401 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3402 ok(!lstrcmpA(value, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value);
3403 ok(size == 11, "Expected 11, got %d\n", size);
3405 size = MAX_PATH;
3406 lstrcpyA(value, "aaa");
3407 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3408 MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATH, value, &size);
3409 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3410 ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
3411 ok(size == 0, "Expected 0, got %d\n", size);
3413 size = MAX_PATH;
3414 lstrcpyA(value, "aaa");
3415 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3416 MSICODE_PRODUCT, INSTALLPROPERTY_DISKPROMPT, value, &size);
3417 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3418 ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
3419 ok(size == 0, "Expected 0, got %d\n", size);
3421 lstrcpyA(path, CURR_DIR);
3422 lstrcatA(path, "\\");
3424 size = MAX_PATH;
3425 lstrcpyA(value, "aaa");
3426 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3427 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3428 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3429 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3430 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3432 size = MAX_PATH;
3433 lstrcpyA(value, "aaa");
3434 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3435 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPE, value, &size);
3436 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3437 ok(!lstrcmpA(value, "n"), "Expected \"n\", got \"%s\"\n", value);
3438 ok(size == 1, "Expected 1, got %d\n", size);
3440 size = MAX_PATH;
3441 lstrcpyA(value, "aaa");
3442 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3443 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
3444 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
3445 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
3446 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
3448 size = MAX_PATH;
3449 lstrcpyA(value, "aaa");
3450 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3451 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
3452 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3453 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3454 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3456 size = MAX_PATH;
3457 lstrcpyA(value, "aaa");
3458 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3459 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 1, value, &size);
3460 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
3461 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
3462 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
3464 /* complete uninstall */
3465 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3466 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3467 todo_wine
3469 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3470 ok(!pf_exists("msitest"), "File not deleted\n");
3473 /* make sure 'Program Files\msitest' is removed */
3474 delete_pfmsitest_files();
3476 DeleteFile(msifile);
3477 DeleteFile("msitest\\maximus");
3478 RemoveDirectory("msitest");
3481 static UINT run_query(MSIHANDLE hdb, MSIHANDLE hrec, const char *query)
3483 MSIHANDLE hview = 0;
3484 UINT r;
3486 r = MsiDatabaseOpenView(hdb, query, &hview);
3487 if(r != ERROR_SUCCESS)
3488 return r;
3490 r = MsiViewExecute(hview, hrec);
3491 if(r == ERROR_SUCCESS)
3492 r = MsiViewClose(hview);
3493 MsiCloseHandle(hview);
3494 return r;
3497 static void set_transform_summary_info(void)
3499 UINT r;
3500 MSIHANDLE suminfo = 0;
3502 /* build summary info */
3503 r = MsiGetSummaryInformation(0, mstfile, 3, &suminfo);
3504 todo_wine
3506 ok(r == ERROR_SUCCESS , "Failed to open summaryinfo\n");
3509 r = MsiSummaryInfoSetProperty(suminfo, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
3510 todo_wine
3512 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3515 r = MsiSummaryInfoSetProperty(suminfo, PID_REVNUMBER, VT_LPSTR, 0, NULL,
3516 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3517 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3518 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}");
3519 todo_wine
3521 ok(r == ERROR_SUCCESS , "Failed to set summary info\n");
3524 r = MsiSummaryInfoSetProperty(suminfo, PID_PAGECOUNT, VT_I4, 100, NULL, NULL);
3525 todo_wine
3527 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3530 r = MsiSummaryInfoPersist(suminfo);
3531 todo_wine
3533 ok(r == ERROR_SUCCESS , "Failed to make summary info persist\n");
3536 r = MsiCloseHandle(suminfo);
3537 ok(r == ERROR_SUCCESS , "Failed to close suminfo\n");
3540 static void generate_transform(void)
3542 MSIHANDLE hdb1, hdb2;
3543 LPCSTR query;
3544 UINT r;
3546 /* start with two identical databases */
3547 CopyFile(msifile, msifile2, FALSE);
3549 r = MsiOpenDatabase(msifile2, MSIDBOPEN_TRANSACT, &hdb1);
3550 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3552 r = MsiDatabaseCommit(hdb1);
3553 ok(r == ERROR_SUCCESS , "Failed to commit database\n");
3555 r = MsiOpenDatabase(msifile, MSIDBOPEN_READONLY, &hdb2);
3556 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3558 query = "INSERT INTO `Property` ( `Property`, `Value` ) VALUES ( 'prop', 'val' )";
3559 r = run_query(hdb1, 0, query);
3560 ok(r == ERROR_SUCCESS, "failed to add property\n");
3562 /* database needs to be committed */
3563 MsiDatabaseCommit(hdb1);
3565 r = MsiDatabaseGenerateTransform(hdb1, hdb2, mstfile, 0, 0);
3566 ok(r == ERROR_SUCCESS, "return code %d, should be ERROR_SUCCESS\n", r);
3568 #if 0 /* not implemented in wine yet */
3569 r = MsiCreateTransformSummaryInfo(hdb2, hdb2, mstfile, 0, 0);
3570 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3571 #endif
3573 MsiCloseHandle(hdb1);
3574 MsiCloseHandle(hdb2);
3577 /* data for generating a transform */
3579 /* tables transform names - encoded as they would be in an msi database file */
3580 static const WCHAR name1[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */
3581 static const WCHAR name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */
3582 static const WCHAR name3[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */
3584 /* data in each table */
3585 static const char data1[] = /* _StringData */
3586 "propval"; /* all the strings squashed together */
3588 static const WCHAR data2[] = { /* _StringPool */
3589 /* len, refs */
3590 0, 0, /* string 0 '' */
3591 4, 1, /* string 1 'prop' */
3592 3, 1, /* string 2 'val' */
3595 static const WCHAR data3[] = { /* Property */
3596 0x0201, 0x0001, 0x0002,
3599 static const struct {
3600 LPCWSTR name;
3601 const void *data;
3602 DWORD size;
3603 } table_transform_data[] =
3605 { name1, data1, sizeof data1 - 1 },
3606 { name2, data2, sizeof data2 },
3607 { name3, data3, sizeof data3 },
3610 #define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0])
3612 static void generate_transform_manual(void)
3614 IStorage *stg = NULL;
3615 IStream *stm;
3616 WCHAR name[0x20];
3617 HRESULT r;
3618 DWORD i, count;
3619 const DWORD mode = STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE;
3621 const CLSID CLSID_MsiTransform = { 0xc1082,0,0,{0xc0,0,0,0,0,0,0,0x46}};
3623 MultiByteToWideChar(CP_ACP, 0, mstfile, -1, name, 0x20);
3625 r = StgCreateDocfile(name, mode, 0, &stg);
3626 ok(r == S_OK, "failed to create storage\n");
3627 if (!stg)
3628 return;
3630 r = IStorage_SetClass(stg, &CLSID_MsiTransform);
3631 ok(r == S_OK, "failed to set storage type\n");
3633 for (i=0; i<NUM_TRANSFORM_TABLES; i++)
3635 r = IStorage_CreateStream(stg, table_transform_data[i].name,
3636 STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3637 if (FAILED(r))
3639 ok(0, "failed to create stream %08x\n", r);
3640 continue;
3643 r = IStream_Write(stm, table_transform_data[i].data,
3644 table_transform_data[i].size, &count);
3645 if (FAILED(r) || count != table_transform_data[i].size)
3646 ok(0, "failed to write stream\n");
3647 IStream_Release(stm);
3650 IStorage_Release(stg);
3652 set_transform_summary_info();
3655 static void test_transformprop(void)
3657 UINT r;
3659 CreateDirectoryA("msitest", NULL);
3660 create_file("msitest\\augustus", 500);
3662 create_database(msifile, tp_tables, sizeof(tp_tables) / sizeof(msi_table));
3664 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3666 r = MsiInstallProductA(msifile, NULL);
3667 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3668 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3669 ok(!delete_pf("msitest", FALSE), "File installed\n");
3671 if (0)
3672 generate_transform();
3673 else
3674 generate_transform_manual();
3676 r = MsiInstallProductA(msifile, "TRANSFORMS=winetest.mst");
3677 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3678 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3679 ok(delete_pf("msitest", FALSE), "File not installed\n");
3681 /* Delete the files in the temp (current) folder */
3682 DeleteFile(msifile);
3683 DeleteFile(msifile2);
3684 DeleteFile(mstfile);
3685 DeleteFile("msitest\\augustus");
3686 RemoveDirectory("msitest");
3689 static void test_currentworkingdir(void)
3691 UINT r;
3692 CHAR path[MAX_PATH];
3693 LPSTR ptr, ptr2;
3695 CreateDirectoryA("msitest", NULL);
3696 create_file("msitest\\augustus", 500);
3698 create_database(msifile, cwd_tables, sizeof(cwd_tables) / sizeof(msi_table));
3700 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3702 CreateDirectoryA("diffdir", NULL);
3703 SetCurrentDirectoryA("diffdir");
3705 sprintf(path, "..\\%s", msifile);
3706 r = MsiInstallProductA(path, NULL);
3707 todo_wine
3709 ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
3710 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3711 ok(!delete_pf("msitest", FALSE), "File installed\n");
3714 sprintf(path, "%s\\%s", CURR_DIR, msifile);
3715 r = MsiInstallProductA(path, NULL);
3716 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3717 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3718 ok(delete_pf("msitest", FALSE), "File not installed\n");
3720 lstrcpyA(path, CURR_DIR);
3721 if (path[lstrlenA(path) - 1] != '\\')
3722 lstrcatA(path, "\\");
3723 lstrcatA(path, "msitest.msi");
3725 ptr2 = strrchr(path, '\\');
3726 *ptr2 = '\0';
3727 ptr = strrchr(path, '\\');
3728 *ptr2 = '\\';
3729 *(ptr++) = '\0';
3731 SetCurrentDirectoryA(path);
3733 r = MsiInstallProductA(ptr, NULL);
3734 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3735 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3736 ok(delete_pf("msitest", FALSE), "File not installed\n");
3738 SetCurrentDirectoryA(CURR_DIR);
3740 DeleteFile(msifile);
3741 DeleteFile("msitest\\augustus");
3742 RemoveDirectory("msitest");
3743 RemoveDirectory("diffdir");
3746 static void set_admin_summary_info(const CHAR *name)
3748 MSIHANDLE db, summary;
3749 UINT r;
3751 r = MsiOpenDatabaseA(name, MSIDBOPEN_DIRECT, &db);
3752 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3754 r = MsiGetSummaryInformationA(db, NULL, 1, &summary);
3755 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3757 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, 5, NULL, NULL);
3758 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3760 /* write the summary changes back to the stream */
3761 r = MsiSummaryInfoPersist(summary);
3762 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3764 MsiCloseHandle(summary);
3766 r = MsiDatabaseCommit(db);
3767 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3769 MsiCloseHandle(db);
3772 static void test_admin(void)
3774 UINT r;
3776 CreateDirectoryA("msitest", NULL);
3777 create_file("msitest\\augustus", 500);
3779 create_database(msifile, adm_tables, sizeof(adm_tables) / sizeof(msi_table));
3780 set_admin_summary_info(msifile);
3782 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3784 r = MsiInstallProductA(msifile, NULL);
3785 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3786 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3787 ok(!delete_pf("msitest", FALSE), "File installed\n");
3788 ok(!DeleteFile("c:\\msitest\\augustus"), "File installed\n");
3789 ok(!RemoveDirectory("c:\\msitest"), "File installed\n");
3791 r = MsiInstallProductA(msifile, "ACTION=ADMIN");
3792 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3793 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3794 ok(!delete_pf("msitest", FALSE), "File installed\n");
3795 todo_wine
3797 ok(DeleteFile("c:\\msitest\\augustus"), "File not installed\n");
3798 ok(RemoveDirectory("c:\\msitest"), "File not installed\n");
3801 DeleteFile(msifile);
3802 DeleteFile("msitest\\augustus");
3803 RemoveDirectory("msitest");
3806 static void set_admin_property_stream(LPCSTR file)
3808 IStorage *stg;
3809 IStream *stm;
3810 WCHAR fileW[MAX_PATH];
3811 HRESULT hr;
3812 DWORD count;
3813 const DWORD mode = STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE;
3815 /* AdminProperties */
3816 static const WCHAR stmname[] = {0x41ca,0x4330,0x3e71,0x44b5,0x4233,0x45f5,0x422c,0x4836,0};
3817 static const WCHAR data[] = {'M','Y','P','R','O','P','=','2','7','1','8',0};
3819 MultiByteToWideChar(CP_ACP, 0, file, -1, fileW, MAX_PATH);
3821 hr = StgOpenStorage(fileW, NULL, mode, NULL, 0, &stg);
3822 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3823 if (!stg)
3824 return;
3826 hr = IStorage_CreateStream(stg, stmname, STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3827 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3829 hr = IStream_Write(stm, data, sizeof(data), &count);
3830 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3832 IStream_Release(stm);
3833 IStorage_Release(stg);
3836 static void test_adminprops(void)
3838 UINT r;
3840 CreateDirectoryA("msitest", NULL);
3841 create_file("msitest\\augustus", 500);
3843 create_database(msifile, amp_tables, sizeof(amp_tables) / sizeof(msi_table));
3844 set_admin_summary_info(msifile);
3845 set_admin_property_stream(msifile);
3847 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3849 r = MsiInstallProductA(msifile, NULL);
3850 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3851 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
3852 ok(delete_pf("msitest", FALSE), "File installed\n");
3854 DeleteFile(msifile);
3855 DeleteFile("msitest\\augustus");
3856 RemoveDirectory("msitest");
3859 static void create_pf_data(LPCSTR file, LPCSTR data, BOOL is_file)
3861 CHAR path[MAX_PATH];
3863 lstrcpyA(path, PROG_FILES_DIR);
3864 lstrcatA(path, "\\");
3865 lstrcatA(path, file);
3867 if (is_file)
3868 create_file_data(path, data, 500);
3869 else
3870 CreateDirectoryA(path, NULL);
3873 #define create_pf(file, is_file) create_pf_data(file, file, is_file)
3875 static void test_removefiles(void)
3877 UINT r;
3879 CreateDirectoryA("msitest", NULL);
3880 create_file("msitest\\hydrogen", 500);
3881 create_file("msitest\\helium", 500);
3882 create_file("msitest\\lithium", 500);
3884 create_database(msifile, rem_tables, sizeof(rem_tables) / sizeof(msi_table));
3886 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
3888 r = MsiInstallProductA(msifile, NULL);
3889 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3890 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3891 ok(!pf_exists("msitest\\helium"), "File installed\n");
3892 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3893 ok(pf_exists("msitest"), "File not installed\n");
3895 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3896 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3897 ok(!pf_exists("msitest\\helium"), "File not deleted\n");
3898 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
3899 todo_wine
3901 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
3902 ok(delete_pf("msitest", FALSE), "File deleted\n");
3905 create_pf("msitest", FALSE);
3906 create_pf("msitest\\hydrogen", TRUE);
3907 create_pf("msitest\\helium", TRUE);
3908 create_pf("msitest\\lithium", TRUE);
3910 r = MsiInstallProductA(msifile, NULL);
3911 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3912 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3913 ok(pf_exists("msitest\\helium"), "File not installed\n");
3914 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3915 ok(pf_exists("msitest"), "File not installed\n");
3917 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3918 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3919 ok(delete_pf("msitest\\helium", TRUE), "File deleted\n");
3920 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
3921 todo_wine
3923 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
3924 ok(delete_pf("msitest", FALSE), "File deleted\n");
3927 create_pf("msitest", FALSE);
3928 create_pf("msitest\\furlong", TRUE);
3929 create_pf("msitest\\firkin", TRUE);
3930 create_pf("msitest\\fortnight", TRUE);
3931 create_pf("msitest\\becquerel", TRUE);
3932 create_pf("msitest\\dioptre", TRUE);
3933 create_pf("msitest\\attoparsec", TRUE);
3934 create_pf("msitest\\storeys", TRUE);
3935 create_pf("msitest\\block", TRUE);
3936 create_pf("msitest\\siriometer", TRUE);
3938 r = MsiInstallProductA(msifile, NULL);
3939 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3940 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3941 ok(!pf_exists("msitest\\helium"), "File installed\n");
3942 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3943 ok(pf_exists("msitest\\becquerel"), "File not installed\n");
3944 ok(pf_exists("msitest\\dioptre"), "File not installed\n");
3945 ok(pf_exists("msitest\\attoparsec"), "File not installed\n");
3946 ok(pf_exists("msitest"), "File not installed\n");
3947 todo_wine
3949 ok(!pf_exists("msitest\\firkin"), "File not deleted\n");
3950 ok(!pf_exists("msitest\\fortnight"), "File not deleted\n");
3951 ok(!pf_exists("msitest\\furlong"), "File not deleted\n");
3952 ok(!pf_exists("msitest\\storeys"), "File not deleted\n");
3953 ok(!pf_exists("msitest\\block"), "File not deleted\n");
3954 ok(!pf_exists("msitest\\siriometer"), "File not deleted\n");
3957 create_pf("msitest\\furlong", TRUE);
3958 create_pf("msitest\\firkin", TRUE);
3959 create_pf("msitest\\fortnight", TRUE);
3960 create_pf("msitest\\storeys", TRUE);
3961 create_pf("msitest\\block", TRUE);
3962 create_pf("msitest\\siriometer", TRUE);
3964 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3965 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3966 ok(!delete_pf("msitest\\helium", TRUE), "File not deleted\n");
3967 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
3968 ok(delete_pf("msitest\\furlong", TRUE), "File deleted\n");
3969 ok(delete_pf("msitest\\firkin", TRUE), "File deleted\n");
3970 ok(delete_pf("msitest\\fortnight", TRUE), "File deleted\n");
3971 ok(delete_pf("msitest\\attoparsec", TRUE), "File deleted\n");
3972 ok(delete_pf("msitest\\siriometer", TRUE), "File deleted\n");
3973 todo_wine
3975 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not deleted\n");
3976 ok(!delete_pf("msitest\\becquerel", TRUE), "File not deleted\n");
3977 ok(!delete_pf("msitest\\dioptre", TRUE), "File not deleted\n");
3978 ok(!delete_pf("msitest\\storeys", TRUE), "File not deleted\n");
3979 ok(!delete_pf("msitest\\block", TRUE), "File not deleted\n");
3981 ok(delete_pf("msitest", FALSE), "File deleted\n");
3983 DeleteFile(msifile);
3984 DeleteFile("msitest\\hydrogen");
3985 DeleteFile("msitest\\helium");
3986 DeleteFile("msitest\\lithium");
3987 RemoveDirectory("msitest");
3990 static void test_movefiles(void)
3992 UINT r;
3993 char props[MAX_PATH];
3995 CreateDirectoryA("msitest", NULL);
3996 create_file("msitest\\augustus", 100);
3997 create_file("cameroon", 100);
3998 create_file("djibouti", 100);
3999 create_file("egypt", 100);
4000 create_file("finland", 100);
4001 create_file("gambai", 100);
4002 create_file("honduras", 100);
4003 create_file("msitest\\india", 100);
4004 create_file("japan", 100);
4005 create_file("kenya", 100);
4006 CreateDirectoryA("latvia", NULL);
4007 create_file("nauru", 100);
4008 create_file("apple", 100);
4009 create_file("application", 100);
4010 create_file("ape", 100);
4011 create_file("foo", 100);
4012 create_file("fao", 100);
4013 create_file("fbod", 100);
4014 create_file("budding", 100);
4015 create_file("buddy", 100);
4016 create_file("bud", 100);
4017 create_file("bar", 100);
4018 create_file("bur", 100);
4019 create_file("bird", 100);
4021 create_database(msifile, mov_tables, sizeof(mov_tables) / sizeof(msi_table));
4023 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
4025 /* if the source or dest property is not a full path,
4026 * windows tries to access it as a network resource
4029 sprintf(props, "SOURCEFULL=\"%s\\\" DESTFULL=\"%s\\msitest\" "
4030 "FILEPATHBAD=\"%s\\japan\" FILEPATHGOOD=\"%s\\kenya\"",
4031 CURR_DIR, PROG_FILES_DIR, CURR_DIR, CURR_DIR);
4033 r = MsiInstallProductA(msifile, props);
4034 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4035 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
4036 ok(!delete_pf("msitest\\dest", TRUE), "File copied\n");
4037 ok(delete_pf("msitest\\canada", TRUE), "File not copied\n");
4038 ok(delete_pf("msitest\\dominica", TRUE), "File not moved\n");
4039 ok(!delete_pf("msitest\\elsalvador", TRUE), "File moved\n");
4040 ok(!delete_pf("msitest\\france", TRUE), "File moved\n");
4041 ok(!delete_pf("msitest\\georgia", TRUE), "File moved\n");
4042 ok(delete_pf("msitest\\hungary", TRUE), "File not moved\n");
4043 ok(!delete_pf("msitest\\indonesia", TRUE), "File moved\n");
4044 ok(!delete_pf("msitest\\jordan", TRUE), "File moved\n");
4045 ok(delete_pf("msitest\\kiribati", TRUE), "File not moved\n");
4046 ok(!delete_pf("msitest\\lebanon", TRUE), "File moved\n");
4047 ok(!delete_pf("msitest\\lebanon", FALSE), "Directory moved\n");
4048 /* either apple or application will be moved depending on directory order */
4049 if (!delete_pf("msitest\\apple", TRUE))
4050 ok(delete_pf("msitest\\application", TRUE), "File not moved\n");
4051 else
4052 ok(!delete_pf("msitest\\application", TRUE), "File should not exist\n");
4053 ok(delete_pf("msitest\\wildcard", TRUE), "File not moved\n");
4054 ok(!delete_pf("msitest\\ape", TRUE), "File moved\n");
4055 /* either fao or foo will be moved depending on directory order */
4056 if (delete_pf("msitest\\foo", TRUE))
4057 ok(!delete_pf("msitest\\fao", TRUE), "File should not exist\n");
4058 else
4059 ok(delete_pf("msitest\\fao", TRUE), "File not moved\n");
4060 ok(delete_pf("msitest\\single", TRUE), "File not moved\n");
4061 ok(!delete_pf("msitest\\fbod", TRUE), "File moved\n");
4062 ok(delete_pf("msitest\\budding", TRUE), "File not moved\n");
4063 ok(delete_pf("msitest\\buddy", TRUE), "File not moved\n");
4064 ok(!delete_pf("msitest\\bud", TRUE), "File moved\n");
4065 ok(delete_pf("msitest\\bar", TRUE), "File not moved\n");
4066 ok(delete_pf("msitest\\bur", TRUE), "File not moved\n");
4067 ok(!delete_pf("msitest\\bird", TRUE), "File moved\n");
4068 ok(delete_pf("msitest", FALSE), "File not installed\n");
4069 ok(DeleteFileA("cameroon"), "File moved\n");
4070 ok(!DeleteFileA("djibouti"), "File not moved\n");
4071 ok(DeleteFileA("egypt"), "File moved\n");
4072 ok(DeleteFileA("finland"), "File moved\n");
4073 ok(DeleteFileA("gambai"), "File moved\n");
4074 ok(!DeleteFileA("honduras"), "File not moved\n");
4075 ok(DeleteFileA("msitest\\india"), "File moved\n");
4076 ok(DeleteFileA("japan"), "File moved\n");
4077 ok(!DeleteFileA("kenya"), "File not moved\n");
4078 ok(RemoveDirectoryA("latvia"), "Directory moved\n");
4079 ok(!DeleteFileA("nauru"), "File not moved\n");
4080 ok(!DeleteFileA("apple"), "File not moved\n");
4081 ok(!DeleteFileA("application"), "File not moved\n");
4082 ok(DeleteFileA("ape"), "File moved\n");
4083 ok(!DeleteFileA("foo"), "File not moved\n");
4084 ok(!DeleteFileA("fao"), "File not moved\n");
4085 ok(DeleteFileA("fbod"), "File moved\n");
4086 ok(!DeleteFileA("budding"), "File not moved\n");
4087 ok(!DeleteFileA("buddy"), "File not moved\n");
4088 ok(DeleteFileA("bud"), "File moved\n");
4089 ok(!DeleteFileA("bar"), "File not moved\n");
4090 ok(!DeleteFileA("bur"), "File not moved\n");
4091 ok(DeleteFileA("bird"), "File moved\n");
4093 DeleteFile("msitest\\augustus");
4094 RemoveDirectory("msitest");
4095 DeleteFile(msifile);
4098 static void test_missingcab(void)
4100 UINT r;
4102 CreateDirectoryA("msitest", NULL);
4103 create_file("msitest\\augustus", 500);
4104 create_file("maximus", 500);
4106 create_database(msifile, mc_tables, sizeof(mc_tables) / sizeof(msi_table));
4108 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4110 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
4112 create_pf("msitest", FALSE);
4113 create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
4115 r = MsiInstallProductA(msifile, NULL);
4116 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4117 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
4118 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
4119 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
4120 ok(!delete_pf("msitest\\gaius", TRUE), "File installed\n");
4121 ok(delete_pf("msitest", FALSE), "File not installed\n");
4123 create_pf("msitest", FALSE);
4124 create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
4125 create_pf("msitest\\gaius", TRUE);
4127 r = MsiInstallProductA(msifile, "GAIUS=1");
4128 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4129 todo_wine
4131 ok(!delete_pf("msitest\\maximus", TRUE), "File installed\n");
4132 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4134 ok(delete_pf("msitest\\caesar", TRUE), "File removed\n");
4135 ok(delete_pf("msitest\\gaius", TRUE), "File removed\n");
4136 ok(delete_pf("msitest", FALSE), "File not installed\n");
4138 DeleteFile("msitest\\augustus");
4139 RemoveDirectory("msitest");
4140 DeleteFile("maximus");
4141 DeleteFile("test1.cab");
4142 DeleteFile(msifile);
4145 static void test_duplicatefiles(void)
4147 UINT r;
4149 CreateDirectoryA("msitest", NULL);
4150 create_file("msitest\\maximus", 500);
4151 create_database(msifile, df_tables, sizeof(df_tables) / sizeof(msi_table));
4153 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4155 /* fails if the destination folder is not a valid property */
4157 r = MsiInstallProductA(msifile, NULL);
4158 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4159 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
4160 ok(delete_pf("msitest\\augustus", TRUE), "File not duplicated\n");
4161 ok(delete_pf("msitest\\this\\doesnot\\exist\\maximus", TRUE), "File not duplicated\n");
4162 ok(delete_pf("msitest\\this\\doesnot\\exist", FALSE), "File not duplicated\n");
4163 ok(delete_pf("msitest\\this\\doesnot", FALSE), "File not duplicated\n");
4164 ok(delete_pf("msitest\\this", FALSE), "File not duplicated\n");
4165 ok(delete_pf("msitest", FALSE), "File not installed\n");
4167 DeleteFile("msitest\\maximus");
4168 RemoveDirectory("msitest");
4169 DeleteFile(msifile);
4172 static void test_writeregistryvalues(void)
4174 UINT r;
4175 LONG res;
4176 HKEY hkey;
4177 DWORD type, size;
4178 CHAR path[MAX_PATH];
4180 CreateDirectoryA("msitest", NULL);
4181 create_file("msitest\\augustus", 500);
4183 create_database(msifile, wrv_tables, sizeof(wrv_tables) / sizeof(msi_table));
4185 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4187 r = MsiInstallProductA(msifile, NULL);
4188 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4189 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
4190 ok(delete_pf("msitest", FALSE), "File installed\n");
4192 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
4193 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4195 size = MAX_PATH;
4196 type = REG_MULTI_SZ;
4197 memset(path, 'a', MAX_PATH);
4198 res = RegQueryValueExA(hkey, "Value", NULL, &type, (LPBYTE)path, &size);
4199 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4200 ok(!memcmp(path, "one\0two\0three\0\0", size), "Wrong multi-sz data\n");
4201 ok(size == 15, "Expected 15, got %d\n", size);
4202 ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
4204 DeleteFile(msifile);
4205 DeleteFile("msitest\\augustus");
4206 RemoveDirectory("msitest");
4208 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
4209 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine");
4212 static void test_sourcefolder(void)
4214 UINT r;
4216 CreateDirectoryA("msitest", NULL);
4217 create_file("augustus", 500);
4219 create_database(msifile, sf_tables, sizeof(sf_tables) / sizeof(msi_table));
4221 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4223 r = MsiInstallProductA(msifile, NULL);
4224 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4225 todo_wine
4227 ok(r == ERROR_INSTALL_FAILURE,
4228 "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4229 ok(!delete_pf("msitest", FALSE), "File installed\n");
4232 RemoveDirectoryA("msitest");
4234 r = MsiInstallProductA(msifile, NULL);
4235 todo_wine
4237 ok(r == ERROR_INSTALL_FAILURE,
4238 "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4239 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4240 ok(!delete_pf("msitest", FALSE), "File installed\n");
4243 DeleteFile(msifile);
4244 DeleteFile("augustus");
4247 static void test_customaction51(void)
4249 UINT r;
4251 CreateDirectoryA("msitest", NULL);
4252 create_file("msitest\\augustus", 500);
4254 create_database(msifile, ca51_tables, sizeof(ca51_tables) / sizeof(msi_table));
4256 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4258 r = MsiInstallProductA(msifile, NULL);
4259 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4260 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
4261 ok(delete_pf("msitest", FALSE), "File installed\n");
4263 DeleteFile(msifile);
4264 DeleteFile("msitest\\augustus");
4265 RemoveDirectory("msitest");
4268 static void test_installstate(void)
4270 UINT r;
4272 CreateDirectoryA("msitest", NULL);
4273 create_file("msitest\\alpha", 500);
4274 create_file("msitest\\beta", 500);
4275 create_file("msitest\\gamma", 500);
4276 create_file("msitest\\theta", 500);
4277 create_file("msitest\\delta", 500);
4278 create_file("msitest\\epsilon", 500);
4279 create_file("msitest\\zeta", 500);
4280 create_file("msitest\\iota", 500);
4281 create_file("msitest\\eta", 500);
4282 create_file("msitest\\kappa", 500);
4283 create_file("msitest\\lambda", 500);
4284 create_file("msitest\\mu", 500);
4286 create_database(msifile, is_tables, sizeof(is_tables) / sizeof(msi_table));
4288 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4290 r = MsiInstallProductA(msifile, NULL);
4291 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4292 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4293 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4294 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n");
4295 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4296 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4297 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4298 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n");
4299 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4300 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4301 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4302 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4303 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4304 ok(delete_pf("msitest", FALSE), "File not installed\n");
4306 r = MsiInstallProductA(msifile, "ADDLOCAL=\"one,two,three,four\"");
4307 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4308 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4309 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4310 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n");
4311 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4312 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4313 ok(delete_pf("msitest\\epsilon", TRUE), "File not installed\n");
4314 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n");
4315 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4316 ok(delete_pf("msitest\\eta", TRUE), "File not installed\n");
4317 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4318 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4319 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4320 ok(delete_pf("msitest", FALSE), "File not installed\n");
4322 r = MsiInstallProductA(msifile, "ADDSOURCE=\"one,two,three,four\"");
4323 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4324 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4325 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4326 ok(!delete_pf("msitest\\gamma", TRUE), "File installed\n");
4327 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4328 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4329 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4330 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n");
4331 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4332 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4333 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4334 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4335 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4336 ok(delete_pf("msitest", FALSE), "File not installed\n");
4338 r = MsiInstallProductA(msifile, "REMOVE=\"one,two,three,four\"");
4339 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4340 ok(!delete_pf("msitest\\alpha", TRUE), "File installed\n");
4341 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4342 ok(!delete_pf("msitest\\gamma", TRUE), "File installed\n");
4343 ok(!delete_pf("msitest\\theta", TRUE), "File installed\n");
4344 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4345 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4346 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n");
4347 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4348 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4349 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4350 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4351 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4352 ok(!delete_pf("msitest", FALSE), "File installed\n");
4354 DeleteFile(msifile);
4355 DeleteFile("msitest\\alpha");
4356 DeleteFile("msitest\\beta");
4357 DeleteFile("msitest\\gamma");
4358 DeleteFile("msitest\\theta");
4359 DeleteFile("msitest\\delta");
4360 DeleteFile("msitest\\epsilon");
4361 DeleteFile("msitest\\zeta");
4362 DeleteFile("msitest\\iota");
4363 DeleteFile("msitest\\eta");
4364 DeleteFile("msitest\\kappa");
4365 DeleteFile("msitest\\lambda");
4366 DeleteFile("msitest\\mu");
4367 RemoveDirectory("msitest");
4370 START_TEST(install)
4372 DWORD len;
4373 char temp_path[MAX_PATH], prev_path[MAX_PATH];
4375 init_functionpointers();
4377 GetCurrentDirectoryA(MAX_PATH, prev_path);
4378 GetTempPath(MAX_PATH, temp_path);
4379 SetCurrentDirectoryA(temp_path);
4381 lstrcpyA(CURR_DIR, temp_path);
4382 len = lstrlenA(CURR_DIR);
4384 if(len && (CURR_DIR[len - 1] == '\\'))
4385 CURR_DIR[len - 1] = 0;
4387 get_program_files_dir(PROG_FILES_DIR, COMMON_FILES_DIR);
4389 test_MsiInstallProduct();
4390 test_MsiSetComponentState();
4391 test_packagecoltypes();
4392 test_continuouscabs();
4393 test_caborder();
4394 test_mixedmedia();
4395 test_samesequence();
4396 test_uiLevelFlags();
4397 test_readonlyfile();
4398 test_setdirproperty();
4399 test_cabisextracted();
4400 test_concurrentinstall();
4401 test_setpropertyfolder();
4402 test_publish_registerproduct();
4403 test_publish_publishproduct();
4404 test_publish_publishfeatures();
4405 test_publish_registeruser();
4406 test_publish_processcomponents();
4407 test_publish();
4408 test_publishsourcelist();
4409 test_transformprop();
4410 test_currentworkingdir();
4411 test_admin();
4412 test_adminprops();
4413 test_removefiles();
4414 test_movefiles();
4415 test_missingcab();
4416 test_duplicatefiles();
4417 test_writeregistryvalues();
4418 test_sourcefolder();
4419 test_customaction51();
4420 test_installstate();
4422 SetCurrentDirectoryA(prev_path);