msi: Don't set an invalid install property in PublishProduct.
[wine.git] / dlls / msi / tests / install.c
blobd5ebda291205148a3674c08ee1026e5c1f9ab577
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 if (!usersid)
2244 skip("ConvertSidToStringSidA is not available\n");
2245 return;
2248 get_date_str(date);
2249 GetTempPath(MAX_PATH, temp);
2251 CreateDirectoryA("msitest", NULL);
2252 create_file("msitest\\maximus", 500);
2254 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2256 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2258 /* RegisterProduct */
2259 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
2260 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2261 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2262 ok(delete_pf("msitest", FALSE), "File not installed\n");
2264 res = RegOpenKeyA(HKEY_CURRENT_USER, userugkey, &hkey);
2265 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2267 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, uninstall, &hkey);
2268 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2270 CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST");
2271 CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1");
2272 CHECK_DEL_REG_STR(hkey, "InstallDate", date);
2273 CHECK_DEL_REG_STR(hkey, "InstallSource", temp);
2274 CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2275 CHECK_DEL_REG_STR(hkey, "Publisher", "Wine");
2276 CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2277 CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", NULL);
2278 CHECK_DEL_REG_STR(hkey, "Comments", NULL);
2279 CHECK_DEL_REG_STR(hkey, "Contact", NULL);
2280 CHECK_DEL_REG_STR(hkey, "HelpLink", NULL);
2281 CHECK_DEL_REG_STR(hkey, "HelpTelephone", NULL);
2282 CHECK_DEL_REG_STR(hkey, "InstallLocation", NULL);
2283 CHECK_DEL_REG_STR(hkey, "Readme", NULL);
2284 CHECK_DEL_REG_STR(hkey, "Size", NULL);
2285 CHECK_DEL_REG_STR(hkey, "URLInfoAbout", NULL);
2286 CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", NULL);
2287 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2288 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2289 CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1);
2290 CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1);
2291 CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1);
2292 todo_wine
2294 CHECK_DEL_REG_DWORD(hkey, "EstimatedSize", 12);
2297 RegDeleteKeyA(hkey, "");
2298 RegCloseKey(hkey);
2300 sprintf(keypath, userdata, usersid);
2301 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey);
2302 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2304 res = RegOpenKeyA(hkey, "InstallProperties", &props);
2305 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2307 RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */
2308 CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST");
2309 CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1");
2310 CHECK_DEL_REG_STR(props, "InstallDate", date);
2311 CHECK_DEL_REG_STR(props, "InstallSource", temp);
2312 CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2313 CHECK_DEL_REG_STR(props, "Publisher", "Wine");
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, "Version", 0x1010001);
2327 CHECK_DEL_REG_DWORD(props, "VersionMajor", 1);
2328 CHECK_DEL_REG_DWORD(props, "VersionMinor", 1);
2329 CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1);
2330 todo_wine
2332 CHECK_DEL_REG_DWORD(props, "EstimatedSize", 12);
2335 RegDeleteKeyA(props, "");
2336 RegCloseKey(props);
2338 res = RegOpenKeyA(hkey, "Usage", &usage);
2339 todo_wine
2341 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2344 RegDeleteKeyA(usage, "");
2345 RegCloseKey(usage);
2346 RegDeleteKeyA(hkey, "");
2347 RegCloseKey(hkey);
2349 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, ugkey, &hkey);
2350 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2352 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL);
2354 RegDeleteKeyA(hkey, "");
2355 RegCloseKey(hkey);
2357 /* RegisterProduct, machine */
2358 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 ALLUSERS=1");
2359 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2360 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2361 ok(delete_pf("msitest", FALSE), "File not installed\n");
2363 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, userugkey, &hkey);
2364 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2366 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, uninstall, &hkey);
2367 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2369 CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST");
2370 CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1");
2371 CHECK_DEL_REG_STR(hkey, "InstallDate", date);
2372 CHECK_DEL_REG_STR(hkey, "InstallSource", temp);
2373 CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2374 CHECK_DEL_REG_STR(hkey, "Publisher", "Wine");
2375 CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2376 CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", NULL);
2377 CHECK_DEL_REG_STR(hkey, "Comments", NULL);
2378 CHECK_DEL_REG_STR(hkey, "Contact", NULL);
2379 CHECK_DEL_REG_STR(hkey, "HelpLink", NULL);
2380 CHECK_DEL_REG_STR(hkey, "HelpTelephone", NULL);
2381 CHECK_DEL_REG_STR(hkey, "InstallLocation", NULL);
2382 CHECK_DEL_REG_STR(hkey, "Readme", NULL);
2383 CHECK_DEL_REG_STR(hkey, "Size", NULL);
2384 CHECK_DEL_REG_STR(hkey, "URLInfoAbout", NULL);
2385 CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", NULL);
2386 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2387 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2388 CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1);
2389 CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1);
2390 CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1);
2391 todo_wine
2393 CHECK_DEL_REG_DWORD(hkey, "EstimatedSize", 12);
2396 RegDeleteKeyA(hkey, "");
2397 RegCloseKey(hkey);
2399 sprintf(keypath, userdata, "S-1-5-18");
2400 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey);
2401 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2403 res = RegOpenKeyA(hkey, "InstallProperties", &props);
2404 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2406 RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */
2407 CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST");
2408 CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1");
2409 CHECK_DEL_REG_STR(props, "InstallDate", date);
2410 CHECK_DEL_REG_STR(props, "InstallSource", temp);
2411 CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2412 CHECK_DEL_REG_STR(props, "Publisher", "Wine");
2413 CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2414 CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", NULL);
2415 CHECK_DEL_REG_STR(props, "Comments", NULL);
2416 CHECK_DEL_REG_STR(props, "Contact", NULL);
2417 CHECK_DEL_REG_STR(props, "HelpLink", NULL);
2418 CHECK_DEL_REG_STR(props, "HelpTelephone", NULL);
2419 CHECK_DEL_REG_STR(props, "InstallLocation", NULL);
2420 CHECK_DEL_REG_STR(props, "Readme", NULL);
2421 CHECK_DEL_REG_STR(props, "Size", NULL);
2422 CHECK_DEL_REG_STR(props, "URLInfoAbout", NULL);
2423 CHECK_DEL_REG_STR(props, "URLUpdateInfo", NULL);
2424 CHECK_DEL_REG_DWORD(props, "Language", 1033);
2425 CHECK_DEL_REG_DWORD(props, "Version", 0x1010001);
2426 CHECK_DEL_REG_DWORD(props, "VersionMajor", 1);
2427 CHECK_DEL_REG_DWORD(props, "VersionMinor", 1);
2428 CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1);
2429 todo_wine
2431 CHECK_DEL_REG_DWORD(props, "EstimatedSize", 12);
2434 RegDeleteKeyA(props, "");
2435 RegCloseKey(props);
2437 res = RegOpenKeyA(hkey, "Usage", &usage);
2438 todo_wine
2440 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2443 RegDeleteKeyA(usage, "");
2444 RegCloseKey(usage);
2445 RegDeleteKeyA(hkey, "");
2446 RegCloseKey(hkey);
2448 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, ugkey, &hkey);
2449 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2451 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL);
2453 RegDeleteKeyA(hkey, "");
2454 RegCloseKey(hkey);
2456 DeleteFile(msifile);
2457 DeleteFile("msitest\\maximus");
2458 RemoveDirectory("msitest");
2459 HeapFree(GetProcessHeap(), 0, usersid);
2462 static void test_publish_publishproduct(void)
2464 UINT r;
2465 LONG res;
2466 LPSTR usersid;
2467 HKEY sourcelist, net, props;
2468 HKEY hkey, patches, media;
2469 CHAR keypath[MAX_PATH];
2470 CHAR temp[MAX_PATH];
2471 CHAR path[MAX_PATH];
2473 static const CHAR prodpath[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2474 "\\Installer\\UserData\\%s\\Products"
2475 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2476 static const CHAR cuprodpath[] = "Software\\Microsoft\\Installer\\Products"
2477 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2478 static const CHAR cuupgrades[] = "Software\\Microsoft\\Installer\\UpgradeCodes"
2479 "\\51AAE0C44620A5E4788506E91F249BD2";
2481 get_user_sid(&usersid);
2482 if (!usersid)
2484 skip("ConvertSidToStringSidA is not available\n");
2485 return;
2488 GetTempPath(MAX_PATH, temp);
2490 CreateDirectoryA("msitest", NULL);
2491 create_file("msitest\\maximus", 500);
2493 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2495 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2497 /* PublishProduct, current user */
2498 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
2499 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2500 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2501 ok(delete_pf("msitest", FALSE), "File not installed\n");
2503 sprintf(keypath, prodpath, usersid);
2504 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey);
2505 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2507 res = RegOpenKeyA(hkey, "InstallProperties", &props);
2508 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2510 res = RegOpenKeyA(hkey, "Patches", &patches);
2511 todo_wine
2513 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2515 CHECK_DEL_REG_STR(patches, "AllPatches", NULL);
2518 RegDeleteKeyA(patches, "");
2519 RegCloseKey(patches);
2520 RegDeleteKeyA(hkey, "");
2521 RegCloseKey(hkey);
2523 res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey);
2524 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2526 CHECK_DEL_REG_STR(hkey, "ProductName", "MSITEST");
2527 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2528 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2529 CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0);
2530 todo_wine
2532 CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052c94DA02821EECD05F2F");
2533 CHECK_DEL_REG_DWORD(hkey, "Assignment", 0);
2534 CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184);
2535 CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0);
2536 CHECK_DEL_REG_STR(hkey, "Clients", ":");
2539 res = RegOpenKeyA(hkey, "SourceList", &sourcelist);
2540 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2542 lstrcpyA(path, "n;1;");
2543 lstrcatA(path, temp);
2544 CHECK_DEL_REG_STR(sourcelist, "LastUsedSource", path);
2545 CHECK_DEL_REG_STR(sourcelist, "PackageName", "msitest.msi");
2547 res = RegOpenKeyA(sourcelist, "Net", &net);
2548 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2550 CHECK_DEL_REG_STR(net, "1", temp);
2552 RegDeleteKeyA(net, "");
2553 RegCloseKey(net);
2555 res = RegOpenKeyA(sourcelist, "Media", &media);
2556 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2558 todo_wine
2560 CHECK_DEL_REG_STR(media, "1", "DISK1;");
2563 RegDeleteKeyA(media, "");
2564 RegCloseKey(media);
2565 RegDeleteKeyA(sourcelist, "");
2566 RegCloseKey(sourcelist);
2567 RegDeleteKeyA(hkey, "");
2568 RegCloseKey(hkey);
2570 res = RegOpenKeyA(HKEY_CURRENT_USER, cuupgrades, &hkey);
2571 todo_wine
2573 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2575 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL);
2578 RegDeleteKeyA(hkey, "");
2579 RegCloseKey(hkey);
2581 DeleteFile(msifile);
2582 DeleteFile("msitest\\maximus");
2583 RemoveDirectory("msitest");
2584 HeapFree(GetProcessHeap(), 0, usersid);
2587 static void test_publish_publishfeatures(void)
2589 UINT r;
2590 LONG res;
2591 HKEY hkey;
2592 LPSTR usersid;
2593 CHAR keypath[MAX_PATH];
2595 static const CHAR cupath[] = "Software\\Microsoft\\Installer\\Features"
2596 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2597 static const CHAR udpath[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2598 "\\Installer\\UserData\\%s\\Products"
2599 "\\84A88FD7F6998CE40A22FB59F6B9C2BB\\Features";
2600 static const CHAR featkey[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2601 "\\Installer\\Features";
2602 static const CHAR classfeat[] = "Software\\Classes\\Installer\\Features"
2603 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2605 get_user_sid(&usersid);
2606 if (!usersid)
2608 skip("ConvertSidToStringSidA is not available\n");
2609 return;
2612 CreateDirectoryA("msitest", NULL);
2613 create_file("msitest\\maximus", 500);
2615 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2617 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2619 /* PublishFeatures, current user */
2620 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1");
2621 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2622 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2623 ok(delete_pf("msitest", FALSE), "File not installed\n");
2625 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, featkey, &hkey);
2626 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2628 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, classfeat, &hkey);
2629 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2631 res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey);
2632 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2634 CHECK_REG_STR(hkey, "feature", "");
2635 CHECK_REG_STR(hkey, "montecristo", "");
2637 RegDeleteValueA(hkey, "feature");
2638 RegDeleteValueA(hkey, "montecristo");
2639 RegDeleteKeyA(hkey, "");
2640 RegCloseKey(hkey);
2642 sprintf(keypath, udpath, usersid);
2643 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey);
2644 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2646 CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE");
2647 CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE");
2649 RegDeleteValueA(hkey, "feature");
2650 RegDeleteValueA(hkey, "montecristo");
2651 RegDeleteKeyA(hkey, "");
2652 RegCloseKey(hkey);
2654 /* PublishFeatures, machine */
2655 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1 ALLUSERS=1");
2656 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2657 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2658 ok(delete_pf("msitest", FALSE), "File not installed\n");
2660 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, featkey, &hkey);
2661 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2663 res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey);
2664 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2666 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, classfeat, &hkey);
2667 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2669 CHECK_REG_STR(hkey, "feature", "");
2670 CHECK_REG_STR(hkey, "montecristo", "");
2672 RegDeleteValueA(hkey, "feature");
2673 RegDeleteValueA(hkey, "montecristo");
2674 RegDeleteKeyA(hkey, "");
2675 RegCloseKey(hkey);
2677 sprintf(keypath, udpath, "S-1-5-18");
2678 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey);
2679 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2681 CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE");
2682 CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE");
2684 RegDeleteValueA(hkey, "feature");
2685 RegDeleteValueA(hkey, "montecristo");
2686 RegDeleteKeyA(hkey, "");
2687 RegCloseKey(hkey);
2689 DeleteFile(msifile);
2690 DeleteFile("msitest\\maximus");
2691 RemoveDirectory("msitest");
2692 HeapFree(GetProcessHeap(), 0, usersid);
2695 static LPSTR reg_get_val_str(HKEY hkey, LPCSTR name)
2697 DWORD len = 0;
2698 LPSTR val;
2699 LONG r;
2701 r = RegQueryValueExA(hkey, name, NULL, NULL, NULL, &len);
2702 if (r != ERROR_SUCCESS)
2703 return NULL;
2705 len += sizeof (WCHAR);
2706 val = HeapAlloc(GetProcessHeap(), 0, len);
2707 if (!val) return NULL;
2708 val[0] = 0;
2709 RegQueryValueExA(hkey, name, NULL, NULL, (LPBYTE)val, &len);
2710 return val;
2713 static void get_owner_company(LPSTR *owner, LPSTR *company)
2715 LONG res;
2716 HKEY hkey;
2718 *owner = *company = NULL;
2720 res = RegOpenKeyA(HKEY_CURRENT_USER,
2721 "Software\\Microsoft\\MS Setup (ACME)\\User Info", &hkey);
2722 if (res == ERROR_SUCCESS)
2724 *owner = reg_get_val_str(hkey, "DefName");
2725 *company = reg_get_val_str(hkey, "DefCompany");
2726 RegCloseKey(hkey);
2729 if (!*owner || !*company)
2731 res = RegOpenKeyA(HKEY_LOCAL_MACHINE,
2732 "Software\\Microsoft\\Windows\\CurrentVersion", &hkey);
2733 if (res == ERROR_SUCCESS)
2735 *owner = reg_get_val_str(hkey, "RegisteredOwner");
2736 *company = reg_get_val_str(hkey, "RegisteredOrganization");
2737 RegCloseKey(hkey);
2741 if (!*owner || !*company)
2743 res = RegOpenKeyA(HKEY_LOCAL_MACHINE,
2744 "Software\\Microsoft\\Windows NT\\CurrentVersion", &hkey);
2745 if (res == ERROR_SUCCESS)
2747 *owner = reg_get_val_str(hkey, "RegisteredOwner");
2748 *company = reg_get_val_str(hkey, "RegisteredOrganization");
2749 RegCloseKey(hkey);
2754 static void test_publish_registeruser(void)
2756 UINT r;
2757 LONG res;
2758 HKEY props;
2759 LPSTR usersid;
2760 LPSTR owner, company;
2761 CHAR keypath[MAX_PATH];
2763 static const CHAR keyfmt[] =
2764 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
2765 "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties";
2767 get_user_sid(&usersid);
2768 if (!usersid)
2770 skip("ConvertSidToStringSidA is not available\n");
2771 return;
2774 get_owner_company(&owner, &company);
2776 CreateDirectoryA("msitest", NULL);
2777 create_file("msitest\\maximus", 500);
2779 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2781 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2783 /* RegisterUser, per-user */
2784 r = MsiInstallProductA(msifile, "REGISTER_USER=1");
2785 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2786 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2787 ok(delete_pf("msitest", FALSE), "File not installed\n");
2789 sprintf(keypath, keyfmt, usersid);
2791 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &props);
2792 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2794 CHECK_REG_STR(props, "ProductID", "none");
2795 CHECK_REG_STR(props, "RegCompany", company);
2796 CHECK_REG_STR(props, "RegOwner", owner);
2798 RegDeleteValueA(props, "ProductID");
2799 RegDeleteValueA(props, "RegCompany");
2800 RegDeleteValueA(props, "RegOwner");
2801 RegDeleteKeyA(props, "");
2802 RegCloseKey(props);
2804 /* RegisterUser, machine */
2805 r = MsiInstallProductA(msifile, "REGISTER_USER=1 ALLUSERS=1");
2806 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2807 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2808 ok(delete_pf("msitest", FALSE), "File not installed\n");
2810 sprintf(keypath, keyfmt, "S-1-5-18");
2812 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &props);
2813 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2815 CHECK_REG_STR(props, "ProductID", "none");
2816 CHECK_REG_STR(props, "RegCompany", company);
2817 CHECK_REG_STR(props, "RegOwner", owner);
2819 RegDeleteValueA(props, "ProductID");
2820 RegDeleteValueA(props, "RegCompany");
2821 RegDeleteValueA(props, "RegOwner");
2822 RegDeleteKeyA(props, "");
2823 RegCloseKey(props);
2825 HeapFree(GetProcessHeap(), 0, company);
2826 HeapFree(GetProcessHeap(), 0, owner);
2828 DeleteFile(msifile);
2829 DeleteFile("msitest\\maximus");
2830 RemoveDirectory("msitest");
2833 static void test_publish_processcomponents(void)
2835 UINT r;
2836 LONG res;
2837 DWORD size;
2838 HKEY comp, hkey;
2839 LPSTR usersid;
2840 CHAR val[MAX_PATH];
2841 CHAR keypath[MAX_PATH];
2843 static const CHAR keyfmt[] =
2844 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
2845 "UserData\\%s\\Components\\CBABC2FDCCB35E749A8944D8C1C098B5";
2846 static const CHAR compkey[] =
2847 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Components";
2849 get_user_sid(&usersid);
2850 if (!usersid)
2852 skip("ConvertSidToStringSidA is not available\n");
2853 return;
2856 CreateDirectoryA("msitest", NULL);
2857 create_file("msitest\\maximus", 500);
2859 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2861 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2863 /* ProcessComponents, per-user */
2864 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1");
2865 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2866 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2867 ok(delete_pf("msitest", FALSE), "File not installed\n");
2869 sprintf(keypath, keyfmt, usersid);
2871 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp);
2872 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2874 size = MAX_PATH;
2875 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
2876 NULL, NULL, (LPBYTE)val, &size);
2877 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2878 ok(!lstrcmpA(val, "C:\\Program Files\\msitest\\maximus"),
2879 "Expected \"%s\", got \"%s\"\n", "C:\\Program Files\\msitest\\maximus", val);
2881 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey);
2882 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2884 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
2885 RegDeleteKeyA(comp, "");
2886 RegCloseKey(comp);
2888 /* ProcessComponents, machine */
2889 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1 ALLUSERS=1");
2890 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2891 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2892 ok(delete_pf("msitest", FALSE), "File not installed\n");
2894 sprintf(keypath, keyfmt, "S-1-5-18");
2896 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp);
2897 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2899 size = MAX_PATH;
2900 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
2901 NULL, NULL, (LPBYTE)val, &size);
2902 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2903 ok(!lstrcmpA(val, "C:\\Program Files\\msitest\\maximus"),
2904 "Expected \"%s\", got \"%s\"\n", "C:\\Program Files\\msitest\\maximus", val);
2906 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey);
2907 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2909 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
2910 RegDeleteKeyA(comp, "");
2911 RegCloseKey(comp);
2913 DeleteFile(msifile);
2914 DeleteFile("msitest\\maximus");
2915 RemoveDirectory("msitest");
2918 static void test_publish(void)
2920 UINT r;
2921 LONG res;
2922 HKEY uninstall, prodkey;
2923 INSTALLSTATE state;
2924 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2925 char date[MAX_PATH];
2926 char temp[MAX_PATH];
2928 static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2930 if (!pMsiQueryComponentStateA)
2932 skip("MsiQueryComponentStateA is not available\n");
2933 return;
2936 get_date_str(date);
2937 GetTempPath(MAX_PATH, temp);
2939 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &uninstall);
2940 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
2942 CreateDirectoryA("msitest", NULL);
2943 create_file("msitest\\maximus", 500);
2945 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
2947 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
2949 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2950 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2952 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2953 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2955 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2956 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2958 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2959 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2960 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2961 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2963 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2964 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2966 /* nothing published */
2967 r = MsiInstallProductA(msifile, NULL);
2968 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2969 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2970 ok(pf_exists("msitest"), "File not installed\n");
2972 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2973 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2975 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2976 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2978 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2979 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2981 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
2982 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
2983 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
2984 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2986 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
2987 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
2989 /* PublishProduct and RegisterProduct */
2990 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 PUBLISH_PRODUCT=1");
2991 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2992 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2993 ok(pf_exists("msitest"), "File not installed\n");
2995 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2996 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
2998 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2999 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3001 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3002 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3004 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3005 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3006 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
3007 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3009 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3010 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3012 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3013 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3014 CHECK_REG_STR(prodkey, "InstallDate", date);
3015 CHECK_REG_STR(prodkey, "InstallSource", temp);
3016 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3017 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3018 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3019 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3020 CHECK_REG_STR(prodkey, "Comments", NULL);
3021 CHECK_REG_STR(prodkey, "Contact", NULL);
3022 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3023 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3024 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3025 CHECK_REG_STR(prodkey, "Readme", NULL);
3026 CHECK_REG_STR(prodkey, "Size", NULL);
3027 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3028 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3029 CHECK_REG_DWORD(prodkey, "Language", 1033);
3030 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3031 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3032 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3033 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3034 todo_wine
3036 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3039 RegCloseKey(prodkey);
3041 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3042 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3043 ok(pf_exists("msitest\\maximus"), "File deleted\n");
3044 ok(pf_exists("msitest"), "File deleted\n");
3046 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3047 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3049 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3050 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3052 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3053 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3055 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3056 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3057 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3058 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3060 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3061 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3063 /* complete install */
3064 r = MsiInstallProductA(msifile, "FULL=1");
3065 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3066 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3067 ok(pf_exists("msitest"), "File not installed\n");
3069 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3070 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3072 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3073 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3075 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3076 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3078 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3079 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3080 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3081 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3083 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3084 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3086 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3087 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3088 CHECK_REG_STR(prodkey, "InstallDate", date);
3089 CHECK_REG_STR(prodkey, "InstallSource", temp);
3090 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3091 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3092 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3093 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3094 CHECK_REG_STR(prodkey, "Comments", NULL);
3095 CHECK_REG_STR(prodkey, "Contact", NULL);
3096 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3097 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3098 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3099 CHECK_REG_STR(prodkey, "Readme", NULL);
3100 CHECK_REG_STR(prodkey, "Size", NULL);
3101 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3102 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3103 CHECK_REG_DWORD(prodkey, "Language", 1033);
3104 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3105 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3106 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3107 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3108 todo_wine
3110 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3113 RegCloseKey(prodkey);
3115 /* no UnpublishFeatures */
3116 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3117 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3118 todo_wine
3120 ok(!pf_exists("msitest\\maximus"), "File deleted\n");
3121 ok(!pf_exists("msitest"), "File deleted\n");
3124 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3125 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3127 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3128 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3130 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3131 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3133 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3134 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3135 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3136 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3138 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3139 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3141 /* complete install */
3142 r = MsiInstallProductA(msifile, "FULL=1");
3143 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3144 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3145 ok(pf_exists("msitest"), "File not installed\n");
3147 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3148 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3150 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3151 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3153 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3154 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3156 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3157 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3158 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3159 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3161 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3162 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3164 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3165 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3166 CHECK_REG_STR(prodkey, "InstallDate", date);
3167 CHECK_REG_STR(prodkey, "InstallSource", temp);
3168 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3169 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3170 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3171 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3172 CHECK_REG_STR(prodkey, "Comments", NULL);
3173 CHECK_REG_STR(prodkey, "Contact", NULL);
3174 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3175 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3176 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3177 CHECK_REG_STR(prodkey, "Readme", NULL);
3178 CHECK_REG_STR(prodkey, "Size", NULL);
3179 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3180 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3181 CHECK_REG_DWORD(prodkey, "Language", 1033);
3182 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3183 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3184 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3185 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3186 todo_wine
3188 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3191 RegCloseKey(prodkey);
3193 /* UnpublishFeatures, only feature removed. Only works when entire product is removed */
3194 r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature");
3195 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3196 ok(pf_exists("msitest\\maximus"), "File deleted\n");
3197 ok(pf_exists("msitest"), "File deleted\n");
3199 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3200 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3202 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3203 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3205 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3206 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3208 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3209 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3210 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3211 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3213 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3214 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3216 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3217 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3218 CHECK_REG_STR(prodkey, "InstallDate", date);
3219 CHECK_REG_STR(prodkey, "InstallSource", temp);
3220 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3221 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3222 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3223 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3224 CHECK_REG_STR(prodkey, "Comments", NULL);
3225 CHECK_REG_STR(prodkey, "Contact", NULL);
3226 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3227 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3228 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3229 CHECK_REG_STR(prodkey, "Readme", NULL);
3230 CHECK_REG_STR(prodkey, "Size", NULL);
3231 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3232 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3233 CHECK_REG_DWORD(prodkey, "Language", 1033);
3234 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3235 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3236 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3237 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3238 todo_wine
3240 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3243 RegCloseKey(prodkey);
3245 /* complete install */
3246 r = MsiInstallProductA(msifile, "FULL=1");
3247 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3248 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3249 ok(pf_exists("msitest"), "File not installed\n");
3251 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3252 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3254 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3255 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3257 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3258 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3260 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3261 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3262 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3263 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3265 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3266 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3268 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3269 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3270 CHECK_REG_STR(prodkey, "InstallDate", date);
3271 CHECK_REG_STR(prodkey, "InstallSource", temp);
3272 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3273 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3274 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3275 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3276 CHECK_REG_STR(prodkey, "Comments", NULL);
3277 CHECK_REG_STR(prodkey, "Contact", NULL);
3278 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3279 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3280 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3281 CHECK_REG_STR(prodkey, "Readme", NULL);
3282 CHECK_REG_STR(prodkey, "Size", NULL);
3283 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3284 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3285 CHECK_REG_DWORD(prodkey, "Language", 1033);
3286 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3287 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3288 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3289 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3290 todo_wine
3292 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3295 RegCloseKey(prodkey);
3297 /* UnpublishFeatures, both features removed */
3298 r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo");
3299 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3300 todo_wine
3302 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3303 ok(!pf_exists("msitest"), "File not deleted\n");
3306 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3307 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3309 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3310 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3312 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3313 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3315 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3316 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3317 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3318 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3320 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3321 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3323 /* complete install */
3324 r = MsiInstallProductA(msifile, "FULL=1");
3325 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3326 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3327 ok(pf_exists("msitest"), "File not installed\n");
3329 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3330 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3332 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3333 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3335 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3336 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3338 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3339 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3340 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3341 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3343 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3344 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
3346 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3347 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3348 CHECK_REG_STR(prodkey, "InstallDate", date);
3349 CHECK_REG_STR(prodkey, "InstallSource", temp);
3350 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3351 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3352 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3353 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL);
3354 CHECK_REG_STR(prodkey, "Comments", NULL);
3355 CHECK_REG_STR(prodkey, "Contact", NULL);
3356 CHECK_REG_STR(prodkey, "HelpLink", NULL);
3357 CHECK_REG_STR(prodkey, "HelpTelephone", NULL);
3358 CHECK_REG_STR(prodkey, "InstallLocation", NULL);
3359 CHECK_REG_STR(prodkey, "Readme", NULL);
3360 CHECK_REG_STR(prodkey, "Size", NULL);
3361 CHECK_REG_STR(prodkey, "URLInfoAbout", NULL);
3362 CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL);
3363 CHECK_REG_DWORD(prodkey, "Language", 1033);
3364 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3365 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3366 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3367 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3368 todo_wine
3370 CHECK_REG_DWORD(prodkey, "EstimatedSize", 12);
3373 RegCloseKey(prodkey);
3375 /* complete uninstall */
3376 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3377 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3378 todo_wine
3380 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3381 ok(!pf_exists("msitest"), "File not deleted\n");
3384 state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3385 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3387 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3388 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3390 state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3391 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3393 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3394 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3395 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3396 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3398 res = RegOpenKeyA(uninstall, prodcode, &prodkey);
3399 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
3401 /* make sure 'Program Files\msitest' is removed */
3402 delete_pfmsitest_files();
3404 RegCloseKey(uninstall);
3405 DeleteFile(msifile);
3406 DeleteFile("msitest\\maximus");
3407 RemoveDirectory("msitest");
3410 static void test_publishsourcelist(void)
3412 UINT r;
3413 DWORD size;
3414 CHAR value[MAX_PATH];
3415 CHAR path[MAX_PATH];
3416 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
3418 if (!pMsiSourceListEnumSourcesA || !pMsiSourceListGetInfoA)
3420 skip("MsiSourceListEnumSourcesA and/or MsiSourceListGetInfoA are not available\n");
3421 return;
3424 CreateDirectoryA("msitest", NULL);
3425 create_file("msitest\\maximus", 500);
3427 create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table));
3429 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
3431 r = MsiInstallProductA(msifile, NULL);
3432 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3433 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3434 ok(pf_exists("msitest"), "File not installed\n");
3436 /* nothing published */
3437 size = 0xdeadbeef;
3438 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3439 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3440 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3441 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3443 size = 0xdeadbeef;
3444 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3445 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3446 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3447 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3449 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
3450 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3451 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3452 ok(pf_exists("msitest"), "File not installed\n");
3454 /* after RegisterProduct */
3455 size = 0xdeadbeef;
3456 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3457 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3458 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3459 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3461 size = 0xdeadbeef;
3462 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3463 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3464 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3465 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3467 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1");
3468 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3469 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3470 ok(pf_exists("msitest"), "File not installed\n");
3472 /* after ProcessComponents */
3473 size = 0xdeadbeef;
3474 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3475 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3476 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3477 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3479 size = 0xdeadbeef;
3480 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3481 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3482 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3483 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3485 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1");
3486 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3487 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3488 ok(pf_exists("msitest"), "File not installed\n");
3490 /* after PublishFeatures */
3491 size = 0xdeadbeef;
3492 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3493 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
3494 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3495 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3497 size = 0xdeadbeef;
3498 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3499 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, &size);
3500 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3501 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
3503 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
3504 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3505 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3506 ok(pf_exists("msitest"), "File not installed\n");
3508 /* after PublishProduct */
3509 size = MAX_PATH;
3510 lstrcpyA(value, "aaa");
3511 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3512 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size);
3513 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3514 ok(!lstrcmpA(value, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value);
3515 ok(size == 11, "Expected 11, got %d\n", size);
3517 size = MAX_PATH;
3518 lstrcpyA(value, "aaa");
3519 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3520 MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATH, value, &size);
3521 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3522 ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
3523 ok(size == 0, "Expected 0, got %d\n", size);
3525 size = MAX_PATH;
3526 lstrcpyA(value, "aaa");
3527 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3528 MSICODE_PRODUCT, INSTALLPROPERTY_DISKPROMPT, value, &size);
3529 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3530 ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
3531 ok(size == 0, "Expected 0, got %d\n", size);
3533 lstrcpyA(path, CURR_DIR);
3534 lstrcatA(path, "\\");
3536 size = MAX_PATH;
3537 lstrcpyA(value, "aaa");
3538 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3539 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
3540 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3541 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3542 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3544 size = MAX_PATH;
3545 lstrcpyA(value, "aaa");
3546 r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3547 MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPE, value, &size);
3548 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3549 ok(!lstrcmpA(value, "n"), "Expected \"n\", got \"%s\"\n", value);
3550 ok(size == 1, "Expected 1, got %d\n", size);
3552 size = MAX_PATH;
3553 lstrcpyA(value, "aaa");
3554 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3555 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
3556 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
3557 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
3558 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
3560 size = MAX_PATH;
3561 lstrcpyA(value, "aaa");
3562 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3563 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
3564 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3565 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
3566 ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
3568 size = MAX_PATH;
3569 lstrcpyA(value, "aaa");
3570 r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3571 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 1, value, &size);
3572 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
3573 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
3574 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
3576 /* complete uninstall */
3577 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3578 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3579 todo_wine
3581 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3582 ok(!pf_exists("msitest"), "File not deleted\n");
3585 /* make sure 'Program Files\msitest' is removed */
3586 delete_pfmsitest_files();
3588 DeleteFile(msifile);
3589 DeleteFile("msitest\\maximus");
3590 RemoveDirectory("msitest");
3593 static UINT run_query(MSIHANDLE hdb, MSIHANDLE hrec, const char *query)
3595 MSIHANDLE hview = 0;
3596 UINT r;
3598 r = MsiDatabaseOpenView(hdb, query, &hview);
3599 if(r != ERROR_SUCCESS)
3600 return r;
3602 r = MsiViewExecute(hview, hrec);
3603 if(r == ERROR_SUCCESS)
3604 r = MsiViewClose(hview);
3605 MsiCloseHandle(hview);
3606 return r;
3609 static void set_transform_summary_info(void)
3611 UINT r;
3612 MSIHANDLE suminfo = 0;
3614 /* build summary info */
3615 r = MsiGetSummaryInformation(0, mstfile, 3, &suminfo);
3616 todo_wine
3618 ok(r == ERROR_SUCCESS , "Failed to open summaryinfo\n");
3621 r = MsiSummaryInfoSetProperty(suminfo, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST");
3622 todo_wine
3624 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3627 r = MsiSummaryInfoSetProperty(suminfo, PID_REVNUMBER, VT_LPSTR, 0, NULL,
3628 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3629 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3630 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}");
3631 todo_wine
3633 ok(r == ERROR_SUCCESS , "Failed to set summary info\n");
3636 r = MsiSummaryInfoSetProperty(suminfo, PID_PAGECOUNT, VT_I4, 100, NULL, NULL);
3637 todo_wine
3639 ok(r == ERROR_SUCCESS, "Failed to set summary info\n");
3642 r = MsiSummaryInfoPersist(suminfo);
3643 todo_wine
3645 ok(r == ERROR_SUCCESS , "Failed to make summary info persist\n");
3648 r = MsiCloseHandle(suminfo);
3649 ok(r == ERROR_SUCCESS , "Failed to close suminfo\n");
3652 static void generate_transform(void)
3654 MSIHANDLE hdb1, hdb2;
3655 LPCSTR query;
3656 UINT r;
3658 /* start with two identical databases */
3659 CopyFile(msifile, msifile2, FALSE);
3661 r = MsiOpenDatabase(msifile2, MSIDBOPEN_TRANSACT, &hdb1);
3662 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3664 r = MsiDatabaseCommit(hdb1);
3665 ok(r == ERROR_SUCCESS , "Failed to commit database\n");
3667 r = MsiOpenDatabase(msifile, MSIDBOPEN_READONLY, &hdb2);
3668 ok(r == ERROR_SUCCESS , "Failed to create database\n");
3670 query = "INSERT INTO `Property` ( `Property`, `Value` ) VALUES ( 'prop', 'val' )";
3671 r = run_query(hdb1, 0, query);
3672 ok(r == ERROR_SUCCESS, "failed to add property\n");
3674 /* database needs to be committed */
3675 MsiDatabaseCommit(hdb1);
3677 r = MsiDatabaseGenerateTransform(hdb1, hdb2, mstfile, 0, 0);
3678 ok(r == ERROR_SUCCESS, "return code %d, should be ERROR_SUCCESS\n", r);
3680 #if 0 /* not implemented in wine yet */
3681 r = MsiCreateTransformSummaryInfo(hdb2, hdb2, mstfile, 0, 0);
3682 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3683 #endif
3685 MsiCloseHandle(hdb1);
3686 MsiCloseHandle(hdb2);
3689 /* data for generating a transform */
3691 /* tables transform names - encoded as they would be in an msi database file */
3692 static const WCHAR name1[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */
3693 static const WCHAR name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */
3694 static const WCHAR name3[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */
3696 /* data in each table */
3697 static const char data1[] = /* _StringData */
3698 "propval"; /* all the strings squashed together */
3700 static const WCHAR data2[] = { /* _StringPool */
3701 /* len, refs */
3702 0, 0, /* string 0 '' */
3703 4, 1, /* string 1 'prop' */
3704 3, 1, /* string 2 'val' */
3707 static const WCHAR data3[] = { /* Property */
3708 0x0201, 0x0001, 0x0002,
3711 static const struct {
3712 LPCWSTR name;
3713 const void *data;
3714 DWORD size;
3715 } table_transform_data[] =
3717 { name1, data1, sizeof data1 - 1 },
3718 { name2, data2, sizeof data2 },
3719 { name3, data3, sizeof data3 },
3722 #define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0])
3724 static void generate_transform_manual(void)
3726 IStorage *stg = NULL;
3727 IStream *stm;
3728 WCHAR name[0x20];
3729 HRESULT r;
3730 DWORD i, count;
3731 const DWORD mode = STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE;
3733 const CLSID CLSID_MsiTransform = { 0xc1082,0,0,{0xc0,0,0,0,0,0,0,0x46}};
3735 MultiByteToWideChar(CP_ACP, 0, mstfile, -1, name, 0x20);
3737 r = StgCreateDocfile(name, mode, 0, &stg);
3738 ok(r == S_OK, "failed to create storage\n");
3739 if (!stg)
3740 return;
3742 r = IStorage_SetClass(stg, &CLSID_MsiTransform);
3743 ok(r == S_OK, "failed to set storage type\n");
3745 for (i=0; i<NUM_TRANSFORM_TABLES; i++)
3747 r = IStorage_CreateStream(stg, table_transform_data[i].name,
3748 STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3749 if (FAILED(r))
3751 ok(0, "failed to create stream %08x\n", r);
3752 continue;
3755 r = IStream_Write(stm, table_transform_data[i].data,
3756 table_transform_data[i].size, &count);
3757 if (FAILED(r) || count != table_transform_data[i].size)
3758 ok(0, "failed to write stream\n");
3759 IStream_Release(stm);
3762 IStorage_Release(stg);
3764 set_transform_summary_info();
3767 static void test_transformprop(void)
3769 UINT r;
3771 CreateDirectoryA("msitest", NULL);
3772 create_file("msitest\\augustus", 500);
3774 create_database(msifile, tp_tables, sizeof(tp_tables) / sizeof(msi_table));
3776 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3778 r = MsiInstallProductA(msifile, NULL);
3779 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3780 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3781 ok(!delete_pf("msitest", FALSE), "File installed\n");
3783 if (0)
3784 generate_transform();
3785 else
3786 generate_transform_manual();
3788 r = MsiInstallProductA(msifile, "TRANSFORMS=winetest.mst");
3789 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3790 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3791 ok(delete_pf("msitest", FALSE), "File not installed\n");
3793 /* Delete the files in the temp (current) folder */
3794 DeleteFile(msifile);
3795 DeleteFile(msifile2);
3796 DeleteFile(mstfile);
3797 DeleteFile("msitest\\augustus");
3798 RemoveDirectory("msitest");
3801 static void test_currentworkingdir(void)
3803 UINT r;
3804 CHAR path[MAX_PATH];
3805 LPSTR ptr, ptr2;
3807 CreateDirectoryA("msitest", NULL);
3808 create_file("msitest\\augustus", 500);
3810 create_database(msifile, cwd_tables, sizeof(cwd_tables) / sizeof(msi_table));
3812 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3814 CreateDirectoryA("diffdir", NULL);
3815 SetCurrentDirectoryA("diffdir");
3817 sprintf(path, "..\\%s", msifile);
3818 r = MsiInstallProductA(path, NULL);
3819 todo_wine
3821 ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
3822 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3823 ok(!delete_pf("msitest", FALSE), "File installed\n");
3826 sprintf(path, "%s\\%s", CURR_DIR, msifile);
3827 r = MsiInstallProductA(path, NULL);
3828 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3829 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3830 ok(delete_pf("msitest", FALSE), "File not installed\n");
3832 lstrcpyA(path, CURR_DIR);
3833 if (path[lstrlenA(path) - 1] != '\\')
3834 lstrcatA(path, "\\");
3835 lstrcatA(path, "msitest.msi");
3837 ptr2 = strrchr(path, '\\');
3838 *ptr2 = '\0';
3839 ptr = strrchr(path, '\\');
3840 *ptr2 = '\\';
3841 *(ptr++) = '\0';
3843 SetCurrentDirectoryA(path);
3845 r = MsiInstallProductA(ptr, NULL);
3846 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3847 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
3848 ok(delete_pf("msitest", FALSE), "File not installed\n");
3850 SetCurrentDirectoryA(CURR_DIR);
3852 DeleteFile(msifile);
3853 DeleteFile("msitest\\augustus");
3854 RemoveDirectory("msitest");
3855 RemoveDirectory("diffdir");
3858 static void set_admin_summary_info(const CHAR *name)
3860 MSIHANDLE db, summary;
3861 UINT r;
3863 r = MsiOpenDatabaseA(name, MSIDBOPEN_DIRECT, &db);
3864 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3866 r = MsiGetSummaryInformationA(db, NULL, 1, &summary);
3867 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3869 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, 5, NULL, NULL);
3870 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3872 /* write the summary changes back to the stream */
3873 r = MsiSummaryInfoPersist(summary);
3874 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3876 MsiCloseHandle(summary);
3878 r = MsiDatabaseCommit(db);
3879 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3881 MsiCloseHandle(db);
3884 static void test_admin(void)
3886 UINT r;
3888 CreateDirectoryA("msitest", NULL);
3889 create_file("msitest\\augustus", 500);
3891 create_database(msifile, adm_tables, sizeof(adm_tables) / sizeof(msi_table));
3892 set_admin_summary_info(msifile);
3894 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3896 r = MsiInstallProductA(msifile, NULL);
3897 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3898 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3899 ok(!delete_pf("msitest", FALSE), "File installed\n");
3900 ok(!DeleteFile("c:\\msitest\\augustus"), "File installed\n");
3901 ok(!RemoveDirectory("c:\\msitest"), "File installed\n");
3903 r = MsiInstallProductA(msifile, "ACTION=ADMIN");
3904 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3905 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
3906 ok(!delete_pf("msitest", FALSE), "File installed\n");
3907 todo_wine
3909 ok(DeleteFile("c:\\msitest\\augustus"), "File not installed\n");
3910 ok(RemoveDirectory("c:\\msitest"), "File not installed\n");
3913 DeleteFile(msifile);
3914 DeleteFile("msitest\\augustus");
3915 RemoveDirectory("msitest");
3918 static void set_admin_property_stream(LPCSTR file)
3920 IStorage *stg;
3921 IStream *stm;
3922 WCHAR fileW[MAX_PATH];
3923 HRESULT hr;
3924 DWORD count;
3925 const DWORD mode = STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE;
3927 /* AdminProperties */
3928 static const WCHAR stmname[] = {0x41ca,0x4330,0x3e71,0x44b5,0x4233,0x45f5,0x422c,0x4836,0};
3929 static const WCHAR data[] = {'M','Y','P','R','O','P','=','2','7','1','8',0};
3931 MultiByteToWideChar(CP_ACP, 0, file, -1, fileW, MAX_PATH);
3933 hr = StgOpenStorage(fileW, NULL, mode, NULL, 0, &stg);
3934 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3935 if (!stg)
3936 return;
3938 hr = IStorage_CreateStream(stg, stmname, STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3939 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3941 hr = IStream_Write(stm, data, sizeof(data), &count);
3942 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
3944 IStream_Release(stm);
3945 IStorage_Release(stg);
3948 static void test_adminprops(void)
3950 UINT r;
3952 CreateDirectoryA("msitest", NULL);
3953 create_file("msitest\\augustus", 500);
3955 create_database(msifile, amp_tables, sizeof(amp_tables) / sizeof(msi_table));
3956 set_admin_summary_info(msifile);
3957 set_admin_property_stream(msifile);
3959 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
3961 r = MsiInstallProductA(msifile, NULL);
3962 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3963 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
3964 ok(delete_pf("msitest", FALSE), "File installed\n");
3966 DeleteFile(msifile);
3967 DeleteFile("msitest\\augustus");
3968 RemoveDirectory("msitest");
3971 static void create_pf_data(LPCSTR file, LPCSTR data, BOOL is_file)
3973 CHAR path[MAX_PATH];
3975 lstrcpyA(path, PROG_FILES_DIR);
3976 lstrcatA(path, "\\");
3977 lstrcatA(path, file);
3979 if (is_file)
3980 create_file_data(path, data, 500);
3981 else
3982 CreateDirectoryA(path, NULL);
3985 #define create_pf(file, is_file) create_pf_data(file, file, is_file)
3987 static void test_removefiles(void)
3989 UINT r;
3991 CreateDirectoryA("msitest", NULL);
3992 create_file("msitest\\hydrogen", 500);
3993 create_file("msitest\\helium", 500);
3994 create_file("msitest\\lithium", 500);
3996 create_database(msifile, rem_tables, sizeof(rem_tables) / sizeof(msi_table));
3998 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
4000 r = MsiInstallProductA(msifile, NULL);
4001 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4002 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4003 ok(!pf_exists("msitest\\helium"), "File installed\n");
4004 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4005 ok(pf_exists("msitest"), "File not installed\n");
4007 r = MsiInstallProductA(msifile, "REMOVE=ALL");
4008 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4009 ok(!pf_exists("msitest\\helium"), "File not deleted\n");
4010 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
4011 todo_wine
4013 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
4014 ok(delete_pf("msitest", FALSE), "File deleted\n");
4017 create_pf("msitest", FALSE);
4018 create_pf("msitest\\hydrogen", TRUE);
4019 create_pf("msitest\\helium", TRUE);
4020 create_pf("msitest\\lithium", TRUE);
4022 r = MsiInstallProductA(msifile, NULL);
4023 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4024 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4025 ok(pf_exists("msitest\\helium"), "File not installed\n");
4026 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4027 ok(pf_exists("msitest"), "File not installed\n");
4029 r = MsiInstallProductA(msifile, "REMOVE=ALL");
4030 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4031 ok(delete_pf("msitest\\helium", TRUE), "File deleted\n");
4032 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
4033 todo_wine
4035 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
4036 ok(delete_pf("msitest", FALSE), "File deleted\n");
4039 create_pf("msitest", FALSE);
4040 create_pf("msitest\\furlong", TRUE);
4041 create_pf("msitest\\firkin", TRUE);
4042 create_pf("msitest\\fortnight", TRUE);
4043 create_pf("msitest\\becquerel", TRUE);
4044 create_pf("msitest\\dioptre", TRUE);
4045 create_pf("msitest\\attoparsec", TRUE);
4046 create_pf("msitest\\storeys", TRUE);
4047 create_pf("msitest\\block", TRUE);
4048 create_pf("msitest\\siriometer", TRUE);
4050 r = MsiInstallProductA(msifile, NULL);
4051 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4052 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4053 ok(!pf_exists("msitest\\helium"), "File installed\n");
4054 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4055 ok(pf_exists("msitest\\becquerel"), "File not installed\n");
4056 ok(pf_exists("msitest\\dioptre"), "File not installed\n");
4057 ok(pf_exists("msitest\\attoparsec"), "File not installed\n");
4058 ok(pf_exists("msitest"), "File not installed\n");
4059 todo_wine
4061 ok(!pf_exists("msitest\\firkin"), "File not deleted\n");
4062 ok(!pf_exists("msitest\\fortnight"), "File not deleted\n");
4063 ok(!pf_exists("msitest\\furlong"), "File not deleted\n");
4064 ok(!pf_exists("msitest\\storeys"), "File not deleted\n");
4065 ok(!pf_exists("msitest\\block"), "File not deleted\n");
4066 ok(!pf_exists("msitest\\siriometer"), "File not deleted\n");
4069 create_pf("msitest\\furlong", TRUE);
4070 create_pf("msitest\\firkin", TRUE);
4071 create_pf("msitest\\fortnight", TRUE);
4072 create_pf("msitest\\storeys", TRUE);
4073 create_pf("msitest\\block", TRUE);
4074 create_pf("msitest\\siriometer", TRUE);
4076 r = MsiInstallProductA(msifile, "REMOVE=ALL");
4077 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4078 ok(!delete_pf("msitest\\helium", TRUE), "File not deleted\n");
4079 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
4080 ok(delete_pf("msitest\\furlong", TRUE), "File deleted\n");
4081 ok(delete_pf("msitest\\firkin", TRUE), "File deleted\n");
4082 ok(delete_pf("msitest\\fortnight", TRUE), "File deleted\n");
4083 ok(delete_pf("msitest\\attoparsec", TRUE), "File deleted\n");
4084 ok(delete_pf("msitest\\siriometer", TRUE), "File deleted\n");
4085 todo_wine
4087 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not deleted\n");
4088 ok(!delete_pf("msitest\\becquerel", TRUE), "File not deleted\n");
4089 ok(!delete_pf("msitest\\dioptre", TRUE), "File not deleted\n");
4090 ok(!delete_pf("msitest\\storeys", TRUE), "File not deleted\n");
4091 ok(!delete_pf("msitest\\block", TRUE), "File not deleted\n");
4093 ok(delete_pf("msitest", FALSE), "File deleted\n");
4095 DeleteFile(msifile);
4096 DeleteFile("msitest\\hydrogen");
4097 DeleteFile("msitest\\helium");
4098 DeleteFile("msitest\\lithium");
4099 RemoveDirectory("msitest");
4102 static void test_movefiles(void)
4104 UINT r;
4105 char props[MAX_PATH];
4107 CreateDirectoryA("msitest", NULL);
4108 create_file("msitest\\augustus", 100);
4109 create_file("cameroon", 100);
4110 create_file("djibouti", 100);
4111 create_file("egypt", 100);
4112 create_file("finland", 100);
4113 create_file("gambai", 100);
4114 create_file("honduras", 100);
4115 create_file("msitest\\india", 100);
4116 create_file("japan", 100);
4117 create_file("kenya", 100);
4118 CreateDirectoryA("latvia", NULL);
4119 create_file("nauru", 100);
4120 create_file("apple", 100);
4121 create_file("application", 100);
4122 create_file("ape", 100);
4123 create_file("foo", 100);
4124 create_file("fao", 100);
4125 create_file("fbod", 100);
4126 create_file("budding", 100);
4127 create_file("buddy", 100);
4128 create_file("bud", 100);
4129 create_file("bar", 100);
4130 create_file("bur", 100);
4131 create_file("bird", 100);
4133 create_database(msifile, mov_tables, sizeof(mov_tables) / sizeof(msi_table));
4135 MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL);
4137 /* if the source or dest property is not a full path,
4138 * windows tries to access it as a network resource
4141 sprintf(props, "SOURCEFULL=\"%s\\\" DESTFULL=\"%s\\msitest\" "
4142 "FILEPATHBAD=\"%s\\japan\" FILEPATHGOOD=\"%s\\kenya\"",
4143 CURR_DIR, PROG_FILES_DIR, CURR_DIR, CURR_DIR);
4145 r = MsiInstallProductA(msifile, props);
4146 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4147 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
4148 ok(!delete_pf("msitest\\dest", TRUE), "File copied\n");
4149 ok(delete_pf("msitest\\canada", TRUE), "File not copied\n");
4150 ok(delete_pf("msitest\\dominica", TRUE), "File not moved\n");
4151 ok(!delete_pf("msitest\\elsalvador", TRUE), "File moved\n");
4152 ok(!delete_pf("msitest\\france", TRUE), "File moved\n");
4153 ok(!delete_pf("msitest\\georgia", TRUE), "File moved\n");
4154 ok(delete_pf("msitest\\hungary", TRUE), "File not moved\n");
4155 ok(!delete_pf("msitest\\indonesia", TRUE), "File moved\n");
4156 ok(!delete_pf("msitest\\jordan", TRUE), "File moved\n");
4157 ok(delete_pf("msitest\\kiribati", TRUE), "File not moved\n");
4158 ok(!delete_pf("msitest\\lebanon", TRUE), "File moved\n");
4159 ok(!delete_pf("msitest\\lebanon", FALSE), "Directory moved\n");
4160 /* either apple or application will be moved depending on directory order */
4161 if (!delete_pf("msitest\\apple", TRUE))
4162 ok(delete_pf("msitest\\application", TRUE), "File not moved\n");
4163 else
4164 ok(!delete_pf("msitest\\application", TRUE), "File should not exist\n");
4165 ok(delete_pf("msitest\\wildcard", TRUE), "File not moved\n");
4166 ok(!delete_pf("msitest\\ape", TRUE), "File moved\n");
4167 /* either fao or foo will be moved depending on directory order */
4168 if (delete_pf("msitest\\foo", TRUE))
4169 ok(!delete_pf("msitest\\fao", TRUE), "File should not exist\n");
4170 else
4171 ok(delete_pf("msitest\\fao", TRUE), "File not moved\n");
4172 ok(delete_pf("msitest\\single", TRUE), "File not moved\n");
4173 ok(!delete_pf("msitest\\fbod", TRUE), "File moved\n");
4174 ok(delete_pf("msitest\\budding", TRUE), "File not moved\n");
4175 ok(delete_pf("msitest\\buddy", TRUE), "File not moved\n");
4176 ok(!delete_pf("msitest\\bud", TRUE), "File moved\n");
4177 ok(delete_pf("msitest\\bar", TRUE), "File not moved\n");
4178 ok(delete_pf("msitest\\bur", TRUE), "File not moved\n");
4179 ok(!delete_pf("msitest\\bird", TRUE), "File moved\n");
4180 ok(delete_pf("msitest", FALSE), "File not installed\n");
4181 ok(DeleteFileA("cameroon"), "File moved\n");
4182 ok(!DeleteFileA("djibouti"), "File not moved\n");
4183 ok(DeleteFileA("egypt"), "File moved\n");
4184 ok(DeleteFileA("finland"), "File moved\n");
4185 ok(DeleteFileA("gambai"), "File moved\n");
4186 ok(!DeleteFileA("honduras"), "File not moved\n");
4187 ok(DeleteFileA("msitest\\india"), "File moved\n");
4188 ok(DeleteFileA("japan"), "File moved\n");
4189 ok(!DeleteFileA("kenya"), "File not moved\n");
4190 ok(RemoveDirectoryA("latvia"), "Directory moved\n");
4191 ok(!DeleteFileA("nauru"), "File not moved\n");
4192 ok(!DeleteFileA("apple"), "File not moved\n");
4193 ok(!DeleteFileA("application"), "File not moved\n");
4194 ok(DeleteFileA("ape"), "File moved\n");
4195 ok(!DeleteFileA("foo"), "File not moved\n");
4196 ok(!DeleteFileA("fao"), "File not moved\n");
4197 ok(DeleteFileA("fbod"), "File moved\n");
4198 ok(!DeleteFileA("budding"), "File not moved\n");
4199 ok(!DeleteFileA("buddy"), "File not moved\n");
4200 ok(DeleteFileA("bud"), "File moved\n");
4201 ok(!DeleteFileA("bar"), "File not moved\n");
4202 ok(!DeleteFileA("bur"), "File not moved\n");
4203 ok(DeleteFileA("bird"), "File moved\n");
4205 DeleteFile("msitest\\augustus");
4206 RemoveDirectory("msitest");
4207 DeleteFile(msifile);
4210 static void test_missingcab(void)
4212 UINT r;
4214 CreateDirectoryA("msitest", NULL);
4215 create_file("msitest\\augustus", 500);
4216 create_file("maximus", 500);
4218 create_database(msifile, mc_tables, sizeof(mc_tables) / sizeof(msi_table));
4220 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4222 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0");
4224 create_pf("msitest", FALSE);
4225 create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
4227 r = MsiInstallProductA(msifile, NULL);
4228 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4229 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
4230 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n");
4231 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
4232 ok(!delete_pf("msitest\\gaius", TRUE), "File installed\n");
4233 ok(delete_pf("msitest", FALSE), "File not installed\n");
4235 create_pf("msitest", FALSE);
4236 create_pf_data("msitest\\caesar", "abcdefgh", TRUE);
4237 create_pf("msitest\\gaius", TRUE);
4239 r = MsiInstallProductA(msifile, "GAIUS=1");
4240 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4241 todo_wine
4243 ok(!delete_pf("msitest\\maximus", TRUE), "File installed\n");
4244 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4246 ok(delete_pf("msitest\\caesar", TRUE), "File removed\n");
4247 ok(delete_pf("msitest\\gaius", TRUE), "File removed\n");
4248 ok(delete_pf("msitest", FALSE), "File not installed\n");
4250 DeleteFile("msitest\\augustus");
4251 RemoveDirectory("msitest");
4252 DeleteFile("maximus");
4253 DeleteFile("test1.cab");
4254 DeleteFile(msifile);
4257 static void test_duplicatefiles(void)
4259 UINT r;
4261 CreateDirectoryA("msitest", NULL);
4262 create_file("msitest\\maximus", 500);
4263 create_database(msifile, df_tables, sizeof(df_tables) / sizeof(msi_table));
4265 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4267 /* fails if the destination folder is not a valid property */
4269 r = MsiInstallProductA(msifile, NULL);
4270 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4271 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
4272 ok(delete_pf("msitest\\augustus", TRUE), "File not duplicated\n");
4273 ok(delete_pf("msitest\\this\\doesnot\\exist\\maximus", TRUE), "File not duplicated\n");
4274 ok(delete_pf("msitest\\this\\doesnot\\exist", FALSE), "File not duplicated\n");
4275 ok(delete_pf("msitest\\this\\doesnot", FALSE), "File not duplicated\n");
4276 ok(delete_pf("msitest\\this", FALSE), "File not duplicated\n");
4277 ok(delete_pf("msitest", FALSE), "File not installed\n");
4279 DeleteFile("msitest\\maximus");
4280 RemoveDirectory("msitest");
4281 DeleteFile(msifile);
4284 static void test_writeregistryvalues(void)
4286 UINT r;
4287 LONG res;
4288 HKEY hkey;
4289 DWORD type, size;
4290 CHAR path[MAX_PATH];
4292 CreateDirectoryA("msitest", NULL);
4293 create_file("msitest\\augustus", 500);
4295 create_database(msifile, wrv_tables, sizeof(wrv_tables) / sizeof(msi_table));
4297 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4299 r = MsiInstallProductA(msifile, NULL);
4300 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4301 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
4302 ok(delete_pf("msitest", FALSE), "File installed\n");
4304 res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey);
4305 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4307 size = MAX_PATH;
4308 type = REG_MULTI_SZ;
4309 memset(path, 'a', MAX_PATH);
4310 res = RegQueryValueExA(hkey, "Value", NULL, &type, (LPBYTE)path, &size);
4311 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
4312 ok(!memcmp(path, "one\0two\0three\0\0", size), "Wrong multi-sz data\n");
4313 ok(size == 15, "Expected 15, got %d\n", size);
4314 ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
4316 DeleteFile(msifile);
4317 DeleteFile("msitest\\augustus");
4318 RemoveDirectory("msitest");
4320 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
4321 RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine");
4324 static void test_sourcefolder(void)
4326 UINT r;
4328 CreateDirectoryA("msitest", NULL);
4329 create_file("augustus", 500);
4331 create_database(msifile, sf_tables, sizeof(sf_tables) / sizeof(msi_table));
4333 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4335 r = MsiInstallProductA(msifile, NULL);
4336 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4337 todo_wine
4339 ok(r == ERROR_INSTALL_FAILURE,
4340 "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4341 ok(!delete_pf("msitest", FALSE), "File installed\n");
4344 RemoveDirectoryA("msitest");
4346 r = MsiInstallProductA(msifile, NULL);
4347 todo_wine
4349 ok(r == ERROR_INSTALL_FAILURE,
4350 "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
4351 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n");
4352 ok(!delete_pf("msitest", FALSE), "File installed\n");
4355 DeleteFile(msifile);
4356 DeleteFile("augustus");
4359 static void test_customaction51(void)
4361 UINT r;
4363 CreateDirectoryA("msitest", NULL);
4364 create_file("msitest\\augustus", 500);
4366 create_database(msifile, ca51_tables, sizeof(ca51_tables) / sizeof(msi_table));
4368 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4370 r = MsiInstallProductA(msifile, NULL);
4371 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4372 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n");
4373 ok(delete_pf("msitest", FALSE), "File installed\n");
4375 DeleteFile(msifile);
4376 DeleteFile("msitest\\augustus");
4377 RemoveDirectory("msitest");
4380 static void test_installstate(void)
4382 UINT r;
4384 CreateDirectoryA("msitest", NULL);
4385 create_file("msitest\\alpha", 500);
4386 create_file("msitest\\beta", 500);
4387 create_file("msitest\\gamma", 500);
4388 create_file("msitest\\theta", 500);
4389 create_file("msitest\\delta", 500);
4390 create_file("msitest\\epsilon", 500);
4391 create_file("msitest\\zeta", 500);
4392 create_file("msitest\\iota", 500);
4393 create_file("msitest\\eta", 500);
4394 create_file("msitest\\kappa", 500);
4395 create_file("msitest\\lambda", 500);
4396 create_file("msitest\\mu", 500);
4398 create_database(msifile, is_tables, sizeof(is_tables) / sizeof(msi_table));
4400 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
4402 r = MsiInstallProductA(msifile, NULL);
4403 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4404 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4405 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4406 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n");
4407 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4408 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4409 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4410 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n");
4411 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4412 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4413 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4414 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4415 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4416 ok(delete_pf("msitest", FALSE), "File not installed\n");
4418 r = MsiInstallProductA(msifile, "ADDLOCAL=\"one,two,three,four\"");
4419 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4420 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4421 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4422 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n");
4423 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4424 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4425 ok(delete_pf("msitest\\epsilon", TRUE), "File not installed\n");
4426 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n");
4427 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4428 ok(delete_pf("msitest\\eta", TRUE), "File not installed\n");
4429 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4430 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4431 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4432 ok(delete_pf("msitest", FALSE), "File not installed\n");
4434 r = MsiInstallProductA(msifile, "ADDSOURCE=\"one,two,three,four\"");
4435 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4436 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n");
4437 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4438 ok(!delete_pf("msitest\\gamma", TRUE), "File installed\n");
4439 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n");
4440 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4441 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4442 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n");
4443 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4444 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4445 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4446 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4447 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4448 ok(delete_pf("msitest", FALSE), "File not installed\n");
4450 r = MsiInstallProductA(msifile, "REMOVE=\"one,two,three,four\"");
4451 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4452 ok(!delete_pf("msitest\\alpha", TRUE), "File installed\n");
4453 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n");
4454 ok(!delete_pf("msitest\\gamma", TRUE), "File installed\n");
4455 ok(!delete_pf("msitest\\theta", TRUE), "File installed\n");
4456 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n");
4457 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n");
4458 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n");
4459 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n");
4460 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n");
4461 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n");
4462 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n");
4463 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n");
4464 ok(!delete_pf("msitest", FALSE), "File installed\n");
4466 DeleteFile(msifile);
4467 DeleteFile("msitest\\alpha");
4468 DeleteFile("msitest\\beta");
4469 DeleteFile("msitest\\gamma");
4470 DeleteFile("msitest\\theta");
4471 DeleteFile("msitest\\delta");
4472 DeleteFile("msitest\\epsilon");
4473 DeleteFile("msitest\\zeta");
4474 DeleteFile("msitest\\iota");
4475 DeleteFile("msitest\\eta");
4476 DeleteFile("msitest\\kappa");
4477 DeleteFile("msitest\\lambda");
4478 DeleteFile("msitest\\mu");
4479 RemoveDirectory("msitest");
4482 START_TEST(install)
4484 DWORD len;
4485 char temp_path[MAX_PATH], prev_path[MAX_PATH];
4487 init_functionpointers();
4489 GetCurrentDirectoryA(MAX_PATH, prev_path);
4490 GetTempPath(MAX_PATH, temp_path);
4491 SetCurrentDirectoryA(temp_path);
4493 lstrcpyA(CURR_DIR, temp_path);
4494 len = lstrlenA(CURR_DIR);
4496 if(len && (CURR_DIR[len - 1] == '\\'))
4497 CURR_DIR[len - 1] = 0;
4499 get_program_files_dir(PROG_FILES_DIR, COMMON_FILES_DIR);
4501 test_MsiInstallProduct();
4502 test_MsiSetComponentState();
4503 test_packagecoltypes();
4504 test_continuouscabs();
4505 test_caborder();
4506 test_mixedmedia();
4507 test_samesequence();
4508 test_uiLevelFlags();
4509 test_readonlyfile();
4510 test_setdirproperty();
4511 test_cabisextracted();
4512 test_concurrentinstall();
4513 test_setpropertyfolder();
4514 test_publish_registerproduct();
4515 test_publish_publishproduct();
4516 test_publish_publishfeatures();
4517 test_publish_registeruser();
4518 test_publish_processcomponents();
4519 test_publish();
4520 test_publishsourcelist();
4521 test_transformprop();
4522 test_currentworkingdir();
4523 test_admin();
4524 test_adminprops();
4525 test_removefiles();
4526 test_movefiles();
4527 test_missingcab();
4528 test_duplicatefiles();
4529 test_writeregistryvalues();
4530 test_sourcefolder();
4531 test_customaction51();
4532 test_installstate();
4534 SetCurrentDirectoryA(prev_path);