msi: Don't publish the upgrade key to an invalid location.
[wine.git] / dlls / msi / tests / install.c
blobf035650845d9f117cef8f0de4ff95d488125256f
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 void get_user_sid(LPSTR *usersid)
1172 HANDLE token;
1173 BYTE buf[1024];
1174 DWORD size;
1175 PTOKEN_USER user;
1176 HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
1177 static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
1179 *usersid = NULL;
1180 pConvertSidToStringSidA = (void *)GetProcAddress(hadvapi32, "ConvertSidToStringSidA");
1181 if (!pConvertSidToStringSidA)
1182 return;
1184 OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
1185 size = sizeof(buf);
1186 GetTokenInformation(token, TokenUser, (void *)buf, size, &size);
1187 user = (PTOKEN_USER)buf;
1188 pConvertSidToStringSidA(user->User.Sid, usersid);
1191 static BOOL check_record(MSIHANDLE rec, UINT field, LPCSTR val)
1193 CHAR buffer[0x20];
1194 UINT r;
1195 DWORD sz;
1197 sz = sizeof buffer;
1198 r = MsiRecordGetString(rec, field, buffer, &sz);
1199 return (r == ERROR_SUCCESS ) && !strcmp(val, buffer);
1202 static BOOL get_temp_file(char *pszTempName, int cbTempName, void *pv)
1204 LPSTR tempname;
1206 tempname = HeapAlloc(GetProcessHeap(), 0, MAX_PATH);
1207 GetTempFileNameA(".", "xx", 0, tempname);
1209 if (tempname && (strlen(tempname) < (unsigned)cbTempName))
1211 lstrcpyA(pszTempName, tempname);
1212 HeapFree(GetProcessHeap(), 0, tempname);
1213 return TRUE;
1216 HeapFree(GetProcessHeap(), 0, tempname);
1218 return FALSE;
1221 static INT_PTR get_open_info(char *pszName, USHORT *pdate, USHORT *ptime,
1222 USHORT *pattribs, int *err, void *pv)
1224 BY_HANDLE_FILE_INFORMATION finfo;
1225 FILETIME filetime;
1226 HANDLE handle;
1227 DWORD attrs;
1228 BOOL res;
1230 handle = CreateFile(pszName, GENERIC_READ, FILE_SHARE_READ, NULL,
1231 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
1233 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszName);
1235 res = GetFileInformationByHandle(handle, &finfo);
1236 ok(res, "Expected GetFileInformationByHandle to succeed\n");
1238 FileTimeToLocalFileTime(&finfo.ftLastWriteTime, &filetime);
1239 FileTimeToDosDateTime(&filetime, pdate, ptime);
1241 attrs = GetFileAttributes(pszName);
1242 ok(attrs != INVALID_FILE_ATTRIBUTES, "Failed to GetFileAttributes\n");
1244 return (INT_PTR)handle;
1247 static BOOL add_file(HFCI hfci, const char *file, TCOMP compress)
1249 char path[MAX_PATH];
1250 char filename[MAX_PATH];
1252 lstrcpyA(path, CURR_DIR);
1253 lstrcatA(path, "\\");
1254 lstrcatA(path, file);
1256 lstrcpyA(filename, file);
1258 return FCIAddFile(hfci, path, filename, FALSE, get_next_cabinet,
1259 progress, get_open_info, compress);
1262 static void set_cab_parameters(PCCAB pCabParams, const CHAR *name, DWORD max_size)
1264 ZeroMemory(pCabParams, sizeof(CCAB));
1266 pCabParams->cb = max_size;
1267 pCabParams->cbFolderThresh = FOLDER_THRESHOLD;
1268 pCabParams->setID = 0xbeef;
1269 pCabParams->iCab = 1;
1270 lstrcpyA(pCabParams->szCabPath, CURR_DIR);
1271 lstrcatA(pCabParams->szCabPath, "\\");
1272 lstrcpyA(pCabParams->szCab, name);
1275 static void create_cab_file(const CHAR *name, DWORD max_size, const CHAR *files)
1277 CCAB cabParams;
1278 LPCSTR ptr;
1279 HFCI hfci;
1280 ERF erf;
1281 BOOL res;
1283 set_cab_parameters(&cabParams, name, max_size);
1285 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open,
1286 fci_read, fci_write, fci_close, fci_seek, fci_delete,
1287 get_temp_file, &cabParams, NULL);
1289 ok(hfci != NULL, "Failed to create an FCI context\n");
1291 ptr = files;
1292 while (*ptr)
1294 res = add_file(hfci, ptr, tcompTYPE_MSZIP);
1295 ok(res, "Failed to add file: %s\n", ptr);
1296 ptr += lstrlen(ptr) + 1;
1299 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress);
1300 ok(res, "Failed to flush the cabinet\n");
1302 res = FCIDestroy(hfci);
1303 ok(res, "Failed to destroy the cabinet\n");
1306 static BOOL get_program_files_dir(LPSTR buf, LPSTR buf2)
1308 HKEY hkey;
1309 DWORD type, size;
1311 if (RegOpenKey(HKEY_LOCAL_MACHINE,
1312 "Software\\Microsoft\\Windows\\CurrentVersion", &hkey))
1313 return FALSE;
1315 size = MAX_PATH;
1316 if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)buf, &size)) {
1317 RegCloseKey(hkey);
1318 return FALSE;
1321 size = MAX_PATH;
1322 if (RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)buf2, &size)) {
1323 RegCloseKey(hkey);
1324 return FALSE;
1327 RegCloseKey(hkey);
1328 return TRUE;
1331 static void create_file_data(LPCSTR name, LPCSTR data, DWORD size)
1333 HANDLE file;
1334 DWORD written;
1336 file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
1337 ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name);
1338 WriteFile(file, data, strlen(data), &written, NULL);
1340 if (size)
1342 SetFilePointer(file, size, NULL, FILE_BEGIN);
1343 SetEndOfFile(file);
1346 CloseHandle(file);
1349 #define create_file(name, size) create_file_data(name, name, size)
1351 static void create_test_files(void)
1353 CreateDirectoryA("msitest", NULL);
1354 create_file("msitest\\one.txt", 100);
1355 CreateDirectoryA("msitest\\first", NULL);
1356 create_file("msitest\\first\\two.txt", 100);
1357 CreateDirectoryA("msitest\\second", NULL);
1358 create_file("msitest\\second\\three.txt", 100);
1360 create_file("four.txt", 100);
1361 create_file("five.txt", 100);
1362 create_cab_file("msitest.cab", MEDIA_SIZE, "four.txt\0five.txt\0");
1364 create_file("msitest\\filename", 100);
1365 create_file("msitest\\service.exe", 100);
1367 DeleteFileA("four.txt");
1368 DeleteFileA("five.txt");
1371 static BOOL delete_pf(const CHAR *rel_path, BOOL is_file)
1373 CHAR path[MAX_PATH];
1375 lstrcpyA(path, PROG_FILES_DIR);
1376 lstrcatA(path, "\\");
1377 lstrcatA(path, rel_path);
1379 if (is_file)
1380 return DeleteFileA(path);
1381 else
1382 return RemoveDirectoryA(path);
1385 static BOOL delete_cf(const CHAR *rel_path, BOOL is_file)
1387 CHAR path[MAX_PATH];
1389 lstrcpyA(path, COMMON_FILES_DIR);
1390 lstrcatA(path, "\\");
1391 lstrcatA(path, rel_path);
1393 if (is_file)
1394 return DeleteFileA(path);
1395 else
1396 return RemoveDirectoryA(path);
1399 static void delete_test_files(void)
1401 DeleteFileA("msitest.msi");
1402 DeleteFileA("msitest.cab");
1403 DeleteFileA("msitest\\second\\three.txt");
1404 DeleteFileA("msitest\\first\\two.txt");
1405 DeleteFileA("msitest\\one.txt");
1406 DeleteFileA("msitest\\service.exe");
1407 DeleteFileA("msitest\\filename");
1408 RemoveDirectoryA("msitest\\second");
1409 RemoveDirectoryA("msitest\\first");
1410 RemoveDirectoryA("msitest");
1413 static void write_file(const CHAR *filename, const char *data, int data_size)
1415 DWORD size;
1417 HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL,
1418 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
1420 WriteFile(hf, data, data_size, &size, NULL);
1421 CloseHandle(hf);
1424 static void write_msi_summary_info(MSIHANDLE db)
1426 MSIHANDLE summary;
1427 UINT r;
1429 r = MsiGetSummaryInformationA(db, NULL, 5, &summary);
1430 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1432 r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, ";1033");
1433 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1435 r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL,
1436 "{004757CA-5092-49c2-AD20-28E1CE0DF5F2}");
1437 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1439 r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, 100, NULL, NULL);
1440 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1442 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, 0, NULL, NULL);
1443 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1445 r = MsiSummaryInfoSetPropertyA(summary, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
1446 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1448 /* write the summary changes back to the stream */
1449 r = MsiSummaryInfoPersist(summary);
1450 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1452 MsiCloseHandle(summary);
1455 static void create_database(const CHAR *name, const msi_table *tables, int num_tables)
1457 MSIHANDLE db;
1458 UINT r;
1459 int j;
1461 r = MsiOpenDatabaseA(name, MSIDBOPEN_CREATE, &db);
1462 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1464 /* import the tables into the database */
1465 for (j = 0; j < num_tables; j++)
1467 const msi_table *table = &tables[j];
1469 write_file(table->filename, table->data, (table->size - 1) * sizeof(char));
1471 r = MsiDatabaseImportA(db, CURR_DIR, table->filename);
1472 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1474 DeleteFileA(table->filename);
1477 write_msi_summary_info(db);
1479 r = MsiDatabaseCommit(db);
1480 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1482 MsiCloseHandle(db);
1485 static void check_service_is_installed(void)
1487 SC_HANDLE scm, service;
1488 BOOL res;
1490 scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
1491 ok(scm != NULL, "Failed to open the SC Manager\n");
1493 service = OpenService(scm, "TestService", SC_MANAGER_ALL_ACCESS);
1494 ok(service != NULL, "Failed to open TestService\n");
1496 res = DeleteService(service);
1497 ok(res, "Failed to delete TestService\n");
1499 CloseServiceHandle(service);
1500 CloseServiceHandle(scm);
1503 static void test_MsiInstallProduct(void)
1505 UINT r;
1506 CHAR path[MAX_PATH];
1507 LONG res;
1508 HKEY hkey;
1509 DWORD num, size, type;
1510 SC_HANDLE scm;
1512 scm = OpenSCManager(NULL, NULL, GENERIC_ALL);
1513 if (!scm && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED))
1515 skip("Services are not implemented, we are most likely on win9x\n");
1516 return;
1518 CloseServiceHandle(scm);
1520 create_test_files();
1521 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
1523 r = MsiInstallProductA(msifile, NULL);
1524 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1526 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
1527 ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
1528 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
1529 ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
1530 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
1531 ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
1532 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
1533 ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
1534 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
1535 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
1536 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
1537 ok(delete_pf("msitest", FALSE), "File not installed\n");
1539 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
1540 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1542 size = MAX_PATH;
1543 type = REG_SZ;
1544 res = RegQueryValueExA(hkey, "Name", NULL, &type, (LPBYTE)path, &size);
1545 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1546 ok(!lstrcmpA(path, "imaname"), "Expected imaname, got %s\n", path);
1548 size = MAX_PATH;
1549 type = REG_SZ;
1550 res = RegQueryValueExA(hkey, "blah", NULL, &type, (LPBYTE)path, &size);
1551 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
1553 size = sizeof(num);
1554 type = REG_DWORD;
1555 res = RegQueryValueExA(hkey, "number", NULL, &type, (LPBYTE)&num, &size);
1556 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1557 ok(num == 314, "Expected 314, got %d\n", num);
1559 size = MAX_PATH;
1560 type = REG_SZ;
1561 res = RegQueryValueExA(hkey, "OrderTestName", NULL, &type, (LPBYTE)path, &size);
1562 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1563 ok(!lstrcmpA(path, "OrderTestValue"), "Expected imaname, got %s\n", path);
1565 check_service_is_installed();
1567 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
1569 delete_test_files();
1572 static void test_MsiSetComponentState(void)
1574 INSTALLSTATE installed, action;
1575 MSIHANDLE package;
1576 char path[MAX_PATH];
1577 UINT r;
1579 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
1581 CoInitialize(NULL);
1583 lstrcpy(path, CURR_DIR);
1584 lstrcat(path, "\\");
1585 lstrcat(path, msifile);
1587 r = MsiOpenPackage(path, &package);
1588 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1590 r = MsiDoAction(package, "CostInitialize");
1591 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1593 r = MsiDoAction(package, "FileCost");
1594 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1596 r = MsiDoAction(package, "CostFinalize");
1597 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1599 r = MsiGetComponentState(package, "dangler", &installed, &action);
1600 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1601 ok(installed == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", installed);
1602 ok(action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
1604 r = MsiSetComponentState(package, "dangler", INSTALLSTATE_SOURCE);
1605 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1607 MsiCloseHandle(package);
1608 CoUninitialize();
1610 DeleteFileA(msifile);
1613 static void test_packagecoltypes(void)
1615 MSIHANDLE hdb, view, rec;
1616 char path[MAX_PATH];
1617 LPCSTR query;
1618 UINT r, count;
1620 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table));
1622 CoInitialize(NULL);
1624 lstrcpy(path, CURR_DIR);
1625 lstrcat(path, "\\");
1626 lstrcat(path, msifile);
1628 r = MsiOpenDatabase(path, MSIDBOPEN_READONLY, &hdb);
1629 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1631 query = "SELECT * FROM `Media`";
1632 r = MsiDatabaseOpenView( hdb, query, &view );
1633 ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
1635 r = MsiViewGetColumnInfo( view, MSICOLINFO_NAMES, &rec );
1636 count = MsiRecordGetFieldCount( rec );
1637 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n");
1638 ok(count == 6, "Expected 6, got %d\n", count);
1639 ok(check_record(rec, 1, "DiskId"), "wrong column label\n");
1640 ok(check_record(rec, 2, "LastSequence"), "wrong column label\n");
1641 ok(check_record(rec, 3, "DiskPrompt"), "wrong column label\n");
1642 ok(check_record(rec, 4, "Cabinet"), "wrong column label\n");
1643 ok(check_record(rec, 5, "VolumeLabel"), "wrong column label\n");
1644 ok(check_record(rec, 6, "Source"), "wrong column label\n");
1645 MsiCloseHandle(rec);
1647 r = MsiViewGetColumnInfo( view, MSICOLINFO_TYPES, &rec );
1648 count = MsiRecordGetFieldCount( rec );
1649 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n");
1650 ok(count == 6, "Expected 6, got %d\n", count);
1651 ok(check_record(rec, 1, "i2"), "wrong column label\n");
1652 ok(check_record(rec, 2, "i4"), "wrong column label\n");
1653 ok(check_record(rec, 3, "L64"), "wrong column label\n");
1654 ok(check_record(rec, 4, "S255"), "wrong column label\n");
1655 ok(check_record(rec, 5, "S32"), "wrong column label\n");
1656 ok(check_record(rec, 6, "S72"), "wrong column label\n");
1658 MsiCloseHandle(rec);
1659 MsiCloseHandle(view);
1660 MsiCloseHandle(hdb);
1661 DeleteFile(msifile);
1664 static void create_cc_test_files(void)
1666 CCAB cabParams;
1667 HFCI hfci;
1668 ERF erf;
1669 static CHAR cab_context[] = "test%d.cab";
1670 BOOL res;
1672 create_file("maximus", 500);
1673 create_file("augustus", 50000);
1674 create_file("tiberius", 500);
1675 create_file("caesar", 500);
1677 set_cab_parameters(&cabParams, "test1.cab", 40000);
1679 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open,
1680 fci_read, fci_write, fci_close, fci_seek, fci_delete,
1681 get_temp_file, &cabParams, cab_context);
1682 ok(hfci != NULL, "Failed to create an FCI context\n");
1684 res = add_file(hfci, "maximus", tcompTYPE_NONE);
1685 ok(res, "Failed to add file maximus\n");
1687 res = add_file(hfci, "augustus", tcompTYPE_NONE);
1688 ok(res, "Failed to add file augustus\n");
1690 res = add_file(hfci, "tiberius", tcompTYPE_NONE);
1691 ok(res, "Failed to add file tiberius\n");
1693 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress);
1694 ok(res, "Failed to flush the cabinet\n");
1696 res = FCIDestroy(hfci);
1697 ok(res, "Failed to destroy the cabinet\n");
1699 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
1701 DeleteFile("maximus");
1702 DeleteFile("augustus");
1703 DeleteFile("tiberius");
1704 DeleteFile("caesar");
1707 static void delete_cab_files(void)
1709 SHFILEOPSTRUCT shfl;
1710 CHAR path[MAX_PATH+10];
1712 lstrcpyA(path, CURR_DIR);
1713 lstrcatA(path, "\\*.cab");
1714 path[strlen(path) + 1] = '\0';
1716 shfl.hwnd = NULL;
1717 shfl.wFunc = FO_DELETE;
1718 shfl.pFrom = path;
1719 shfl.pTo = NULL;
1720 shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT;
1722 SHFileOperation(&shfl);
1725 static void test_continuouscabs(void)
1727 UINT r;
1729 create_cc_test_files();
1730 create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table));
1732 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1734 r = MsiInstallProductA(msifile, NULL);
1735 if (r == ERROR_SUCCESS) /* win9x has a problem with this */
1737 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1738 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
1739 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1740 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1741 ok(delete_pf("msitest", FALSE), "File not installed\n");
1744 delete_cab_files();
1745 DeleteFile(msifile);
1747 create_cc_test_files();
1748 create_database(msifile, cc2_tables, sizeof(cc2_tables) / sizeof(msi_table));
1750 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1752 r = MsiInstallProductA(msifile, NULL);
1753 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1754 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1755 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
1756 ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n");
1757 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1758 ok(delete_pf("msitest", FALSE), "File not installed\n");
1760 delete_cab_files();
1761 DeleteFile(msifile);
1764 static void test_caborder(void)
1766 UINT r;
1768 create_file("imperator", 100);
1769 create_file("maximus", 500);
1770 create_file("augustus", 50000);
1771 create_file("caesar", 500);
1773 create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table));
1775 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1777 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
1778 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0");
1779 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
1781 r = MsiInstallProductA(msifile, NULL);
1782 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
1783 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
1784 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
1785 todo_wine
1787 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
1788 ok(!delete_pf("msitest", FALSE), "File is installed\n");
1791 delete_cab_files();
1793 create_cab_file("test1.cab", MEDIA_SIZE, "imperator\0");
1794 create_cab_file("test2.cab", MEDIA_SIZE, "maximus\0augustus\0");
1795 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
1797 r = MsiInstallProductA(msifile, NULL);
1798 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
1799 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
1800 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
1801 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
1802 todo_wine
1804 ok(!delete_pf("msitest", FALSE), "File is installed\n");
1807 delete_cab_files();
1808 DeleteFile(msifile);
1810 create_cc_test_files();
1811 create_database(msifile, co_tables, sizeof(co_tables) / sizeof(msi_table));
1813 r = MsiInstallProductA(msifile, NULL);
1814 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
1815 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
1816 ok(!delete_pf("msitest", FALSE), "File is installed\n");
1817 todo_wine
1819 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
1820 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
1823 delete_cab_files();
1824 DeleteFile(msifile);
1826 create_cc_test_files();
1827 create_database(msifile, co2_tables, sizeof(co2_tables) / sizeof(msi_table));
1829 r = MsiInstallProductA(msifile, NULL);
1830 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n");
1831 todo_wine
1833 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
1834 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n");
1835 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n");
1836 ok(!delete_pf("msitest", FALSE), "File is installed\n");
1839 delete_cab_files();
1840 DeleteFile("imperator");
1841 DeleteFile("maximus");
1842 DeleteFile("augustus");
1843 DeleteFile("caesar");
1844 DeleteFile(msifile);
1847 static void test_mixedmedia(void)
1849 UINT r;
1851 CreateDirectoryA("msitest", NULL);
1852 create_file("msitest\\maximus", 500);
1853 create_file("msitest\\augustus", 500);
1854 create_file("caesar", 500);
1856 create_database(msifile, mm_tables, sizeof(mm_tables) / sizeof(msi_table));
1858 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1860 create_cab_file("test1.cab", MEDIA_SIZE, "caesar\0");
1862 r = MsiInstallProductA(msifile, NULL);
1863 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1864 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
1865 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1866 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1867 ok(delete_pf("msitest", FALSE), "File not installed\n");
1869 /* Delete the files in the temp (current) folder */
1870 DeleteFile("msitest\\maximus");
1871 DeleteFile("msitest\\augustus");
1872 RemoveDirectory("msitest");
1873 DeleteFile("caesar");
1874 DeleteFile("test1.cab");
1875 DeleteFile(msifile);
1878 static void test_samesequence(void)
1880 UINT r;
1882 create_cc_test_files();
1883 create_database(msifile, ss_tables, sizeof(ss_tables) / sizeof(msi_table));
1885 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1887 r = MsiInstallProductA(msifile, NULL);
1888 if (r == ERROR_SUCCESS) /* win9x has a problem with this */
1890 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1891 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
1892 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1893 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1894 ok(delete_pf("msitest", FALSE), "File not installed\n");
1897 delete_cab_files();
1898 DeleteFile(msifile);
1901 static void test_uiLevelFlags(void)
1903 UINT r;
1905 create_cc_test_files();
1906 create_database(msifile, ui_tables, sizeof(ui_tables) / sizeof(msi_table));
1908 MsiSetInternalUI(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY, NULL);
1910 r = MsiInstallProductA(msifile, NULL);
1911 if (r == ERROR_SUCCESS) /* win9x has a problem with this */
1913 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1914 ok(!delete_pf("msitest\\maximus", TRUE), "UI install occurred, but execute-only was requested.\n");
1915 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
1916 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
1917 ok(delete_pf("msitest", FALSE), "File not installed\n");
1920 delete_cab_files();
1921 DeleteFile(msifile);
1924 static BOOL file_matches(LPSTR path)
1926 CHAR buf[MAX_PATH];
1927 HANDLE file;
1928 DWORD size;
1930 file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
1931 NULL, OPEN_EXISTING, 0, NULL);
1933 ZeroMemory(buf, MAX_PATH);
1934 ReadFile(file, buf, 15, &size, NULL);
1935 CloseHandle(file);
1937 return !lstrcmp(buf, "msitest\\maximus");
1940 static void test_readonlyfile(void)
1942 UINT r;
1943 DWORD size;
1944 HANDLE file;
1945 CHAR path[MAX_PATH];
1947 CreateDirectoryA("msitest", NULL);
1948 create_file("msitest\\maximus", 500);
1949 create_database(msifile, rof_tables, sizeof(rof_tables) / sizeof(msi_table));
1951 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1953 lstrcpy(path, PROG_FILES_DIR);
1954 lstrcat(path, "\\msitest");
1955 CreateDirectory(path, NULL);
1957 lstrcat(path, "\\maximus");
1958 file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
1959 NULL, CREATE_NEW, FILE_ATTRIBUTE_READONLY, NULL);
1961 WriteFile(file, "readonlyfile", 20, &size, NULL);
1962 CloseHandle(file);
1964 r = MsiInstallProductA(msifile, NULL);
1965 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1966 ok(file_matches(path), "Expected file to be overwritten\n");
1967 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
1968 ok(delete_pf("msitest", FALSE), "File not installed\n");
1970 /* Delete the files in the temp (current) folder */
1971 DeleteFile("msitest\\maximus");
1972 RemoveDirectory("msitest");
1973 DeleteFile(msifile);
1976 static void test_setdirproperty(void)
1978 UINT r;
1980 CreateDirectoryA("msitest", NULL);
1981 create_file("msitest\\maximus", 500);
1982 create_database(msifile, sdp_tables, sizeof(sdp_tables) / sizeof(msi_table));
1984 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
1986 r = MsiInstallProductA(msifile, NULL);
1987 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
1988 ok(delete_cf("msitest\\maximus", TRUE), "File not installed\n");
1989 ok(delete_cf("msitest", FALSE), "File not installed\n");
1991 /* Delete the files in the temp (current) folder */
1992 DeleteFile(msifile);
1993 DeleteFile("msitest\\maximus");
1994 RemoveDirectory("msitest");
1997 static void test_cabisextracted(void)
1999 UINT r;
2001 CreateDirectoryA("msitest", NULL);
2002 create_file("msitest\\gaius", 500);
2003 create_file("maximus", 500);
2004 create_file("augustus", 500);
2005 create_file("caesar", 500);
2007 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
2008 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0");
2009 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0");
2011 create_database(msifile, cie_tables, sizeof(cie_tables) / sizeof(msi_table));
2013 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
2015 r = MsiInstallProductA(msifile, NULL);
2016 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2017 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2018 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
2019 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
2020 ok(delete_pf("msitest\\gaius", TRUE), "File not installed\n");
2021 ok(delete_pf("msitest", FALSE), "File not installed\n");
2023 /* Delete the files in the temp (current) folder */
2024 delete_cab_files();
2025 DeleteFile(msifile);
2026 DeleteFile("maximus");
2027 DeleteFile("augustus");
2028 DeleteFile("caesar");
2029 DeleteFile("msitest\\gaius");
2030 RemoveDirectory("msitest");
2033 static void test_concurrentinstall(void)
2035 UINT r;
2036 CHAR path[MAX_PATH];
2038 CreateDirectoryA("msitest", NULL);
2039 CreateDirectoryA("msitest\\msitest", NULL);
2040 create_file("msitest\\maximus", 500);
2041 create_file("msitest\\msitest\\augustus", 500);
2043 create_database(msifile, ci_tables, sizeof(ci_tables) / sizeof(msi_table));
2045 lstrcpyA(path, CURR_DIR);
2046 lstrcatA(path, "\\msitest\\concurrent.msi");
2047 create_database(path, ci2_tables, sizeof(ci2_tables) / sizeof(msi_table));
2049 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2051 r = MsiInstallProductA(msifile, NULL);
2052 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2053 if (!delete_pf("msitest\\augustus", TRUE))
2054 trace("concurrent installs not supported\n");
2055 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2056 ok(delete_pf("msitest", FALSE), "File not installed\n");
2058 DeleteFile(path);
2060 r = MsiInstallProductA(msifile, NULL);
2061 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2062 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2063 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
2064 ok(delete_pf("msitest", FALSE), "File not installed\n");
2066 DeleteFile(msifile);
2067 DeleteFile("msitest\\msitest\\augustus");
2068 DeleteFile("msitest\\maximus");
2069 RemoveDirectory("msitest\\msitest");
2070 RemoveDirectory("msitest");
2073 static void test_setpropertyfolder(void)
2075 UINT r;
2076 CHAR path[MAX_PATH];
2078 lstrcpyA(path, PROG_FILES_DIR);
2079 lstrcatA(path, "\\msitest\\added");
2081 CreateDirectoryA("msitest", NULL);
2082 create_file("msitest\\maximus", 500);
2084 create_database(msifile, spf_tables, sizeof(spf_tables) / sizeof(msi_table));
2086 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2088 r = MsiInstallProductA(msifile, NULL);
2089 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2090 if (GetFileAttributesA(path) == FILE_ATTRIBUTE_DIRECTORY)
2092 ok(delete_pf("msitest\\added\\maximus", TRUE), "File not installed\n");
2093 ok(delete_pf("msitest\\added", FALSE), "File not installed\n");
2094 ok(delete_pf("msitest", FALSE), "File not installed\n");
2096 else
2098 trace("changing folder property not supported\n");
2099 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2100 ok(delete_pf("msitest", FALSE), "File not installed\n");
2103 /* Delete the files in the temp (current) folder */
2104 DeleteFile(msifile);
2105 DeleteFile("msitest\\maximus");
2106 RemoveDirectory("msitest");
2109 static BOOL file_exists(LPCSTR file)
2111 return GetFileAttributes(file) != INVALID_FILE_ATTRIBUTES;
2114 static BOOL pf_exists(LPCSTR file)
2116 CHAR path[MAX_PATH];
2118 lstrcpyA(path, PROG_FILES_DIR);
2119 lstrcatA(path, "\\");
2120 lstrcatA(path, file);
2122 return file_exists(path);
2125 static void delete_pfmsitest_files(void)
2127 SHFILEOPSTRUCT shfl;
2128 CHAR path[MAX_PATH+11];
2130 lstrcpyA(path, PROG_FILES_DIR);
2131 lstrcatA(path, "\\msitest\\*");
2132 path[strlen(path) + 1] = '\0';
2134 shfl.hwnd = NULL;
2135 shfl.wFunc = FO_DELETE;
2136 shfl.pFrom = path;
2137 shfl.pTo = NULL;
2138 shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT;
2140 SHFileOperation(&shfl);
2142 lstrcpyA(path, PROG_FILES_DIR);
2143 lstrcatA(path, "\\msitest");
2144 RemoveDirectoryA(path);
2147 static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase, DWORD line)
2149 char val[MAX_PATH];
2150 DWORD size, type;
2151 LONG res;
2153 size = MAX_PATH;
2154 val[0] = '\0';
2155 res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)val, &size);
2157 if (res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ))
2159 ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
2160 return;
2163 if (!expected)
2164 ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val);
2165 else
2167 if (bcase)
2168 ok_(__FILE__, line)(!lstrcmpA(val, expected), "Expected %s, got %s\n", expected, val);
2169 else
2170 ok_(__FILE__, line)(!lstrcmpiA(val, expected), "Expected %s, got %s\n", expected, val);
2174 static void check_reg_dword(HKEY prodkey, LPCSTR name, DWORD expected, DWORD line)
2176 DWORD val, size, type;
2177 LONG res;
2179 size = sizeof(DWORD);
2180 res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size);
2182 if (res != ERROR_SUCCESS || type != REG_DWORD)
2184 ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
2185 return;
2188 ok_(__FILE__, line)(val == expected, "Expected %d, got %d\n", expected, val);
2191 #define CHECK_REG_STR(prodkey, name, expected) \
2192 check_reg_str(prodkey, name, expected, TRUE, __LINE__);
2194 #define CHECK_DEL_REG_STR(prodkey, name, expected) \
2195 check_reg_str(prodkey, name, expected, TRUE, __LINE__); \
2196 RegDeleteValueA(prodkey, name);
2198 #define CHECK_REG_ISTR(prodkey, name, expected) \
2199 check_reg_str(prodkey, name, expected, FALSE, __LINE__);
2201 #define CHECK_DEL_REG_ISTR(prodkey, name, expected) \
2202 check_reg_str(prodkey, name, expected, FALSE, __LINE__); \
2203 RegDeleteValueA(prodkey, name);
2205 #define CHECK_REG_DWORD(prodkey, name, expected) \
2206 check_reg_dword(prodkey, name, expected, __LINE__);
2208 #define CHECK_DEL_REG_DWORD(prodkey, name, expected) \
2209 check_reg_dword(prodkey, name, expected, __LINE__); \
2210 RegDeleteValueA(prodkey, name);
2212 static void get_date_str(LPSTR date)
2214 SYSTEMTIME systime;
2216 static const char date_fmt[] = "%d%02d%02d";
2217 GetLocalTime(&systime);
2218 sprintf(date, date_fmt, systime.wYear, systime.wMonth, systime.wDay);
2221 static void test_publish_registerproduct(void)
2223 UINT r;
2224 LONG res;
2225 HKEY hkey;
2226 HKEY props, usage;
2227 LPSTR usersid;
2228 char date[MAX_PATH];
2229 char temp[MAX_PATH];
2230 char keypath[MAX_PATH];
2232 static const CHAR uninstall[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2233 "\\Uninstall\\{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2234 static const CHAR userdata[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer"
2235 "\\UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2236 static const CHAR ugkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer"
2237 "\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
2238 static const CHAR userugkey[] = "Software\\Microsoft\\Installer\\UpgradeCodes"
2239 "\\51AAE0C44620A5E4788506E91F249BD2";
2241 get_user_sid(&usersid);
2242 get_date_str(date);
2243 GetTempPath(MAX_PATH, temp);
2245 CreateDirectoryA("msitest", NULL);
2246 create_file("msitest\\maximus", 500);
2248 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2250 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2252 /* RegisterProduct */
2253 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
2254 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2255 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2256 ok(delete_pf("msitest", FALSE), "File not installed\n");
2258 res = RegOpenKeyA(HKEY_CURRENT_USER, userugkey, &hkey);
2259 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2261 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, uninstall, &hkey);
2262 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2264 CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST");
2265 CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1");
2266 CHECK_DEL_REG_STR(hkey, "InstallDate", date);
2267 CHECK_DEL_REG_STR(hkey, "InstallSource", temp);
2268 CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2269 CHECK_DEL_REG_STR(hkey, "Publisher", "Wine");
2270 CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2271 CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", NULL);
2272 CHECK_DEL_REG_STR(hkey, "Comments", NULL);
2273 CHECK_DEL_REG_STR(hkey, "Contact", NULL);
2274 CHECK_DEL_REG_STR(hkey, "HelpLink", NULL);
2275 CHECK_DEL_REG_STR(hkey, "HelpTelephone", NULL);
2276 CHECK_DEL_REG_STR(hkey, "InstallLocation", NULL);
2277 CHECK_DEL_REG_STR(hkey, "Readme", NULL);
2278 CHECK_DEL_REG_STR(hkey, "Size", NULL);
2279 CHECK_DEL_REG_STR(hkey, "URLInfoAbout", NULL);
2280 CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", NULL);
2281 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2282 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2283 CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1);
2284 CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1);
2285 CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1);
2286 todo_wine
2288 CHECK_DEL_REG_DWORD(hkey, "EstimatedSize", 12);
2291 RegDeleteKeyA(hkey, "");
2292 RegCloseKey(hkey);
2294 sprintf(keypath, userdata, usersid);
2295 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey);
2296 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2298 res = RegOpenKeyA(hkey, "InstallProperties", &props);
2299 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2301 RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */
2302 CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST");
2303 CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1");
2304 CHECK_DEL_REG_STR(props, "InstallDate", date);
2305 CHECK_DEL_REG_STR(props, "InstallSource", temp);
2306 CHECK_DEL_REG_DWORD(props, "VersionMajor", 1);
2307 CHECK_DEL_REG_DWORD(props, "VersionMinor", 1);
2308 CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1);
2309 CHECK_DEL_REG_STR(props, "Publisher", "Wine");
2310 CHECK_DEL_REG_DWORD(props, "Version", 0x1010001);
2311 todo_wine
2313 CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2314 CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2315 CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", NULL);
2316 CHECK_DEL_REG_STR(props, "Comments", NULL);
2317 CHECK_DEL_REG_STR(props, "Contact", NULL);
2318 CHECK_DEL_REG_STR(props, "HelpLink", NULL);
2319 CHECK_DEL_REG_STR(props, "HelpTelephone", NULL);
2320 CHECK_DEL_REG_STR(props, "InstallLocation", NULL);
2321 CHECK_DEL_REG_STR(props, "Readme", NULL);
2322 CHECK_DEL_REG_STR(props, "Size", NULL);
2323 CHECK_DEL_REG_STR(props, "URLInfoAbout", NULL);
2324 CHECK_DEL_REG_STR(props, "URLUpdateInfo", NULL);
2325 CHECK_DEL_REG_DWORD(props, "Language", 1033);
2326 CHECK_DEL_REG_DWORD(props, "EstimatedSize", 12);
2329 RegDeleteKeyA(props, "");
2330 RegCloseKey(props);
2332 res = RegOpenKeyA(hkey, "Usage", &usage);
2333 todo_wine
2335 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2338 RegDeleteKeyA(usage, "");
2339 RegCloseKey(usage);
2340 RegDeleteKeyA(hkey, "");
2341 RegCloseKey(hkey);
2343 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, ugkey, &hkey);
2344 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2346 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL);
2348 RegDeleteKeyA(hkey, "");
2349 RegCloseKey(hkey);
2351 DeleteFile(msifile);
2352 DeleteFile("msitest\\maximus");
2353 RemoveDirectory("msitest");
2354 HeapFree(GetProcessHeap(), 0, usersid);
2357 static void test_publish_publishproduct(void)
2359 UINT r;
2360 LONG res;
2361 HKEY uninstall, prodkey;
2362 INSTALLSTATE state;
2363 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2365 static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2367 if (!pMsiQueryComponentStateA)
2369 skip("MsiQueryComponentStateA is not available\n");
2370 return;
2373 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &uninstall);
2374 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2376 CreateDirectoryA("msitest", NULL);
2377 create_file("msitest\\maximus", 500);
2379 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2381 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2383 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2384 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2386 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2387 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2389 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2390 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2392 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2393 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2394 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2395 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2397 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2398 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2400 /* PublishProduct */
2401 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
2402 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2403 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2404 ok(pf_exists("msitest"), "File not installed\n");
2406 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2407 ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
2409 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2410 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2412 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2413 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2415 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2416 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2417 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
2418 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2420 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2421 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2423 /* try to uninstall after PublishProduct */
2424 r = MsiInstallProductA(msifile, "REMOVE=ALL");
2425 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2426 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2427 ok(pf_exists("msitest"), "File deleted\n");
2429 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2430 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2432 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2433 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2435 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2436 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2438 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2439 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2440 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2441 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2443 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2444 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2446 /* full install to remove */
2447 r = MsiInstallProductA(msifile, "FULL=1");
2448 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2449 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
2450 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2452 RegCloseKey(uninstall);
2453 DeleteFile(msifile);
2454 DeleteFile("msitest\\maximus");
2455 RemoveDirectory("msitest");
2456 delete_pfmsitest_files();
2459 static void test_publish_publishfeatures(void)
2461 UINT r;
2462 LONG res;
2463 HKEY hkey;
2464 LPSTR usersid;
2465 CHAR keypath[MAX_PATH];
2467 static const CHAR cupath[] = "Software\\Microsoft\\Installer\\Features"
2468 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2469 static const CHAR udpath[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2470 "\\Installer\\UserData\\%s\\Products"
2471 "\\84A88FD7F6998CE40A22FB59F6B9C2BB\\Features";
2472 static const CHAR featkey[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2473 "\\Installer\\Features";
2474 static const CHAR classfeat[] = "Software\\Classes\\Installer\\Features"
2475 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2477 get_user_sid(&usersid);
2478 if (!usersid)
2480 skip("ConvertSidToStringSidA is not available\n");
2481 return;
2484 CreateDirectoryA("msitest", NULL);
2485 create_file("msitest\\maximus", 500);
2487 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2489 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2491 /* PublishFeatures, current user */
2492 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1");
2493 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2494 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2495 ok(delete_pf("msitest", FALSE), "File not installed\n");
2497 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, featkey, &hkey);
2498 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2500 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, classfeat, &hkey);
2501 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2503 res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey);
2504 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2506 CHECK_REG_STR(hkey, "feature", "");
2507 CHECK_REG_STR(hkey, "montecristo", "");
2509 RegDeleteValueA(hkey, "feature");
2510 RegDeleteValueA(hkey, "montecristo");
2511 RegDeleteKeyA(hkey, "");
2512 RegCloseKey(hkey);
2514 sprintf(keypath, udpath, usersid);
2515 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey);
2516 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2518 CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE");
2519 CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE");
2521 RegDeleteValueA(hkey, "feature");
2522 RegDeleteValueA(hkey, "montecristo");
2523 RegDeleteKeyA(hkey, "");
2524 RegCloseKey(hkey);
2526 /* PublishFeatures, machine */
2527 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1 ALLUSERS=1");
2528 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2529 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2530 ok(delete_pf("msitest", FALSE), "File not installed\n");
2532 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, featkey, &hkey);
2533 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2535 res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey);
2536 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2538 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, classfeat, &hkey);
2539 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2541 CHECK_REG_STR(hkey, "feature", "");
2542 CHECK_REG_STR(hkey, "montecristo", "");
2544 RegDeleteValueA(hkey, "feature");
2545 RegDeleteValueA(hkey, "montecristo");
2546 RegDeleteKeyA(hkey, "");
2547 RegCloseKey(hkey);
2549 sprintf(keypath, udpath, "S-1-5-18");
2550 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey);
2551 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2553 CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE");
2554 CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE");
2556 RegDeleteValueA(hkey, "feature");
2557 RegDeleteValueA(hkey, "montecristo");
2558 RegDeleteKeyA(hkey, "");
2559 RegCloseKey(hkey);
2561 DeleteFile(msifile);
2562 DeleteFile("msitest\\maximus");
2563 RemoveDirectory("msitest");
2564 HeapFree(GetProcessHeap(), 0, usersid);
2567 static LPSTR reg_get_val_str(HKEY hkey, LPCSTR name)
2569 DWORD len = 0;
2570 LPSTR val;
2571 LONG r;
2573 r = RegQueryValueExA(hkey, name, NULL, NULL, NULL, &len);
2574 if (r != ERROR_SUCCESS)
2575 return NULL;
2577 len += sizeof (WCHAR);
2578 val = HeapAlloc(GetProcessHeap(), 0, len);
2579 if (!val) return NULL;
2580 val[0] = 0;
2581 RegQueryValueExA(hkey, name, NULL, NULL, (LPBYTE)val, &len);
2582 return val;
2585 static void get_owner_company(LPSTR *owner, LPSTR *company)
2587 LONG res;
2588 HKEY hkey;
2590 *owner = *company = NULL;
2592 res = RegOpenKeyA(HKEY_CURRENT_USER,
2593 "Software\\Microsoft\\MS Setup (ACME)\\User Info", &hkey);
2594 if (res == ERROR_SUCCESS)
2596 *owner = reg_get_val_str(hkey, "DefName");
2597 *company = reg_get_val_str(hkey, "DefCompany");
2598 RegCloseKey(hkey);
2601 if (!*owner || !*company)
2603 res = RegOpenKeyA(HKEY_LOCAL_MACHINE,
2604 "Software\\Microsoft\\Windows\\CurrentVersion", &hkey);
2605 if (res == ERROR_SUCCESS)
2607 *owner = reg_get_val_str(hkey, "RegisteredOwner");
2608 *company = reg_get_val_str(hkey, "RegisteredOrganization");
2609 RegCloseKey(hkey);
2613 if (!*owner || !*company)
2615 res = RegOpenKeyA(HKEY_LOCAL_MACHINE,
2616 "Software\\Microsoft\\Windows NT\\CurrentVersion", &hkey);
2617 if (res == ERROR_SUCCESS)
2619 *owner = reg_get_val_str(hkey, "RegisteredOwner");
2620 *company = reg_get_val_str(hkey, "RegisteredOrganization");
2621 RegCloseKey(hkey);
2626 static void test_publish_registeruser(void)
2628 UINT r;
2629 LONG res;
2630 HKEY props;
2631 LPSTR usersid;
2632 LPSTR owner, company;
2633 CHAR keypath[MAX_PATH];
2635 static const CHAR keyfmt[] =
2636 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
2637 "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties";
2639 get_user_sid(&usersid);
2640 if (!usersid)
2642 skip("ConvertSidToStringSidA is not available\n");
2643 return;
2646 get_owner_company(&owner, &company);
2648 CreateDirectoryA("msitest", NULL);
2649 create_file("msitest\\maximus", 500);
2651 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2653 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2655 /* RegisterUser, per-user */
2656 r = MsiInstallProductA(msifile, "REGISTER_USER=1");
2657 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2658 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2659 ok(delete_pf("msitest", FALSE), "File not installed\n");
2661 sprintf(keypath, keyfmt, usersid);
2663 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &props);
2664 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2666 CHECK_REG_STR(props, "ProductID", "none");
2667 CHECK_REG_STR(props, "RegCompany", company);
2668 CHECK_REG_STR(props, "RegOwner", owner);
2670 RegDeleteValueA(props, "ProductID");
2671 RegDeleteValueA(props, "RegCompany");
2672 RegDeleteValueA(props, "RegOwner");
2673 RegDeleteKeyA(props, "");
2674 RegCloseKey(props);
2676 /* RegisterUser, machine */
2677 r = MsiInstallProductA(msifile, "REGISTER_USER=1 ALLUSERS=1");
2678 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2679 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2680 ok(delete_pf("msitest", FALSE), "File not installed\n");
2682 sprintf(keypath, keyfmt, "S-1-5-18");
2684 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &props);
2685 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2687 CHECK_REG_STR(props, "ProductID", "none");
2688 CHECK_REG_STR(props, "RegCompany", company);
2689 CHECK_REG_STR(props, "RegOwner", owner);
2691 RegDeleteValueA(props, "ProductID");
2692 RegDeleteValueA(props, "RegCompany");
2693 RegDeleteValueA(props, "RegOwner");
2694 RegDeleteKeyA(props, "");
2695 RegCloseKey(props);
2697 HeapFree(GetProcessHeap(), 0, company);
2698 HeapFree(GetProcessHeap(), 0, owner);
2700 DeleteFile(msifile);
2701 DeleteFile("msitest\\maximus");
2702 RemoveDirectory("msitest");
2705 static void test_publish_processcomponents(void)
2707 UINT r;
2708 LONG res;
2709 DWORD size;
2710 HKEY comp, hkey;
2711 LPSTR usersid;
2712 CHAR val[MAX_PATH];
2713 CHAR keypath[MAX_PATH];
2715 static const CHAR keyfmt[] =
2716 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
2717 "UserData\\%s\\Components\\CBABC2FDCCB35E749A8944D8C1C098B5";
2718 static const CHAR compkey[] =
2719 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Components";
2721 get_user_sid(&usersid);
2722 if (!usersid)
2724 skip("ConvertSidToStringSidA is not available\n");
2725 return;
2728 CreateDirectoryA("msitest", NULL);
2729 create_file("msitest\\maximus", 500);
2731 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2733 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2735 /* ProcessComponents, per-user */
2736 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1");
2737 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2738 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2739 ok(delete_pf("msitest", FALSE), "File not installed\n");
2741 sprintf(keypath, keyfmt, usersid);
2743 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp);
2744 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2746 size = MAX_PATH;
2747 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
2748 NULL, NULL, (LPBYTE)val, &size);
2749 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2750 ok(!lstrcmpA(val, "C:\\Program Files\\msitest\\maximus"),
2751 "Expected \"%s\", got \"%s\"\n", "C:\\Program Files\\msitest\\maximus", val);
2753 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey);
2754 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2756 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
2757 RegDeleteKeyA(comp, "");
2758 RegCloseKey(comp);
2760 /* ProcessComponents, machine */
2761 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1 ALLUSERS=1");
2762 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2763 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2764 ok(delete_pf("msitest", FALSE), "File not installed\n");
2766 sprintf(keypath, keyfmt, "S-1-5-18");
2768 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp);
2769 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2771 size = MAX_PATH;
2772 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
2773 NULL, NULL, (LPBYTE)val, &size);
2774 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2775 ok(!lstrcmpA(val, "C:\\Program Files\\msitest\\maximus"),
2776 "Expected \"%s\", got \"%s\"\n", "C:\\Program Files\\msitest\\maximus", val);
2778 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey);
2779 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2781 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
2782 RegDeleteKeyA(comp, "");
2783 RegCloseKey(comp);
2785 DeleteFile(msifile);
2786 DeleteFile("msitest\\maximus");
2787 RemoveDirectory("msitest");
2790 static void test_publish(void)
2792 UINT r;
2793 LONG res;
2794 HKEY uninstall, prodkey;
2795 INSTALLSTATE state;
2796 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2797 char date[MAX_PATH];
2798 char temp[MAX_PATH];
2800 static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2802 if (!pMsiQueryComponentStateA)
2804 skip("MsiQueryComponentStateA is not available\n");
2805 return;
2808 get_date_str(date);
2809 GetTempPath(MAX_PATH, temp);
2811 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &uninstall);
2812 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2814 CreateDirectoryA("msitest", NULL);
2815 create_file("msitest\\maximus", 500);
2817 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2819 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2821 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2822 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2824 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2825 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2827 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2828 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2830 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2831 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2832 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2833 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2835 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2836 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2838 /* nothing published */
2839 r = MsiInstallProductA(msifile, NULL);
2840 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2841 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2842 ok(pf_exists("msitest"), "File not installed\n");
2844 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2845 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2847 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2848 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2850 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2851 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2853 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2854 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2855 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2856 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2858 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2859 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2861 /* PublishProduct and RegisterProduct */
2862 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 PUBLISH_PRODUCT=1");
2863 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2864 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2865 ok(pf_exists("msitest"), "File not installed\n");
2867 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2868 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
2870 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2871 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2873 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2874 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2876 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2877 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2878 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
2879 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2881 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2882 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2884 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
2885 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
2886 CHECK_REG_STR(prodkey, "InstallDate", date);
2887 CHECK_REG_STR(prodkey, "InstallSource", temp);
2888 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2889 CHECK_REG_STR(prodkey, "Publisher", "Wine");
2890 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2891 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
2892 CHECK_REG_STR(prodkey, "Comments", NULL);
2893 CHECK_REG_STR(prodkey, "Contact", NULL);
2894 CHECK_REG_STR(prodkey, "HelpLink", NULL);
2895 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
2896 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
2897 CHECK_REG_STR(prodkey, "Readme", NULL);
2898 CHECK_REG_STR(prodkey, "Size", NULL);
2899 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
2900 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
2901 CHECK_REG_DWORD(prodkey, "Language", 1033);
2902 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
2903 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
2904 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
2905 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
2906 todo_wine
2908 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
2911 RegCloseKey(prodkey);
2913 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
2914 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2915 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2916 ok(pf_exists("msitest"), "File deleted\n");
2918 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2919 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2921 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2922 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2924 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2925 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2927 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2928 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2929 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2930 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2932 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2933 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2935 /* complete install */
2936 r = MsiInstallProductA(msifile, "FULL=1");
2937 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2938 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2939 ok(pf_exists("msitest"), "File not installed\n");
2941 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2942 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
2944 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2945 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
2947 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2948 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
2950 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2951 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2952 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2953 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
2955 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2956 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2958 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
2959 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
2960 CHECK_REG_STR(prodkey, "InstallDate", date);
2961 CHECK_REG_STR(prodkey, "InstallSource", temp);
2962 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2963 CHECK_REG_STR(prodkey, "Publisher", "Wine");
2964 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2965 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
2966 CHECK_REG_STR(prodkey, "Comments", NULL);
2967 CHECK_REG_STR(prodkey, "Contact", NULL);
2968 CHECK_REG_STR(prodkey, "HelpLink", NULL);
2969 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
2970 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
2971 CHECK_REG_STR(prodkey, "Readme", NULL);
2972 CHECK_REG_STR(prodkey, "Size", NULL);
2973 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
2974 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
2975 CHECK_REG_DWORD(prodkey, "Language", 1033);
2976 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
2977 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
2978 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
2979 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
2980 todo_wine
2982 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
2985 RegCloseKey(prodkey);
2987 /* no UnpublishFeatures */
2988 r = MsiInstallProductA(msifile, "REMOVE=ALL");
2989 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2990 todo_wine
2992 ok(!pf_exists("msitest\\maximus"), "File deleted\n");
2993 ok(!pf_exists("msitest"), "File deleted\n");
2996 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2997 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2999 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3000 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3002 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3003 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3005 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3006 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3007 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3008 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3010 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3011 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3013 /* complete install */
3014 r = MsiInstallProductA(msifile, "FULL=1");
3015 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3016 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3017 ok(pf_exists("msitest"), "File not installed\n");
3019 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3020 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3022 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3023 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3025 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3026 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3028 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3029 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3030 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3031 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3033 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3034 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3036 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3037 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3038 CHECK_REG_STR(prodkey, "InstallDate", date);
3039 CHECK_REG_STR(prodkey, "InstallSource", temp);
3040 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3041 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3042 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3043 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3044 CHECK_REG_STR(prodkey, "Comments", NULL);
3045 CHECK_REG_STR(prodkey, "Contact", NULL);
3046 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3047 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3048 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3049 CHECK_REG_STR(prodkey, "Readme", NULL);
3050 CHECK_REG_STR(prodkey, "Size", NULL);
3051 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3052 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3053 CHECK_REG_DWORD(prodkey, "Language", 1033);
3054 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3055 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3056 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3057 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3058 todo_wine
3060 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3063 RegCloseKey(prodkey);
3065 /* UnpublishFeatures, only feature removed. Only works when entire product is removed */
3066 r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature");
3067 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3068 ok(pf_exists("msitest\\maximus"), "File deleted\n");
3069 ok(pf_exists("msitest"), "File deleted\n");
3071 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3072 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3074 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3075 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3077 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3078 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3080 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3081 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3082 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3083 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3085 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3086 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3088 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3089 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3090 CHECK_REG_STR(prodkey, "InstallDate", date);
3091 CHECK_REG_STR(prodkey, "InstallSource", temp);
3092 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3093 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3094 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3095 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3096 CHECK_REG_STR(prodkey, "Comments", NULL);
3097 CHECK_REG_STR(prodkey, "Contact", NULL);
3098 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3099 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3100 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3101 CHECK_REG_STR(prodkey, "Readme", NULL);
3102 CHECK_REG_STR(prodkey, "Size", NULL);
3103 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3104 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3105 CHECK_REG_DWORD(prodkey, "Language", 1033);
3106 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3107 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3108 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3109 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3110 todo_wine
3112 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3115 RegCloseKey(prodkey);
3117 /* complete install */
3118 r = MsiInstallProductA(msifile, "FULL=1");
3119 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3120 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3121 ok(pf_exists("msitest"), "File not installed\n");
3123 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3124 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3126 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3127 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3129 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3130 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3132 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3133 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3134 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3135 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3137 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3138 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3140 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3141 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3142 CHECK_REG_STR(prodkey, "InstallDate", date);
3143 CHECK_REG_STR(prodkey, "InstallSource", temp);
3144 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3145 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3146 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3147 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3148 CHECK_REG_STR(prodkey, "Comments", NULL);
3149 CHECK_REG_STR(prodkey, "Contact", NULL);
3150 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3151 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3152 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3153 CHECK_REG_STR(prodkey, "Readme", NULL);
3154 CHECK_REG_STR(prodkey, "Size", NULL);
3155 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3156 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3157 CHECK_REG_DWORD(prodkey, "Language", 1033);
3158 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3159 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3160 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3161 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3162 todo_wine
3164 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3167 RegCloseKey(prodkey);
3169 /* UnpublishFeatures, both features removed */
3170 r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo");
3171 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3172 todo_wine
3174 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3175 ok(!pf_exists("msitest"), "File not deleted\n");
3178 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3179 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3181 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3182 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3184 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3185 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3187 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3188 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3189 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3190 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3192 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3193 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3195 /* complete install */
3196 r = MsiInstallProductA(msifile, "FULL=1");
3197 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3198 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3199 ok(pf_exists("msitest"), "File not installed\n");
3201 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3202 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3204 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3205 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3207 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3208 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3210 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3211 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3212 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3213 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3215 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3216 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3218 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3219 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3220 CHECK_REG_STR(prodkey, "InstallDate", date);
3221 CHECK_REG_STR(prodkey, "InstallSource", temp);
3222 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3223 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3224 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3225 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3226 CHECK_REG_STR(prodkey, "Comments", NULL);
3227 CHECK_REG_STR(prodkey, "Contact", NULL);
3228 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3229 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3230 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3231 CHECK_REG_STR(prodkey, "Readme", NULL);
3232 CHECK_REG_STR(prodkey, "Size", NULL);
3233 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3234 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3235 CHECK_REG_DWORD(prodkey, "Language", 1033);
3236 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3237 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3238 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3239 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3240 todo_wine
3242 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3245 RegCloseKey(prodkey);
3247 /* complete uninstall */
3248 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3249 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3250 todo_wine
3252 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3253 ok(!pf_exists("msitest"), "File not deleted\n");
3256 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3257 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3259 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3260 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3262 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3263 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3265 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3266 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3267 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3268 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3270 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3271 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3273 /* make sure 'Program Files\msitest' is removed */
3274 delete_pfmsitest_files();
3276 RegCloseKey(uninstall);
3277 DeleteFile(msifile);
3278 DeleteFile("msitest\\maximus");
3279 RemoveDirectory("msitest");
3282 static void test_publishsourcelist(void)
3284 UINT r;
3285 DWORD size;
3286 CHAR value[MAX_PATH];
3287 CHAR path[MAX_PATH];
3288 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
3290 if (!pMsiSourceListEnumSourcesA || !pMsiSourceListGetInfoA)
3292 skip("MsiSourceListEnumSourcesA and/or MsiSourceListGetInfoA are not available\n");
3293 return;
3296 CreateDirectoryA("msitest", NULL);
3297 create_file("msitest\\maximus", 500);
3299 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
3301 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
3303 r = MsiInstallProductA(msifile, NULL);
3304 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3305 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3306 ok(pf_exists("msitest"), "File not installed\n");
3308 /* nothing published */
3309 size = 0xdeadbeef;
3310 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3311 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3312 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3313 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3315 size = 0xdeadbeef;
3316 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3317 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3318 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3319 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3321 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
3322 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3323 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3324 ok(pf_exists("msitest"), "File not installed\n");
3326 /* after RegisterProduct */
3327 size = 0xdeadbeef;
3328 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3329 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3330 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3331 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3333 size = 0xdeadbeef;
3334 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3335 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3336 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3337 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3339 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1");
3340 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3341 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3342 ok(pf_exists("msitest"), "File not installed\n");
3344 /* after ProcessComponents */
3345 size = 0xdeadbeef;
3346 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3347 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3348 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3349 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3351 size = 0xdeadbeef;
3352 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3353 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3354 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3355 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3357 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1");
3358 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3359 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3360 ok(pf_exists("msitest"), "File not installed\n");
3362 /* after PublishFeatures */
3363 size = 0xdeadbeef;
3364 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3365 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3366 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3367 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3369 size = 0xdeadbeef;
3370 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3371 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3372 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3373 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3375 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
3376 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3377 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3378 ok(pf_exists("msitest"), "File not installed\n");
3380 /* after PublishProduct */
3381 size = MAX_PATH;
3382 lstrcpyA(value, "aaa");
3383 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3384 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size);
3385 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3386 ok(!lstrcmpA(value, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value);
3387 ok(size == 11, "Expected 11, got %d\n", size);
3389 size = MAX_PATH;
3390 lstrcpyA(value, "aaa");
3391 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3392 MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATH, value, &size);
3393 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3394 ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
3395 ok(size == 0, "Expected 0, got %d\n", size);
3397 size = MAX_PATH;
3398 lstrcpyA(value, "aaa");
3399 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3400 MSICODE_PRODUCT, INSTALLPROPERTY_DISKPROMPT, value, &size);
3401 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3402 ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
3403 ok(size == 0, "Expected 0, got %d\n", size);
3405 lstrcpyA(path, CURR_DIR);
3406 lstrcatA(path, "\\");
3408 size = MAX_PATH;
3409 lstrcpyA(value, "aaa");
3410 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3411 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3412 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3413 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3414 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3416 size = MAX_PATH;
3417 lstrcpyA(value, "aaa");
3418 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3419 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPE, value, &size);
3420 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3421 ok(!lstrcmpA(value, "n"), "Expected \"n\", got \"%s\"\n", value);
3422 ok(size == 1, "Expected 1, got %d\n", size);
3424 size = MAX_PATH;
3425 lstrcpyA(value, "aaa");
3426 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3427 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
3428 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
3429 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
3430 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
3432 size = MAX_PATH;
3433 lstrcpyA(value, "aaa");
3434 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3435 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
3436 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3437 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3438 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3440 size = MAX_PATH;
3441 lstrcpyA(value, "aaa");
3442 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3443 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 1, 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 /* complete uninstall */
3449 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3450 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3451 todo_wine
3453 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3454 ok(!pf_exists("msitest"), "File not deleted\n");
3457 /* make sure 'Program Files\msitest' is removed */
3458 delete_pfmsitest_files();
3460 DeleteFile(msifile);
3461 DeleteFile("msitest\\maximus");
3462 RemoveDirectory("msitest");
3465 static UINT run_query(MSIHANDLE hdb, MSIHANDLE hrec, const char *query)
3467 MSIHANDLE hview = 0;
3468 UINT r;
3470 r = MsiDatabaseOpenView(hdb, query, &hview);
3471 if(r != ERROR_SUCCESS)
3472 return r;
3474 r = MsiViewExecute(hview, hrec);
3475 if(r == ERROR_SUCCESS)
3476 r = MsiViewClose(hview);
3477 MsiCloseHandle(hview);
3478 return r;
3481 static void set_transform_summary_info(void)
3483 UINT r;
3484 MSIHANDLE suminfo = 0;
3486 /* build summary info */
3487 r = MsiGetSummaryInformation(0, mstfile, 3, &suminfo);
3488 todo_wine
3490 ok(r == ERROR_SUCCESS , "Failed to open summaryinfo\n");
3493 r = MsiSummaryInfoSetProperty(suminfo, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
3494 todo_wine
3496 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3499 r = MsiSummaryInfoSetProperty(suminfo, PID_REVNUMBER, VT_LPSTR, 0, NULL,
3500 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3501 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3502 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}");
3503 todo_wine
3505 ok(r == ERROR_SUCCESS , "Failed to set summary info\n");
3508 r = MsiSummaryInfoSetProperty(suminfo, PID_PAGECOUNT, VT_I4, 100, NULL, NULL);
3509 todo_wine
3511 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3514 r = MsiSummaryInfoPersist(suminfo);
3515 todo_wine
3517 ok(r == ERROR_SUCCESS , "Failed to make summary info persist\n");
3520 r = MsiCloseHandle(suminfo);
3521 ok(r == ERROR_SUCCESS , "Failed to close suminfo\n");
3524 static void generate_transform(void)
3526 MSIHANDLE hdb1, hdb2;
3527 LPCSTR query;
3528 UINT r;
3530 /* start with two identical databases */
3531 CopyFile(msifile, msifile2, FALSE);
3533 r = MsiOpenDatabase(msifile2, MSIDBOPEN_TRANSACT, &hdb1);
3534 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3536 r = MsiDatabaseCommit(hdb1);
3537 ok(r == ERROR_SUCCESS , "Failed to commit database\n");
3539 r = MsiOpenDatabase(msifile, MSIDBOPEN_READONLY, &hdb2);
3540 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3542 query = "INSERT INTO `Property` ( `Property`, `Value` ) VALUES ( 'prop', 'val' )";
3543 r = run_query(hdb1, 0, query);
3544 ok(r == ERROR_SUCCESS, "failed to add property\n");
3546 /* database needs to be committed */
3547 MsiDatabaseCommit(hdb1);
3549 r = MsiDatabaseGenerateTransform(hdb1, hdb2, mstfile, 0, 0);
3550 ok(r == ERROR_SUCCESS, "return code %d, should be ERROR_SUCCESS\n", r);
3552 #if 0 /* not implemented in wine yet */
3553 r = MsiCreateTransformSummaryInfo(hdb2, hdb2, mstfile, 0, 0);
3554 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3555 #endif
3557 MsiCloseHandle(hdb1);
3558 MsiCloseHandle(hdb2);
3561 /* data for generating a transform */
3563 /* tables transform names - encoded as they would be in an msi database file */
3564 static const WCHAR name1[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */
3565 static const WCHAR name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */
3566 static const WCHAR name3[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */
3568 /* data in each table */
3569 static const char data1[] = /* _StringData */
3570 "propval"; /* all the strings squashed together */
3572 static const WCHAR data2[] = { /* _StringPool */
3573 /* len, refs */
3574 0, 0, /* string 0 '' */
3575 4, 1, /* string 1 'prop' */
3576 3, 1, /* string 2 'val' */
3579 static const WCHAR data3[] = { /* Property */
3580 0x0201, 0x0001, 0x0002,
3583 static const struct {
3584 LPCWSTR name;
3585 const void *data;
3586 DWORD size;
3587 } table_transform_data[] =
3589 { name1, data1, sizeof data1 - 1 },
3590 { name2, data2, sizeof data2 },
3591 { name3, data3, sizeof data3 },
3594 #define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0])
3596 static void generate_transform_manual(void)
3598 IStorage *stg = NULL;
3599 IStream *stm;
3600 WCHAR name[0x20];
3601 HRESULT r;
3602 DWORD i, count;
3603 const DWORD mode = STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE;
3605 const CLSID CLSID_MsiTransform = { 0xc1082,0,0,{0xc0,0,0,0,0,0,0,0x46}};
3607 MultiByteToWideChar(CP_ACP, 0, mstfile, -1, name, 0x20);
3609 r = StgCreateDocfile(name, mode, 0, &stg);
3610 ok(r == S_OK, "failed to create storage\n");
3611 if (!stg)
3612 return;
3614 r = IStorage_SetClass(stg, &CLSID_MsiTransform);
3615 ok(r == S_OK, "failed to set storage type\n");
3617 for (i=0; i<NUM_TRANSFORM_TABLES; i++)
3619 r = IStorage_CreateStream(stg, table_transform_data[i].name,
3620 STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3621 if (FAILED(r))
3623 ok(0, "failed to create stream %08x\n", r);
3624 continue;
3627 r = IStream_Write(stm, table_transform_data[i].data,
3628 table_transform_data[i].size, &count);
3629 if (FAILED(r) || count != table_transform_data[i].size)
3630 ok(0, "failed to write stream\n");
3631 IStream_Release(stm);
3634 IStorage_Release(stg);
3636 set_transform_summary_info();
3639 static void test_transformprop(void)
3641 UINT r;
3643 CreateDirectoryA("msitest", NULL);
3644 create_file("msitest\\augustus", 500);
3646 create_database(msifile, tp_tables, sizeof(tp_tables) / sizeof(msi_table));
3648 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3650 r = MsiInstallProductA(msifile, NULL);
3651 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3652 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3653 ok(!delete_pf("msitest", FALSE), "File installed\n");
3655 if (0)
3656 generate_transform();
3657 else
3658 generate_transform_manual();
3660 r = MsiInstallProductA(msifile, "TRANSFORMS=winetest.mst");
3661 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3662 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3663 ok(delete_pf("msitest", FALSE), "File not installed\n");
3665 /* Delete the files in the temp (current) folder */
3666 DeleteFile(msifile);
3667 DeleteFile(msifile2);
3668 DeleteFile(mstfile);
3669 DeleteFile("msitest\\augustus");
3670 RemoveDirectory("msitest");
3673 static void test_currentworkingdir(void)
3675 UINT r;
3676 CHAR path[MAX_PATH];
3677 LPSTR ptr, ptr2;
3679 CreateDirectoryA("msitest", NULL);
3680 create_file("msitest\\augustus", 500);
3682 create_database(msifile, cwd_tables, sizeof(cwd_tables) / sizeof(msi_table));
3684 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3686 CreateDirectoryA("diffdir", NULL);
3687 SetCurrentDirectoryA("diffdir");
3689 sprintf(path, "..\\%s", msifile);
3690 r = MsiInstallProductA(path, NULL);
3691 todo_wine
3693 ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
3694 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3695 ok(!delete_pf("msitest", FALSE), "File installed\n");
3698 sprintf(path, "%s\\%s", CURR_DIR, msifile);
3699 r = MsiInstallProductA(path, NULL);
3700 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3701 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3702 ok(delete_pf("msitest", FALSE), "File not installed\n");
3704 lstrcpyA(path, CURR_DIR);
3705 if (path[lstrlenA(path) - 1] != '\\')
3706 lstrcatA(path, "\\");
3707 lstrcatA(path, "msitest.msi");
3709 ptr2 = strrchr(path, '\\');
3710 *ptr2 = '\0';
3711 ptr = strrchr(path, '\\');
3712 *ptr2 = '\\';
3713 *(ptr++) = '\0';
3715 SetCurrentDirectoryA(path);
3717 r = MsiInstallProductA(ptr, NULL);
3718 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3719 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3720 ok(delete_pf("msitest", FALSE), "File not installed\n");
3722 SetCurrentDirectoryA(CURR_DIR);
3724 DeleteFile(msifile);
3725 DeleteFile("msitest\\augustus");
3726 RemoveDirectory("msitest");
3727 RemoveDirectory("diffdir");
3730 static void set_admin_summary_info(const CHAR *name)
3732 MSIHANDLE db, summary;
3733 UINT r;
3735 r = MsiOpenDatabaseA(name, MSIDBOPEN_DIRECT, &db);
3736 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3738 r = MsiGetSummaryInformationA(db, NULL, 1, &summary);
3739 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3741 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, 5, NULL, NULL);
3742 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3744 /* write the summary changes back to the stream */
3745 r = MsiSummaryInfoPersist(summary);
3746 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3748 MsiCloseHandle(summary);
3750 r = MsiDatabaseCommit(db);
3751 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3753 MsiCloseHandle(db);
3756 static void test_admin(void)
3758 UINT r;
3760 CreateDirectoryA("msitest", NULL);
3761 create_file("msitest\\augustus", 500);
3763 create_database(msifile, adm_tables, sizeof(adm_tables) / sizeof(msi_table));
3764 set_admin_summary_info(msifile);
3766 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3768 r = MsiInstallProductA(msifile, NULL);
3769 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3770 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3771 ok(!delete_pf("msitest", FALSE), "File installed\n");
3772 ok(!DeleteFile("c:\\msitest\\augustus"), "File installed\n");
3773 ok(!RemoveDirectory("c:\\msitest"), "File installed\n");
3775 r = MsiInstallProductA(msifile, "ACTION=ADMIN");
3776 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3777 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3778 ok(!delete_pf("msitest", FALSE), "File installed\n");
3779 todo_wine
3781 ok(DeleteFile("c:\\msitest\\augustus"), "File not installed\n");
3782 ok(RemoveDirectory("c:\\msitest"), "File not installed\n");
3785 DeleteFile(msifile);
3786 DeleteFile("msitest\\augustus");
3787 RemoveDirectory("msitest");
3790 static void set_admin_property_stream(LPCSTR file)
3792 IStorage *stg;
3793 IStream *stm;
3794 WCHAR fileW[MAX_PATH];
3795 HRESULT hr;
3796 DWORD count;
3797 const DWORD mode = STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE;
3799 /* AdminProperties */
3800 static const WCHAR stmname[] = {0x41ca,0x4330,0x3e71,0x44b5,0x4233,0x45f5,0x422c,0x4836,0};
3801 static const WCHAR data[] = {'M','Y','P','R','O','P','=','2','7','1','8',0};
3803 MultiByteToWideChar(CP_ACP, 0, file, -1, fileW, MAX_PATH);
3805 hr = StgOpenStorage(fileW, NULL, mode, NULL, 0, &stg);
3806 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3807 if (!stg)
3808 return;
3810 hr = IStorage_CreateStream(stg, stmname, STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3811 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3813 hr = IStream_Write(stm, data, sizeof(data), &count);
3814 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3816 IStream_Release(stm);
3817 IStorage_Release(stg);
3820 static void test_adminprops(void)
3822 UINT r;
3824 CreateDirectoryA("msitest", NULL);
3825 create_file("msitest\\augustus", 500);
3827 create_database(msifile, amp_tables, sizeof(amp_tables) / sizeof(msi_table));
3828 set_admin_summary_info(msifile);
3829 set_admin_property_stream(msifile);
3831 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3833 r = MsiInstallProductA(msifile, NULL);
3834 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3835 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
3836 ok(delete_pf("msitest", FALSE), "File installed\n");
3838 DeleteFile(msifile);
3839 DeleteFile("msitest\\augustus");
3840 RemoveDirectory("msitest");
3843 static void create_pf_data(LPCSTR file, LPCSTR data, BOOL is_file)
3845 CHAR path[MAX_PATH];
3847 lstrcpyA(path, PROG_FILES_DIR);
3848 lstrcatA(path, "\\");
3849 lstrcatA(path, file);
3851 if (is_file)
3852 create_file_data(path, data, 500);
3853 else
3854 CreateDirectoryA(path, NULL);
3857 #define create_pf(file, is_file) create_pf_data(file, file, is_file)
3859 static void test_removefiles(void)
3861 UINT r;
3863 CreateDirectoryA("msitest", NULL);
3864 create_file("msitest\\hydrogen", 500);
3865 create_file("msitest\\helium", 500);
3866 create_file("msitest\\lithium", 500);
3868 create_database(msifile, rem_tables, sizeof(rem_tables) / sizeof(msi_table));
3870 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
3872 r = MsiInstallProductA(msifile, NULL);
3873 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3874 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3875 ok(!pf_exists("msitest\\helium"), "File installed\n");
3876 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3877 ok(pf_exists("msitest"), "File not installed\n");
3879 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3880 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3881 ok(!pf_exists("msitest\\helium"), "File not deleted\n");
3882 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
3883 todo_wine
3885 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
3886 ok(delete_pf("msitest", FALSE), "File deleted\n");
3889 create_pf("msitest", FALSE);
3890 create_pf("msitest\\hydrogen", TRUE);
3891 create_pf("msitest\\helium", TRUE);
3892 create_pf("msitest\\lithium", TRUE);
3894 r = MsiInstallProductA(msifile, NULL);
3895 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3896 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3897 ok(pf_exists("msitest\\helium"), "File not installed\n");
3898 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3899 ok(pf_exists("msitest"), "File not installed\n");
3901 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3902 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3903 ok(delete_pf("msitest\\helium", TRUE), "File deleted\n");
3904 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
3905 todo_wine
3907 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
3908 ok(delete_pf("msitest", FALSE), "File deleted\n");
3911 create_pf("msitest", FALSE);
3912 create_pf("msitest\\furlong", TRUE);
3913 create_pf("msitest\\firkin", TRUE);
3914 create_pf("msitest\\fortnight", TRUE);
3915 create_pf("msitest\\becquerel", TRUE);
3916 create_pf("msitest\\dioptre", TRUE);
3917 create_pf("msitest\\attoparsec", TRUE);
3918 create_pf("msitest\\storeys", TRUE);
3919 create_pf("msitest\\block", TRUE);
3920 create_pf("msitest\\siriometer", TRUE);
3922 r = MsiInstallProductA(msifile, NULL);
3923 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3924 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3925 ok(!pf_exists("msitest\\helium"), "File installed\n");
3926 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3927 ok(pf_exists("msitest\\becquerel"), "File not installed\n");
3928 ok(pf_exists("msitest\\dioptre"), "File not installed\n");
3929 ok(pf_exists("msitest\\attoparsec"), "File not installed\n");
3930 ok(pf_exists("msitest"), "File not installed\n");
3931 todo_wine
3933 ok(!pf_exists("msitest\\firkin"), "File not deleted\n");
3934 ok(!pf_exists("msitest\\fortnight"), "File not deleted\n");
3935 ok(!pf_exists("msitest\\furlong"), "File not deleted\n");
3936 ok(!pf_exists("msitest\\storeys"), "File not deleted\n");
3937 ok(!pf_exists("msitest\\block"), "File not deleted\n");
3938 ok(!pf_exists("msitest\\siriometer"), "File not deleted\n");
3941 create_pf("msitest\\furlong", TRUE);
3942 create_pf("msitest\\firkin", TRUE);
3943 create_pf("msitest\\fortnight", TRUE);
3944 create_pf("msitest\\storeys", TRUE);
3945 create_pf("msitest\\block", TRUE);
3946 create_pf("msitest\\siriometer", TRUE);
3948 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3949 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3950 ok(!delete_pf("msitest\\helium", TRUE), "File not deleted\n");
3951 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
3952 ok(delete_pf("msitest\\furlong", TRUE), "File deleted\n");
3953 ok(delete_pf("msitest\\firkin", TRUE), "File deleted\n");
3954 ok(delete_pf("msitest\\fortnight", TRUE), "File deleted\n");
3955 ok(delete_pf("msitest\\attoparsec", TRUE), "File deleted\n");
3956 ok(delete_pf("msitest\\siriometer", TRUE), "File deleted\n");
3957 todo_wine
3959 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not deleted\n");
3960 ok(!delete_pf("msitest\\becquerel", TRUE), "File not deleted\n");
3961 ok(!delete_pf("msitest\\dioptre", TRUE), "File not deleted\n");
3962 ok(!delete_pf("msitest\\storeys", TRUE), "File not deleted\n");
3963 ok(!delete_pf("msitest\\block", TRUE), "File not deleted\n");
3965 ok(delete_pf("msitest", FALSE), "File deleted\n");
3967 DeleteFile(msifile);
3968 DeleteFile("msitest\\hydrogen");
3969 DeleteFile("msitest\\helium");
3970 DeleteFile("msitest\\lithium");
3971 RemoveDirectory("msitest");
3974 static void test_movefiles(void)
3976 UINT r;
3977 char props[MAX_PATH];
3979 CreateDirectoryA("msitest", NULL);
3980 create_file("msitest\\augustus", 100);
3981 create_file("cameroon", 100);
3982 create_file("djibouti", 100);
3983 create_file("egypt", 100);
3984 create_file("finland", 100);
3985 create_file("gambai", 100);
3986 create_file("honduras", 100);
3987 create_file("msitest\\india", 100);
3988 create_file("japan", 100);
3989 create_file("kenya", 100);
3990 CreateDirectoryA("latvia", NULL);
3991 create_file("nauru", 100);
3992 create_file("apple", 100);
3993 create_file("application", 100);
3994 create_file("ape", 100);
3995 create_file("foo", 100);
3996 create_file("fao", 100);
3997 create_file("fbod", 100);
3998 create_file("budding", 100);
3999 create_file("buddy", 100);
4000 create_file("bud", 100);
4001 create_file("bar", 100);
4002 create_file("bur", 100);
4003 create_file("bird", 100);
4005 create_database(msifile, mov_tables, sizeof(mov_tables) / sizeof(msi_table));
4007 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
4009 /* if the source or dest property is not a full path,
4010 * windows tries to access it as a network resource
4013 sprintf(props, "SOURCEFULL=\"%s\\\" DESTFULL=\"%s\\msitest\" "
4014 "FILEPATHBAD=\"%s\\japan\" FILEPATHGOOD=\"%s\\kenya\"",
4015 CURR_DIR, PROG_FILES_DIR, CURR_DIR, CURR_DIR);
4017 r = MsiInstallProductA(msifile, props);
4018 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4019 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
4020 ok(!delete_pf("msitest\\dest", TRUE), "File copied\n");
4021 ok(delete_pf("msitest\\canada", TRUE), "File not copied\n");
4022 ok(delete_pf("msitest\\dominica", TRUE), "File not moved\n");
4023 ok(!delete_pf("msitest\\elsalvador", TRUE), "File moved\n");
4024 ok(!delete_pf("msitest\\france", TRUE), "File moved\n");
4025 ok(!delete_pf("msitest\\georgia", TRUE), "File moved\n");
4026 ok(delete_pf("msitest\\hungary", TRUE), "File not moved\n");
4027 ok(!delete_pf("msitest\\indonesia", TRUE), "File moved\n");
4028 ok(!delete_pf("msitest\\jordan", TRUE), "File moved\n");
4029 ok(delete_pf("msitest\\kiribati", TRUE), "File not moved\n");
4030 ok(!delete_pf("msitest\\lebanon", TRUE), "File moved\n");
4031 ok(!delete_pf("msitest\\lebanon", FALSE), "Directory moved\n");
4032 /* either apple or application will be moved depending on directory order */
4033 if (!delete_pf("msitest\\apple", TRUE))
4034 ok(delete_pf("msitest\\application", TRUE), "File not moved\n");
4035 else
4036 ok(!delete_pf("msitest\\application", TRUE), "File should not exist\n");
4037 ok(delete_pf("msitest\\wildcard", TRUE), "File not moved\n");
4038 ok(!delete_pf("msitest\\ape", TRUE), "File moved\n");
4039 /* either fao or foo will be moved depending on directory order */
4040 if (delete_pf("msitest\\foo", TRUE))
4041 ok(!delete_pf("msitest\\fao", TRUE), "File should not exist\n");
4042 else
4043 ok(delete_pf("msitest\\fao", TRUE), "File not moved\n");
4044 ok(delete_pf("msitest\\single", TRUE), "File not moved\n");
4045 ok(!delete_pf("msitest\\fbod", TRUE), "File moved\n");
4046 ok(delete_pf("msitest\\budding", TRUE), "File not moved\n");
4047 ok(delete_pf("msitest\\buddy", TRUE), "File not moved\n");
4048 ok(!delete_pf("msitest\\bud", TRUE), "File moved\n");
4049 ok(delete_pf("msitest\\bar", TRUE), "File not moved\n");
4050 ok(delete_pf("msitest\\bur", TRUE), "File not moved\n");
4051 ok(!delete_pf("msitest\\bird", TRUE), "File moved\n");
4052 ok(delete_pf("msitest", FALSE), "File not installed\n");
4053 ok(DeleteFileA("cameroon"), "File moved\n");
4054 ok(!DeleteFileA("djibouti"), "File not moved\n");
4055 ok(DeleteFileA("egypt"), "File moved\n");
4056 ok(DeleteFileA("finland"), "File moved\n");
4057 ok(DeleteFileA("gambai"), "File moved\n");
4058 ok(!DeleteFileA("honduras"), "File not moved\n");
4059 ok(DeleteFileA("msitest\\india"), "File moved\n");
4060 ok(DeleteFileA("japan"), "File moved\n");
4061 ok(!DeleteFileA("kenya"), "File not moved\n");
4062 ok(RemoveDirectoryA("latvia"), "Directory moved\n");
4063 ok(!DeleteFileA("nauru"), "File not moved\n");
4064 ok(!DeleteFileA("apple"), "File not moved\n");
4065 ok(!DeleteFileA("application"), "File not moved\n");
4066 ok(DeleteFileA("ape"), "File moved\n");
4067 ok(!DeleteFileA("foo"), "File not moved\n");
4068 ok(!DeleteFileA("fao"), "File not moved\n");
4069 ok(DeleteFileA("fbod"), "File moved\n");
4070 ok(!DeleteFileA("budding"), "File not moved\n");
4071 ok(!DeleteFileA("buddy"), "File not moved\n");
4072 ok(DeleteFileA("bud"), "File moved\n");
4073 ok(!DeleteFileA("bar"), "File not moved\n");
4074 ok(!DeleteFileA("bur"), "File not moved\n");
4075 ok(DeleteFileA("bird"), "File moved\n");
4077 DeleteFile("msitest\\augustus");
4078 RemoveDirectory("msitest");
4079 DeleteFile(msifile);
4082 static void test_missingcab(void)
4084 UINT r;
4086 CreateDirectoryA("msitest", NULL);
4087 create_file("msitest\\augustus", 500);
4088 create_file("maximus", 500);
4090 create_database(msifile, mc_tables, sizeof(mc_tables) / sizeof(msi_table));
4092 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4094 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
4096 create_pf("msitest", FALSE);
4097 create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
4099 r = MsiInstallProductA(msifile, NULL);
4100 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4101 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
4102 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
4103 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
4104 ok(!delete_pf("msitest\\gaius", TRUE), "File installed\n");
4105 ok(delete_pf("msitest", FALSE), "File not installed\n");
4107 create_pf("msitest", FALSE);
4108 create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
4109 create_pf("msitest\\gaius", TRUE);
4111 r = MsiInstallProductA(msifile, "GAIUS=1");
4112 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4113 todo_wine
4115 ok(!delete_pf("msitest\\maximus", TRUE), "File installed\n");
4116 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4118 ok(delete_pf("msitest\\caesar", TRUE), "File removed\n");
4119 ok(delete_pf("msitest\\gaius", TRUE), "File removed\n");
4120 ok(delete_pf("msitest", FALSE), "File not installed\n");
4122 DeleteFile("msitest\\augustus");
4123 RemoveDirectory("msitest");
4124 DeleteFile("maximus");
4125 DeleteFile("test1.cab");
4126 DeleteFile(msifile);
4129 static void test_duplicatefiles(void)
4131 UINT r;
4133 CreateDirectoryA("msitest", NULL);
4134 create_file("msitest\\maximus", 500);
4135 create_database(msifile, df_tables, sizeof(df_tables) / sizeof(msi_table));
4137 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4139 /* fails if the destination folder is not a valid property */
4141 r = MsiInstallProductA(msifile, NULL);
4142 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4143 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
4144 ok(delete_pf("msitest\\augustus", TRUE), "File not duplicated\n");
4145 ok(delete_pf("msitest\\this\\doesnot\\exist\\maximus", TRUE), "File not duplicated\n");
4146 ok(delete_pf("msitest\\this\\doesnot\\exist", FALSE), "File not duplicated\n");
4147 ok(delete_pf("msitest\\this\\doesnot", FALSE), "File not duplicated\n");
4148 ok(delete_pf("msitest\\this", FALSE), "File not duplicated\n");
4149 ok(delete_pf("msitest", FALSE), "File not installed\n");
4151 DeleteFile("msitest\\maximus");
4152 RemoveDirectory("msitest");
4153 DeleteFile(msifile);
4156 static void test_writeregistryvalues(void)
4158 UINT r;
4159 LONG res;
4160 HKEY hkey;
4161 DWORD type, size;
4162 CHAR path[MAX_PATH];
4164 CreateDirectoryA("msitest", NULL);
4165 create_file("msitest\\augustus", 500);
4167 create_database(msifile, wrv_tables, sizeof(wrv_tables) / sizeof(msi_table));
4169 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4171 r = MsiInstallProductA(msifile, NULL);
4172 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4173 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
4174 ok(delete_pf("msitest", FALSE), "File installed\n");
4176 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
4177 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4179 size = MAX_PATH;
4180 type = REG_MULTI_SZ;
4181 memset(path, 'a', MAX_PATH);
4182 res = RegQueryValueExA(hkey, "Value", NULL, &type, (LPBYTE)path, &size);
4183 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4184 ok(!memcmp(path, "one\0two\0three\0\0", size), "Wrong multi-sz data\n");
4185 ok(size == 15, "Expected 15, got %d\n", size);
4186 ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
4188 DeleteFile(msifile);
4189 DeleteFile("msitest\\augustus");
4190 RemoveDirectory("msitest");
4192 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
4193 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine");
4196 static void test_sourcefolder(void)
4198 UINT r;
4200 CreateDirectoryA("msitest", NULL);
4201 create_file("augustus", 500);
4203 create_database(msifile, sf_tables, sizeof(sf_tables) / sizeof(msi_table));
4205 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4207 r = MsiInstallProductA(msifile, NULL);
4208 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4209 todo_wine
4211 ok(r == ERROR_INSTALL_FAILURE,
4212 "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4213 ok(!delete_pf("msitest", FALSE), "File installed\n");
4216 RemoveDirectoryA("msitest");
4218 r = MsiInstallProductA(msifile, NULL);
4219 todo_wine
4221 ok(r == ERROR_INSTALL_FAILURE,
4222 "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4223 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4224 ok(!delete_pf("msitest", FALSE), "File installed\n");
4227 DeleteFile(msifile);
4228 DeleteFile("augustus");
4231 static void test_customaction51(void)
4233 UINT r;
4235 CreateDirectoryA("msitest", NULL);
4236 create_file("msitest\\augustus", 500);
4238 create_database(msifile, ca51_tables, sizeof(ca51_tables) / sizeof(msi_table));
4240 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4242 r = MsiInstallProductA(msifile, NULL);
4243 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4244 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
4245 ok(delete_pf("msitest", FALSE), "File installed\n");
4247 DeleteFile(msifile);
4248 DeleteFile("msitest\\augustus");
4249 RemoveDirectory("msitest");
4252 static void test_installstate(void)
4254 UINT r;
4256 CreateDirectoryA("msitest", NULL);
4257 create_file("msitest\\alpha", 500);
4258 create_file("msitest\\beta", 500);
4259 create_file("msitest\\gamma", 500);
4260 create_file("msitest\\theta", 500);
4261 create_file("msitest\\delta", 500);
4262 create_file("msitest\\epsilon", 500);
4263 create_file("msitest\\zeta", 500);
4264 create_file("msitest\\iota", 500);
4265 create_file("msitest\\eta", 500);
4266 create_file("msitest\\kappa", 500);
4267 create_file("msitest\\lambda", 500);
4268 create_file("msitest\\mu", 500);
4270 create_database(msifile, is_tables, sizeof(is_tables) / sizeof(msi_table));
4272 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4274 r = MsiInstallProductA(msifile, NULL);
4275 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4276 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4277 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4278 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n");
4279 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4280 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4281 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4282 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n");
4283 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4284 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4285 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4286 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4287 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4288 ok(delete_pf("msitest", FALSE), "File not installed\n");
4290 r = MsiInstallProductA(msifile, "ADDLOCAL=\"one,two,three,four\"");
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 not installed\n");
4298 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n");
4299 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4300 ok(delete_pf("msitest\\eta", TRUE), "File not 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, "ADDSOURCE=\"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 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 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 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, "REMOVE=\"one,two,three,four\"");
4323 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4324 ok(!delete_pf("msitest\\alpha", TRUE), "File 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 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 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 installed\n");
4338 DeleteFile(msifile);
4339 DeleteFile("msitest\\alpha");
4340 DeleteFile("msitest\\beta");
4341 DeleteFile("msitest\\gamma");
4342 DeleteFile("msitest\\theta");
4343 DeleteFile("msitest\\delta");
4344 DeleteFile("msitest\\epsilon");
4345 DeleteFile("msitest\\zeta");
4346 DeleteFile("msitest\\iota");
4347 DeleteFile("msitest\\eta");
4348 DeleteFile("msitest\\kappa");
4349 DeleteFile("msitest\\lambda");
4350 DeleteFile("msitest\\mu");
4351 RemoveDirectory("msitest");
4354 START_TEST(install)
4356 DWORD len;
4357 char temp_path[MAX_PATH], prev_path[MAX_PATH];
4359 init_functionpointers();
4361 GetCurrentDirectoryA(MAX_PATH, prev_path);
4362 GetTempPath(MAX_PATH, temp_path);
4363 SetCurrentDirectoryA(temp_path);
4365 lstrcpyA(CURR_DIR, temp_path);
4366 len = lstrlenA(CURR_DIR);
4368 if(len && (CURR_DIR[len - 1] == '\\'))
4369 CURR_DIR[len - 1] = 0;
4371 get_program_files_dir(PROG_FILES_DIR, COMMON_FILES_DIR);
4373 test_MsiInstallProduct();
4374 test_MsiSetComponentState();
4375 test_packagecoltypes();
4376 test_continuouscabs();
4377 test_caborder();
4378 test_mixedmedia();
4379 test_samesequence();
4380 test_uiLevelFlags();
4381 test_readonlyfile();
4382 test_setdirproperty();
4383 test_cabisextracted();
4384 test_concurrentinstall();
4385 test_setpropertyfolder();
4386 test_publish_registerproduct();
4387 test_publish_publishproduct();
4388 test_publish_publishfeatures();
4389 test_publish_registeruser();
4390 test_publish_processcomponents();
4391 test_publish();
4392 test_publishsourcelist();
4393 test_transformprop();
4394 test_currentworkingdir();
4395 test_admin();
4396 test_adminprops();
4397 test_removefiles();
4398 test_movefiles();
4399 test_missingcab();
4400 test_duplicatefiles();
4401 test_writeregistryvalues();
4402 test_sourcefolder();
4403 test_customaction51();
4404 test_installstate();
4406 SetCurrentDirectoryA(prev_path);