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
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"
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"
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"
87 "FeatureComponents\tFeature_\tComponent_\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"
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"
109 "InstallExecuteSequence\tAction\n"
110 "AllocateRegistrySpace\tNOT Installed\t1550\n"
111 "CostFinalize\t\t1000\n"
112 "CostInitialize\t\t800\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"
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"
133 "Property\tProperty\n"
134 "DefaultUIFont\tDlgFont8\n"
137 "InstallMode\tTypical\n"
138 "Manufacturer\tWine\n"
139 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
140 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
142 "ProductLanguage\t1033\n"
143 "ProductName\tMSITEST\n"
144 "ProductVersion\t1.1.1\n"
145 "PROMPTROLLBACKCOST\tP\n"
147 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
148 "AdminProperties\tPOSTADMIN\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"
190 "feature\t\t\t\t2\t1\tTARGETDIR\t0";
192 static const CHAR cc_feature_comp_dat
[] = "Feature_\tComponent_\n"
194 "FeatureComponents\tFeature_\tComponent_\n"
196 "feature\taugustus\n"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
293 "FeatureComponents\tFeature_\tComponent_\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"
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"
305 "1\t1\t\t\tDISK1\t\n";
307 static const CHAR sdp_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
309 "InstallExecuteSequence\tAction\n"
310 "AllocateRegistrySpace\tNOT Installed\t1550\n"
311 "CostFinalize\t\t1000\n"
312 "CostInitialize\t\t800\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"
336 "FeatureComponents\tFeature_\tComponent_\n"
338 "feature\taugustus\n"
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"
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"
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"
359 "InstallExecuteSequence\tAction\n"
360 "CostFinalize\t\t1000\n"
361 "CostInitialize\t\t800\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"
388 "FeatureComponents\tFeature_\tComponent_\n"
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"
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"
403 "InstallExecuteSequence\tAction\n"
404 "CostFinalize\t\t1000\n"
405 "CostInitialize\t\t800\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"
417 "InstallUISequence\tAction\n"
418 "CostInitialize\t\t800\n"
420 "CostFinalize\t\t1000\n"
421 "ExecuteAction\t\t1100\n";
423 static const CHAR pp_install_exec_seq_dat
[] = "Action\tCondition\tSequence\n"
425 "InstallExecuteSequence\tAction\n"
426 "ValidateProductID\t\t700\n"
427 "CostInitialize\t\t800\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"
464 "AdminExecuteSequence\tAction\n"
465 "CostFinalize\t\t1000\n"
466 "CostInitialize\t\t800\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"
489 "FeatureComponents\tFeature_\tComponent_\n"
490 "feature\thydrogen\n"
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"
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"
503 "InstallExecuteSequence\tAction\n"
504 "ValidateProductID\t\t700\n"
505 "CostInitialize\t\t800\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"
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"
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"
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"
615 "InstallExecuteSequence\tAction\n"
616 "ValidateProductID\t\t700\n"
617 "GoodSetProperty\t\t725\n"
618 "BadSetProperty\t\t750\n"
619 "CostInitialize\t\t800\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"
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"
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"
659 "FeatureComponents\tFeature_\tComponent_\n"
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"
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"
692 "1\t12\t\t\tDISK1\t\n";
694 typedef struct _msi_table
696 const CHAR
*filename
;
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
),
708 ADD_TABLE(feature_comp
),
710 ADD_TABLE(install_exec_seq
),
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
),
725 ADD_TABLE(install_exec_seq
),
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
),
737 ADD_TABLE(install_exec_seq
),
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
),
749 ADD_TABLE(install_exec_seq
),
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
),
761 ADD_TABLE(install_exec_seq
),
762 ADD_TABLE(co2_media
),
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
),
773 ADD_TABLE(install_exec_seq
),
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
),
785 ADD_TABLE(install_exec_seq
),
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
),
797 ADD_TABLE(install_exec_seq
),
798 ADD_TABLE(ui_install_ui_seq
),
799 ADD_TABLE(ui_custom_action
),
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
),
811 ADD_TABLE(install_exec_seq
),
812 ADD_TABLE(rof_media
),
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
),
823 ADD_TABLE(sdp_install_exec_seq
),
824 ADD_TABLE(sdp_custom_action
),
825 ADD_TABLE(rof_media
),
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
),
836 ADD_TABLE(install_exec_seq
),
837 ADD_TABLE(cie_media
),
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
),
848 ADD_TABLE(ci_install_exec_seq
),
849 ADD_TABLE(rof_media
),
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
),
861 ADD_TABLE(install_exec_seq
),
862 ADD_TABLE(rof_media
),
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
),
873 ADD_TABLE(spf_install_exec_seq
),
874 ADD_TABLE(rof_media
),
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
),
887 ADD_TABLE(pp_install_exec_seq
),
888 ADD_TABLE(rof_media
),
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
),
899 ADD_TABLE(install_exec_seq
),
900 ADD_TABLE(rof_media
),
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
),
911 ADD_TABLE(install_exec_seq
),
912 ADD_TABLE(rof_media
),
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
),
923 ADD_TABLE(install_exec_seq
),
924 ADD_TABLE(rof_media
),
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
),
937 ADD_TABLE(install_exec_seq
),
938 ADD_TABLE(rof_media
),
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
),
949 ADD_TABLE(rem_install_exec_seq
),
950 ADD_TABLE(rof_media
),
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
),
962 ADD_TABLE(install_exec_seq
),
963 ADD_TABLE(rof_media
),
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
),
975 ADD_TABLE(install_exec_seq
),
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
),
988 ADD_TABLE(install_exec_seq
),
989 ADD_TABLE(rof_media
),
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
),
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
);
1068 static long progress(UINT typeStatus
, ULONG cb1
, ULONG cb2
, void *pv
)
1073 static int file_placed(PCCAB pccab
, char *pszFile
, long cbFile
,
1074 BOOL fContinuation
, void *pv
)
1079 static INT_PTR
fci_open(char *pszFile
, int oflag
, int pmode
, int *err
, void *pv
)
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
;
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
;
1109 res
= ReadFile(handle
, memory
, cb
, &dwRead
, NULL
);
1110 ok(res
, "Failed to ReadFile\n");
1115 static UINT
fci_write(INT_PTR hf
, void *memory
, UINT cb
, int *err
, void *pv
)
1117 HANDLE handle
= (HANDLE
)hf
;
1121 res
= WriteFile(handle
, memory
, cb
, &dwWritten
, NULL
);
1122 ok(res
, "Failed to WriteFile\n");
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");
1135 static long fci_seek(INT_PTR hf
, long dist
, int seektype
, int *err
, void *pv
)
1137 HANDLE handle
= (HANDLE
)hf
;
1140 ret
= SetFilePointer(handle
, dist
, NULL
, seektype
);
1141 ok(ret
!= INVALID_SET_FILE_POINTER
, "Failed to SetFilePointer\n");
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
);
1154 static void init_functionpointers(void)
1156 HMODULE hmsi
= GetModuleHandleA("msi.dll");
1158 #define GET_PROC(func) \
1159 p ## func = (void*)GetProcAddress(hmsi, #func); \
1161 trace("GetProcAddress(%s) failed\n", #func);
1163 GET_PROC(MsiQueryComponentStateA
);
1164 GET_PROC(MsiSourceListEnumSourcesA
);
1165 GET_PROC(MsiSourceListGetInfoA
);
1170 static BOOL
check_record(MSIHANDLE rec
, UINT field
, LPCSTR val
)
1177 r
= MsiRecordGetString(rec
, field
, buffer
, &sz
);
1178 return (r
== ERROR_SUCCESS
) && !strcmp(val
, buffer
);
1181 static BOOL
get_temp_file(char *pszTempName
, int cbTempName
, void *pv
)
1185 tempname
= HeapAlloc(GetProcessHeap(), 0, MAX_PATH
);
1186 GetTempFileNameA(".", "xx", 0, tempname
);
1188 if (tempname
&& (strlen(tempname
) < (unsigned)cbTempName
))
1190 lstrcpyA(pszTempName
, tempname
);
1191 HeapFree(GetProcessHeap(), 0, tempname
);
1195 HeapFree(GetProcessHeap(), 0, tempname
);
1200 static INT_PTR
get_open_info(char *pszName
, USHORT
*pdate
, USHORT
*ptime
,
1201 USHORT
*pattribs
, int *err
, void *pv
)
1203 BY_HANDLE_FILE_INFORMATION finfo
;
1209 handle
= CreateFile(pszName
, GENERIC_READ
, FILE_SHARE_READ
, NULL
,
1210 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
| FILE_FLAG_SEQUENTIAL_SCAN
, NULL
);
1212 ok(handle
!= INVALID_HANDLE_VALUE
, "Failed to CreateFile %s\n", pszName
);
1214 res
= GetFileInformationByHandle(handle
, &finfo
);
1215 ok(res
, "Expected GetFileInformationByHandle to succeed\n");
1217 FileTimeToLocalFileTime(&finfo
.ftLastWriteTime
, &filetime
);
1218 FileTimeToDosDateTime(&filetime
, pdate
, ptime
);
1220 attrs
= GetFileAttributes(pszName
);
1221 ok(attrs
!= INVALID_FILE_ATTRIBUTES
, "Failed to GetFileAttributes\n");
1223 return (INT_PTR
)handle
;
1226 static BOOL
add_file(HFCI hfci
, const char *file
, TCOMP compress
)
1228 char path
[MAX_PATH
];
1229 char filename
[MAX_PATH
];
1231 lstrcpyA(path
, CURR_DIR
);
1232 lstrcatA(path
, "\\");
1233 lstrcatA(path
, file
);
1235 lstrcpyA(filename
, file
);
1237 return FCIAddFile(hfci
, path
, filename
, FALSE
, get_next_cabinet
,
1238 progress
, get_open_info
, compress
);
1241 static void set_cab_parameters(PCCAB pCabParams
, const CHAR
*name
, DWORD max_size
)
1243 ZeroMemory(pCabParams
, sizeof(CCAB
));
1245 pCabParams
->cb
= max_size
;
1246 pCabParams
->cbFolderThresh
= FOLDER_THRESHOLD
;
1247 pCabParams
->setID
= 0xbeef;
1248 pCabParams
->iCab
= 1;
1249 lstrcpyA(pCabParams
->szCabPath
, CURR_DIR
);
1250 lstrcatA(pCabParams
->szCabPath
, "\\");
1251 lstrcpyA(pCabParams
->szCab
, name
);
1254 static void create_cab_file(const CHAR
*name
, DWORD max_size
, const CHAR
*files
)
1262 set_cab_parameters(&cabParams
, name
, max_size
);
1264 hfci
= FCICreate(&erf
, file_placed
, mem_alloc
, mem_free
, fci_open
,
1265 fci_read
, fci_write
, fci_close
, fci_seek
, fci_delete
,
1266 get_temp_file
, &cabParams
, NULL
);
1268 ok(hfci
!= NULL
, "Failed to create an FCI context\n");
1273 res
= add_file(hfci
, ptr
, tcompTYPE_MSZIP
);
1274 ok(res
, "Failed to add file: %s\n", ptr
);
1275 ptr
+= lstrlen(ptr
) + 1;
1278 res
= FCIFlushCabinet(hfci
, FALSE
, get_next_cabinet
, progress
);
1279 ok(res
, "Failed to flush the cabinet\n");
1281 res
= FCIDestroy(hfci
);
1282 ok(res
, "Failed to destroy the cabinet\n");
1285 static BOOL
get_program_files_dir(LPSTR buf
, LPSTR buf2
)
1290 if (RegOpenKey(HKEY_LOCAL_MACHINE
,
1291 "Software\\Microsoft\\Windows\\CurrentVersion", &hkey
))
1295 if (RegQueryValueExA(hkey
, "ProgramFilesDir", 0, &type
, (LPBYTE
)buf
, &size
)) {
1301 if (RegQueryValueExA(hkey
, "CommonFilesDir", 0, &type
, (LPBYTE
)buf2
, &size
)) {
1310 static void create_file_data(LPCSTR name
, LPCSTR data
, DWORD size
)
1315 file
= CreateFileA(name
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, 0, NULL
);
1316 ok(file
!= INVALID_HANDLE_VALUE
, "Failure to open file %s\n", name
);
1317 WriteFile(file
, data
, strlen(data
), &written
, NULL
);
1321 SetFilePointer(file
, size
, NULL
, FILE_BEGIN
);
1328 #define create_file(name, size) create_file_data(name, name, size)
1330 static void create_test_files(void)
1332 CreateDirectoryA("msitest", NULL
);
1333 create_file("msitest\\one.txt", 100);
1334 CreateDirectoryA("msitest\\first", NULL
);
1335 create_file("msitest\\first\\two.txt", 100);
1336 CreateDirectoryA("msitest\\second", NULL
);
1337 create_file("msitest\\second\\three.txt", 100);
1339 create_file("four.txt", 100);
1340 create_file("five.txt", 100);
1341 create_cab_file("msitest.cab", MEDIA_SIZE
, "four.txt\0five.txt\0");
1343 create_file("msitest\\filename", 100);
1344 create_file("msitest\\service.exe", 100);
1346 DeleteFileA("four.txt");
1347 DeleteFileA("five.txt");
1350 static BOOL
delete_pf(const CHAR
*rel_path
, BOOL is_file
)
1352 CHAR path
[MAX_PATH
];
1354 lstrcpyA(path
, PROG_FILES_DIR
);
1355 lstrcatA(path
, "\\");
1356 lstrcatA(path
, rel_path
);
1359 return DeleteFileA(path
);
1361 return RemoveDirectoryA(path
);
1364 static BOOL
delete_cf(const CHAR
*rel_path
, BOOL is_file
)
1366 CHAR path
[MAX_PATH
];
1368 lstrcpyA(path
, COMMON_FILES_DIR
);
1369 lstrcatA(path
, "\\");
1370 lstrcatA(path
, rel_path
);
1373 return DeleteFileA(path
);
1375 return RemoveDirectoryA(path
);
1378 static void delete_test_files(void)
1380 DeleteFileA("msitest.msi");
1381 DeleteFileA("msitest.cab");
1382 DeleteFileA("msitest\\second\\three.txt");
1383 DeleteFileA("msitest\\first\\two.txt");
1384 DeleteFileA("msitest\\one.txt");
1385 DeleteFileA("msitest\\service.exe");
1386 DeleteFileA("msitest\\filename");
1387 RemoveDirectoryA("msitest\\second");
1388 RemoveDirectoryA("msitest\\first");
1389 RemoveDirectoryA("msitest");
1392 static void write_file(const CHAR
*filename
, const char *data
, int data_size
)
1396 HANDLE hf
= CreateFile(filename
, GENERIC_WRITE
, 0, NULL
,
1397 CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
1399 WriteFile(hf
, data
, data_size
, &size
, NULL
);
1403 static void write_msi_summary_info(MSIHANDLE db
)
1408 r
= MsiGetSummaryInformationA(db
, NULL
, 5, &summary
);
1409 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1411 r
= MsiSummaryInfoSetPropertyA(summary
, PID_TEMPLATE
, VT_LPSTR
, 0, NULL
, ";1033");
1412 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1414 r
= MsiSummaryInfoSetPropertyA(summary
, PID_REVNUMBER
, VT_LPSTR
, 0, NULL
,
1415 "{004757CA-5092-49c2-AD20-28E1CE0DF5F2}");
1416 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1418 r
= MsiSummaryInfoSetPropertyA(summary
, PID_PAGECOUNT
, VT_I4
, 100, NULL
, NULL
);
1419 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1421 r
= MsiSummaryInfoSetPropertyA(summary
, PID_WORDCOUNT
, VT_I4
, 0, NULL
, NULL
);
1422 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1424 r
= MsiSummaryInfoSetPropertyA(summary
, PID_TITLE
, VT_LPSTR
, 0, NULL
, "MSITEST");
1425 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1427 /* write the summary changes back to the stream */
1428 r
= MsiSummaryInfoPersist(summary
);
1429 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1431 MsiCloseHandle(summary
);
1434 static void create_database(const CHAR
*name
, const msi_table
*tables
, int num_tables
)
1440 r
= MsiOpenDatabaseA(name
, MSIDBOPEN_CREATE
, &db
);
1441 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1443 /* import the tables into the database */
1444 for (j
= 0; j
< num_tables
; j
++)
1446 const msi_table
*table
= &tables
[j
];
1448 write_file(table
->filename
, table
->data
, (table
->size
- 1) * sizeof(char));
1450 r
= MsiDatabaseImportA(db
, CURR_DIR
, table
->filename
);
1451 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1453 DeleteFileA(table
->filename
);
1456 write_msi_summary_info(db
);
1458 r
= MsiDatabaseCommit(db
);
1459 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1464 static void check_service_is_installed(void)
1466 SC_HANDLE scm
, service
;
1469 scm
= OpenSCManager(NULL
, NULL
, SC_MANAGER_ALL_ACCESS
);
1470 ok(scm
!= NULL
, "Failed to open the SC Manager\n");
1472 service
= OpenService(scm
, "TestService", SC_MANAGER_ALL_ACCESS
);
1473 ok(service
!= NULL
, "Failed to open TestService\n");
1475 res
= DeleteService(service
);
1476 ok(res
, "Failed to delete TestService\n");
1478 CloseServiceHandle(service
);
1479 CloseServiceHandle(scm
);
1482 static void test_MsiInstallProduct(void)
1485 CHAR path
[MAX_PATH
];
1488 DWORD num
, size
, type
;
1491 scm
= OpenSCManager(NULL
, NULL
, GENERIC_ALL
);
1492 if (!scm
&& (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
))
1494 skip("Services are not implemented, we are most likely on win9x\n");
1497 CloseServiceHandle(scm
);
1499 create_test_files();
1500 create_database(msifile
, tables
, sizeof(tables
) / sizeof(msi_table
));
1502 r
= MsiInstallProductA(msifile
, NULL
);
1503 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1505 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE
), "File not installed\n");
1506 ok(delete_pf("msitest\\cabout\\new", FALSE
), "File not installed\n");
1507 ok(delete_pf("msitest\\cabout\\four.txt", TRUE
), "File not installed\n");
1508 ok(delete_pf("msitest\\cabout", FALSE
), "File not installed\n");
1509 ok(delete_pf("msitest\\changed\\three.txt", TRUE
), "File not installed\n");
1510 ok(delete_pf("msitest\\changed", FALSE
), "File not installed\n");
1511 ok(delete_pf("msitest\\first\\two.txt", TRUE
), "File not installed\n");
1512 ok(delete_pf("msitest\\first", FALSE
), "File not installed\n");
1513 ok(delete_pf("msitest\\one.txt", TRUE
), "File not installed\n");
1514 ok(delete_pf("msitest\\filename", TRUE
), "File not installed\n");
1515 ok(delete_pf("msitest\\service.exe", TRUE
), "File not installed\n");
1516 ok(delete_pf("msitest", FALSE
), "File not installed\n");
1518 res
= RegOpenKey(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Wine\\msitest", &hkey
);
1519 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
1523 res
= RegQueryValueExA(hkey
, "Name", NULL
, &type
, (LPBYTE
)path
, &size
);
1524 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
1525 ok(!lstrcmpA(path
, "imaname"), "Expected imaname, got %s\n", path
);
1529 res
= RegQueryValueExA(hkey
, "blah", NULL
, &type
, (LPBYTE
)path
, &size
);
1530 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
1534 res
= RegQueryValueExA(hkey
, "number", NULL
, &type
, (LPBYTE
)&num
, &size
);
1535 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
1536 ok(num
== 314, "Expected 314, got %d\n", num
);
1540 res
= RegQueryValueExA(hkey
, "OrderTestName", NULL
, &type
, (LPBYTE
)path
, &size
);
1541 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
1542 ok(!lstrcmpA(path
, "OrderTestValue"), "Expected imaname, got %s\n", path
);
1544 check_service_is_installed();
1546 RegDeleteKeyA(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Wine\\msitest");
1548 delete_test_files();
1551 static void test_MsiSetComponentState(void)
1553 INSTALLSTATE installed
, action
;
1555 char path
[MAX_PATH
];
1558 create_database(msifile
, tables
, sizeof(tables
) / sizeof(msi_table
));
1562 lstrcpy(path
, CURR_DIR
);
1563 lstrcat(path
, "\\");
1564 lstrcat(path
, msifile
);
1566 r
= MsiOpenPackage(path
, &package
);
1567 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1569 r
= MsiDoAction(package
, "CostInitialize");
1570 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1572 r
= MsiDoAction(package
, "FileCost");
1573 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1575 r
= MsiDoAction(package
, "CostFinalize");
1576 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1578 r
= MsiGetComponentState(package
, "dangler", &installed
, &action
);
1579 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1580 ok(installed
== INSTALLSTATE_ABSENT
, "Expected INSTALLSTATE_ABSENT, got %d\n", installed
);
1581 ok(action
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action
);
1583 r
= MsiSetComponentState(package
, "dangler", INSTALLSTATE_SOURCE
);
1584 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1586 MsiCloseHandle(package
);
1589 DeleteFileA(msifile
);
1592 static void test_packagecoltypes(void)
1594 MSIHANDLE hdb
, view
, rec
;
1595 char path
[MAX_PATH
];
1599 create_database(msifile
, tables
, sizeof(tables
) / sizeof(msi_table
));
1603 lstrcpy(path
, CURR_DIR
);
1604 lstrcat(path
, "\\");
1605 lstrcat(path
, msifile
);
1607 r
= MsiOpenDatabase(path
, MSIDBOPEN_READONLY
, &hdb
);
1608 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1610 query
= "SELECT * FROM `Media`";
1611 r
= MsiDatabaseOpenView( hdb
, query
, &view
);
1612 ok(r
== ERROR_SUCCESS
, "MsiDatabaseOpenView failed\n");
1614 r
= MsiViewGetColumnInfo( view
, MSICOLINFO_NAMES
, &rec
);
1615 count
= MsiRecordGetFieldCount( rec
);
1616 ok(r
== ERROR_SUCCESS
, "MsiViewGetColumnInfo failed\n");
1617 ok(count
== 6, "Expected 6, got %d\n", count
);
1618 ok(check_record(rec
, 1, "DiskId"), "wrong column label\n");
1619 ok(check_record(rec
, 2, "LastSequence"), "wrong column label\n");
1620 ok(check_record(rec
, 3, "DiskPrompt"), "wrong column label\n");
1621 ok(check_record(rec
, 4, "Cabinet"), "wrong column label\n");
1622 ok(check_record(rec
, 5, "VolumeLabel"), "wrong column label\n");
1623 ok(check_record(rec
, 6, "Source"), "wrong column label\n");
1624 MsiCloseHandle(rec
);
1626 r
= MsiViewGetColumnInfo( view
, MSICOLINFO_TYPES
, &rec
);
1627 count
= MsiRecordGetFieldCount( rec
);
1628 ok(r
== ERROR_SUCCESS
, "MsiViewGetColumnInfo failed\n");
1629 ok(count
== 6, "Expected 6, got %d\n", count
);
1630 ok(check_record(rec
, 1, "i2"), "wrong column label\n");
1631 ok(check_record(rec
, 2, "i4"), "wrong column label\n");
1632 ok(check_record(rec
, 3, "L64"), "wrong column label\n");
1633 ok(check_record(rec
, 4, "S255"), "wrong column label\n");
1634 ok(check_record(rec
, 5, "S32"), "wrong column label\n");
1635 ok(check_record(rec
, 6, "S72"), "wrong column label\n");
1637 MsiCloseHandle(rec
);
1638 MsiCloseHandle(view
);
1639 MsiCloseHandle(hdb
);
1640 DeleteFile(msifile
);
1643 static void create_cc_test_files(void)
1648 static CHAR cab_context
[] = "test%d.cab";
1651 create_file("maximus", 500);
1652 create_file("augustus", 50000);
1653 create_file("tiberius", 500);
1654 create_file("caesar", 500);
1656 set_cab_parameters(&cabParams
, "test1.cab", 40000);
1658 hfci
= FCICreate(&erf
, file_placed
, mem_alloc
, mem_free
, fci_open
,
1659 fci_read
, fci_write
, fci_close
, fci_seek
, fci_delete
,
1660 get_temp_file
, &cabParams
, cab_context
);
1661 ok(hfci
!= NULL
, "Failed to create an FCI context\n");
1663 res
= add_file(hfci
, "maximus", tcompTYPE_NONE
);
1664 ok(res
, "Failed to add file maximus\n");
1666 res
= add_file(hfci
, "augustus", tcompTYPE_NONE
);
1667 ok(res
, "Failed to add file augustus\n");
1669 res
= add_file(hfci
, "tiberius", tcompTYPE_NONE
);
1670 ok(res
, "Failed to add file tiberius\n");
1672 res
= FCIFlushCabinet(hfci
, FALSE
, get_next_cabinet
, progress
);
1673 ok(res
, "Failed to flush the cabinet\n");
1675 res
= FCIDestroy(hfci
);
1676 ok(res
, "Failed to destroy the cabinet\n");
1678 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
1680 DeleteFile("maximus");
1681 DeleteFile("augustus");
1682 DeleteFile("tiberius");
1683 DeleteFile("caesar");
1686 static void delete_cab_files(void)
1688 SHFILEOPSTRUCT shfl
;
1689 CHAR path
[MAX_PATH
+10];
1691 lstrcpyA(path
, CURR_DIR
);
1692 lstrcatA(path
, "\\*.cab");
1693 path
[strlen(path
) + 1] = '\0';
1696 shfl
.wFunc
= FO_DELETE
;
1699 shfl
.fFlags
= FOF_FILESONLY
| FOF_NOCONFIRMATION
| FOF_NORECURSION
| FOF_SILENT
;
1701 SHFileOperation(&shfl
);
1704 static void test_continuouscabs(void)
1708 create_cc_test_files();
1709 create_database(msifile
, cc_tables
, sizeof(cc_tables
) / sizeof(msi_table
));
1711 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1713 r
= MsiInstallProductA(msifile
, NULL
);
1714 if (r
== ERROR_SUCCESS
) /* win9x has a problem with this */
1716 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1717 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
1718 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
1719 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
1720 ok(delete_pf("msitest", FALSE
), "File not installed\n");
1724 DeleteFile(msifile
);
1726 create_cc_test_files();
1727 create_database(msifile
, cc2_tables
, sizeof(cc2_tables
) / sizeof(msi_table
));
1729 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1731 r
= MsiInstallProductA(msifile
, NULL
);
1732 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1733 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
1734 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
1735 ok(delete_pf("msitest\\tiberius", TRUE
), "File not installed\n");
1736 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
1737 ok(delete_pf("msitest", FALSE
), "File not installed\n");
1740 DeleteFile(msifile
);
1743 static void test_caborder(void)
1747 create_file("imperator", 100);
1748 create_file("maximus", 500);
1749 create_file("augustus", 50000);
1750 create_file("caesar", 500);
1752 create_database(msifile
, cc_tables
, sizeof(cc_tables
) / sizeof(msi_table
));
1754 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1756 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
1757 create_cab_file("test2.cab", MEDIA_SIZE
, "augustus\0");
1758 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
1760 r
= MsiInstallProductA(msifile
, NULL
);
1761 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
1762 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
1763 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
1766 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
1767 ok(!delete_pf("msitest", FALSE
), "File is installed\n");
1772 create_cab_file("test1.cab", MEDIA_SIZE
, "imperator\0");
1773 create_cab_file("test2.cab", MEDIA_SIZE
, "maximus\0augustus\0");
1774 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
1776 r
= MsiInstallProductA(msifile
, NULL
);
1777 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
1778 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
1779 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
1780 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
1783 ok(!delete_pf("msitest", FALSE
), "File is installed\n");
1787 DeleteFile(msifile
);
1789 create_cc_test_files();
1790 create_database(msifile
, co_tables
, sizeof(co_tables
) / sizeof(msi_table
));
1792 r
= MsiInstallProductA(msifile
, NULL
);
1793 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
1794 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
1795 ok(!delete_pf("msitest", FALSE
), "File is installed\n");
1798 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
1799 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
1803 DeleteFile(msifile
);
1805 create_cc_test_files();
1806 create_database(msifile
, co2_tables
, sizeof(co2_tables
) / sizeof(msi_table
));
1808 r
= MsiInstallProductA(msifile
, NULL
);
1809 ok(!delete_pf("msitest\\caesar", TRUE
), "File is installed\n");
1812 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
1813 ok(!delete_pf("msitest\\augustus", TRUE
), "File is installed\n");
1814 ok(!delete_pf("msitest\\maximus", TRUE
), "File is installed\n");
1815 ok(!delete_pf("msitest", FALSE
), "File is installed\n");
1819 DeleteFile("imperator");
1820 DeleteFile("maximus");
1821 DeleteFile("augustus");
1822 DeleteFile("caesar");
1823 DeleteFile(msifile
);
1826 static void test_mixedmedia(void)
1830 CreateDirectoryA("msitest", NULL
);
1831 create_file("msitest\\maximus", 500);
1832 create_file("msitest\\augustus", 500);
1833 create_file("caesar", 500);
1835 create_database(msifile
, mm_tables
, sizeof(mm_tables
) / sizeof(msi_table
));
1837 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1839 create_cab_file("test1.cab", MEDIA_SIZE
, "caesar\0");
1841 r
= MsiInstallProductA(msifile
, NULL
);
1842 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1843 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
1844 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
1845 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
1846 ok(delete_pf("msitest", FALSE
), "File not installed\n");
1848 /* Delete the files in the temp (current) folder */
1849 DeleteFile("msitest\\maximus");
1850 DeleteFile("msitest\\augustus");
1851 RemoveDirectory("msitest");
1852 DeleteFile("caesar");
1853 DeleteFile("test1.cab");
1854 DeleteFile(msifile
);
1857 static void test_samesequence(void)
1861 create_cc_test_files();
1862 create_database(msifile
, ss_tables
, sizeof(ss_tables
) / sizeof(msi_table
));
1864 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1866 r
= MsiInstallProductA(msifile
, NULL
);
1867 if (r
== ERROR_SUCCESS
) /* win9x has a problem with this */
1869 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1870 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
1871 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
1872 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
1873 ok(delete_pf("msitest", FALSE
), "File not installed\n");
1877 DeleteFile(msifile
);
1880 static void test_uiLevelFlags(void)
1884 create_cc_test_files();
1885 create_database(msifile
, ui_tables
, sizeof(ui_tables
) / sizeof(msi_table
));
1887 MsiSetInternalUI(INSTALLUILEVEL_NONE
| INSTALLUILEVEL_SOURCERESONLY
, NULL
);
1889 r
= MsiInstallProductA(msifile
, NULL
);
1890 if (r
== ERROR_SUCCESS
) /* win9x has a problem with this */
1892 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1893 ok(!delete_pf("msitest\\maximus", TRUE
), "UI install occurred, but execute-only was requested.\n");
1894 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
1895 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
1896 ok(delete_pf("msitest", FALSE
), "File not installed\n");
1900 DeleteFile(msifile
);
1903 static BOOL
file_matches(LPSTR path
)
1909 file
= CreateFile(path
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
1910 NULL
, OPEN_EXISTING
, 0, NULL
);
1912 ZeroMemory(buf
, MAX_PATH
);
1913 ReadFile(file
, buf
, 15, &size
, NULL
);
1916 return !lstrcmp(buf
, "msitest\\maximus");
1919 static void test_readonlyfile(void)
1924 CHAR path
[MAX_PATH
];
1926 CreateDirectoryA("msitest", NULL
);
1927 create_file("msitest\\maximus", 500);
1928 create_database(msifile
, rof_tables
, sizeof(rof_tables
) / sizeof(msi_table
));
1930 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1932 lstrcpy(path
, PROG_FILES_DIR
);
1933 lstrcat(path
, "\\msitest");
1934 CreateDirectory(path
, NULL
);
1936 lstrcat(path
, "\\maximus");
1937 file
= CreateFile(path
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
1938 NULL
, CREATE_NEW
, FILE_ATTRIBUTE_READONLY
, NULL
);
1940 WriteFile(file
, "readonlyfile", 20, &size
, NULL
);
1943 r
= MsiInstallProductA(msifile
, NULL
);
1944 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1945 ok(file_matches(path
), "Expected file to be overwritten\n");
1946 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
1947 ok(delete_pf("msitest", FALSE
), "File not installed\n");
1949 /* Delete the files in the temp (current) folder */
1950 DeleteFile("msitest\\maximus");
1951 RemoveDirectory("msitest");
1952 DeleteFile(msifile
);
1955 static void test_setdirproperty(void)
1959 CreateDirectoryA("msitest", NULL
);
1960 create_file("msitest\\maximus", 500);
1961 create_database(msifile
, sdp_tables
, sizeof(sdp_tables
) / sizeof(msi_table
));
1963 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1965 r
= MsiInstallProductA(msifile
, NULL
);
1966 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1967 ok(delete_cf("msitest\\maximus", TRUE
), "File not installed\n");
1968 ok(delete_cf("msitest", FALSE
), "File not installed\n");
1970 /* Delete the files in the temp (current) folder */
1971 DeleteFile(msifile
);
1972 DeleteFile("msitest\\maximus");
1973 RemoveDirectory("msitest");
1976 static void test_cabisextracted(void)
1980 CreateDirectoryA("msitest", NULL
);
1981 create_file("msitest\\gaius", 500);
1982 create_file("maximus", 500);
1983 create_file("augustus", 500);
1984 create_file("caesar", 500);
1986 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
1987 create_cab_file("test2.cab", MEDIA_SIZE
, "augustus\0");
1988 create_cab_file("test3.cab", MEDIA_SIZE
, "caesar\0");
1990 create_database(msifile
, cie_tables
, sizeof(cie_tables
) / sizeof(msi_table
));
1992 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
1994 r
= MsiInstallProductA(msifile
, NULL
);
1995 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
1996 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
1997 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
1998 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
1999 ok(delete_pf("msitest\\gaius", TRUE
), "File not installed\n");
2000 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2002 /* Delete the files in the temp (current) folder */
2004 DeleteFile(msifile
);
2005 DeleteFile("maximus");
2006 DeleteFile("augustus");
2007 DeleteFile("caesar");
2008 DeleteFile("msitest\\gaius");
2009 RemoveDirectory("msitest");
2012 static void test_concurrentinstall(void)
2015 CHAR path
[MAX_PATH
];
2017 CreateDirectoryA("msitest", NULL
);
2018 CreateDirectoryA("msitest\\msitest", NULL
);
2019 create_file("msitest\\maximus", 500);
2020 create_file("msitest\\msitest\\augustus", 500);
2022 create_database(msifile
, ci_tables
, sizeof(ci_tables
) / sizeof(msi_table
));
2024 lstrcpyA(path
, CURR_DIR
);
2025 lstrcatA(path
, "\\msitest\\concurrent.msi");
2026 create_database(path
, ci2_tables
, sizeof(ci2_tables
) / sizeof(msi_table
));
2028 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2030 r
= MsiInstallProductA(msifile
, NULL
);
2031 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2032 if (!delete_pf("msitest\\augustus", TRUE
))
2033 trace("concurrent installs not supported\n");
2034 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2035 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2039 r
= MsiInstallProductA(msifile
, NULL
);
2040 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2041 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2042 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
2043 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2045 DeleteFile(msifile
);
2046 DeleteFile("msitest\\msitest\\augustus");
2047 DeleteFile("msitest\\maximus");
2048 RemoveDirectory("msitest\\msitest");
2049 RemoveDirectory("msitest");
2052 static void test_setpropertyfolder(void)
2055 CHAR path
[MAX_PATH
];
2057 lstrcpyA(path
, PROG_FILES_DIR
);
2058 lstrcatA(path
, "\\msitest\\added");
2060 CreateDirectoryA("msitest", NULL
);
2061 create_file("msitest\\maximus", 500);
2063 create_database(msifile
, spf_tables
, sizeof(spf_tables
) / sizeof(msi_table
));
2065 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2067 r
= MsiInstallProductA(msifile
, NULL
);
2068 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2069 if (GetFileAttributesA(path
) == FILE_ATTRIBUTE_DIRECTORY
)
2071 ok(delete_pf("msitest\\added\\maximus", TRUE
), "File not installed\n");
2072 ok(delete_pf("msitest\\added", FALSE
), "File not installed\n");
2073 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2077 trace("changing folder property not supported\n");
2078 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2079 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2082 /* Delete the files in the temp (current) folder */
2083 DeleteFile(msifile
);
2084 DeleteFile("msitest\\maximus");
2085 RemoveDirectory("msitest");
2088 static BOOL
file_exists(LPCSTR file
)
2090 return GetFileAttributes(file
) != INVALID_FILE_ATTRIBUTES
;
2093 static BOOL
pf_exists(LPCSTR file
)
2095 CHAR path
[MAX_PATH
];
2097 lstrcpyA(path
, PROG_FILES_DIR
);
2098 lstrcatA(path
, "\\");
2099 lstrcatA(path
, file
);
2101 return file_exists(path
);
2104 static void delete_pfmsitest_files(void)
2106 SHFILEOPSTRUCT shfl
;
2107 CHAR path
[MAX_PATH
+11];
2109 lstrcpyA(path
, PROG_FILES_DIR
);
2110 lstrcatA(path
, "\\msitest\\*");
2111 path
[strlen(path
) + 1] = '\0';
2114 shfl
.wFunc
= FO_DELETE
;
2117 shfl
.fFlags
= FOF_FILESONLY
| FOF_NOCONFIRMATION
| FOF_NORECURSION
| FOF_SILENT
;
2119 SHFileOperation(&shfl
);
2121 lstrcpyA(path
, PROG_FILES_DIR
);
2122 lstrcatA(path
, "\\msitest");
2123 RemoveDirectoryA(path
);
2126 static void check_reg_str(HKEY prodkey
, LPCSTR name
, LPCSTR expected
, BOOL bcase
, DWORD line
)
2134 res
= RegQueryValueExA(prodkey
, name
, NULL
, &type
, (LPBYTE
)val
, &size
);
2136 if (res
!= ERROR_SUCCESS
|| (type
!= REG_SZ
&& type
!= REG_EXPAND_SZ
))
2138 ok_(__FILE__
, line
)(FALSE
, "Key doesn't exist or wrong type\n");
2143 ok_(__FILE__
, line
)(lstrlenA(val
) == 0, "Expected empty string, got %s\n", val
);
2147 ok_(__FILE__
, line
)(!lstrcmpA(val
, expected
), "Expected %s, got %s\n", expected
, val
);
2149 ok_(__FILE__
, line
)(!lstrcmpiA(val
, expected
), "Expected %s, got %s\n", expected
, val
);
2153 static void check_reg_dword(HKEY prodkey
, LPCSTR name
, DWORD expected
, DWORD line
)
2155 DWORD val
, size
, type
;
2158 size
= sizeof(DWORD
);
2159 res
= RegQueryValueExA(prodkey
, name
, NULL
, &type
, (LPBYTE
)&val
, &size
);
2161 if (res
!= ERROR_SUCCESS
|| type
!= REG_DWORD
)
2163 ok_(__FILE__
, line
)(FALSE
, "Key doesn't exist or wrong type\n");
2167 ok_(__FILE__
, line
)(val
== expected
, "Expected %d, got %d\n", expected
, val
);
2170 #define CHECK_REG_STR(prodkey, name, expected) \
2171 check_reg_str(prodkey, name, expected, TRUE, __LINE__);
2173 #define CHECK_REG_ISTR(prodkey, name, expected) \
2174 check_reg_str(prodkey, name, expected, FALSE, __LINE__);
2176 #define CHECK_REG_DWORD(prodkey, name, expected) \
2177 check_reg_dword(prodkey, name, expected, __LINE__);
2179 static void get_date_str(LPSTR date
)
2183 static const char date_fmt
[] = "%d%02d%02d";
2184 GetLocalTime(&systime
);
2185 sprintf(date
, date_fmt
, systime
.wYear
, systime
.wMonth
, systime
.wDay
);
2188 static void test_publish_registerproduct(void)
2192 HKEY uninstall
, prodkey
;
2194 CHAR prodcode
[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2195 char date
[MAX_PATH
];
2196 char temp
[MAX_PATH
];
2198 static const CHAR subkey
[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2200 if (!pMsiQueryComponentStateA
)
2202 skip("MsiQueryComponentStateA is not available\n");
2207 GetTempPath(MAX_PATH
, temp
);
2209 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, subkey
, &uninstall
);
2210 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2212 CreateDirectoryA("msitest", NULL
);
2213 create_file("msitest\\maximus", 500);
2215 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
2217 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2219 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2220 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2222 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2223 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2225 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2226 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2228 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2229 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2230 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2231 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2233 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2234 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2236 /* RegisterProduct */
2237 r
= MsiInstallProductA(msifile
, "REGISTER_PRODUCT=1");
2238 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2239 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2240 ok(pf_exists("msitest"), "File not installed\n");
2242 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2243 ok(state
== INSTALLSTATE_ABSENT
, "Expected INSTALLSTATE_ABSENT, got %d\n", state
);
2245 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2246 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2248 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2249 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2251 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2252 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2253 ok(r
== ERROR_UNKNOWN_COMPONENT
, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r
);
2254 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2256 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2257 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2259 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
2260 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
2261 CHECK_REG_STR(prodkey
, "InstallDate", date
);
2262 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
2263 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2264 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
2265 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2266 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
2267 CHECK_REG_STR(prodkey
, "Comments", NULL
);
2268 CHECK_REG_STR(prodkey
, "Contact", NULL
);
2269 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
2270 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
2271 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
2272 CHECK_REG_STR(prodkey
, "Readme", NULL
);
2273 CHECK_REG_STR(prodkey
, "Size", NULL
);
2274 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
2275 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
2276 CHECK_REG_DWORD(prodkey
, "Language", 1033);
2277 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
2278 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
2279 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
2280 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
2283 CHECK_REG_DWORD(prodkey
, "EstimatedSize", 12);
2286 RegCloseKey(prodkey
);
2288 /* try to uninstall after RegisterProduct */
2289 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
2292 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2294 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2295 ok(pf_exists("msitest"), "File deleted\n");
2297 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2300 ok(state
== INSTALLSTATE_ABSENT
, "Expected INSTALLSTATE_ABSENT, got %d\n", state
);
2303 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2304 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2306 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2307 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2309 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2310 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2313 ok(r
== ERROR_UNKNOWN_COMPONENT
, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r
);
2315 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2317 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2320 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2325 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
2326 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
2327 CHECK_REG_STR(prodkey
, "InstallDate", date
);
2328 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
2329 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2330 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
2331 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2332 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
2333 CHECK_REG_STR(prodkey
, "Comments", NULL
);
2334 CHECK_REG_STR(prodkey
, "Contact", NULL
);
2335 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
2336 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
2337 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
2338 CHECK_REG_STR(prodkey
, "Readme", NULL
);
2339 CHECK_REG_STR(prodkey
, "Size", NULL
);
2340 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
2341 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
2342 CHECK_REG_DWORD(prodkey
, "Language", 1033);
2343 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
2344 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
2345 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
2346 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
2347 CHECK_REG_DWORD(prodkey
, "EstimatedSize", 12);
2350 RegCloseKey(prodkey
);
2352 /* full install to remove */
2353 r
= MsiInstallProductA(msifile
, "FULL=1");
2354 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2355 r
= MsiInstallProductA(msifile
, "FULL=1 REMOVE=ALL");
2356 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2358 RegCloseKey(uninstall
);
2359 DeleteFile(msifile
);
2360 DeleteFile("msitest\\maximus");
2361 RemoveDirectory("msitest");
2362 delete_pfmsitest_files();
2365 static void test_publish_publishproduct(void)
2369 HKEY uninstall
, prodkey
;
2371 CHAR prodcode
[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2373 static const CHAR subkey
[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2375 if (!pMsiQueryComponentStateA
)
2377 skip("MsiQueryComponentStateA is not available\n");
2381 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, subkey
, &uninstall
);
2382 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2384 CreateDirectoryA("msitest", NULL
);
2385 create_file("msitest\\maximus", 500);
2387 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
2389 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2391 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2392 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2394 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2395 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2397 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2398 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2400 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2401 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2402 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2403 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2405 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2406 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2408 /* PublishProduct */
2409 r
= MsiInstallProductA(msifile
, "PUBLISH_PRODUCT=1");
2410 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2411 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2412 ok(pf_exists("msitest"), "File not installed\n");
2414 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2415 ok(state
== INSTALLSTATE_ADVERTISED
, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state
);
2417 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2418 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2420 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2421 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2423 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2424 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2425 ok(r
== ERROR_UNKNOWN_COMPONENT
, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r
);
2426 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2428 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2429 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2431 /* try to uninstall after PublishProduct */
2432 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
2433 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2434 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2435 ok(pf_exists("msitest"), "File deleted\n");
2437 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2438 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2440 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2441 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2443 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2444 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2446 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2447 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2448 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2449 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2451 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2452 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2454 /* full install to remove */
2455 r
= MsiInstallProductA(msifile
, "FULL=1");
2456 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2457 r
= MsiInstallProductA(msifile
, "FULL=1 REMOVE=ALL");
2458 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2460 RegCloseKey(uninstall
);
2461 DeleteFile(msifile
);
2462 DeleteFile("msitest\\maximus");
2463 RemoveDirectory("msitest");
2464 delete_pfmsitest_files();
2467 static void test_publish_publishfeatures(void)
2471 HKEY uninstall
, prodkey
;
2473 CHAR prodcode
[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2475 static const CHAR subkey
[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2477 if (!pMsiQueryComponentStateA
)
2479 skip("MsiQueryComponentStateA is not available\n");
2483 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, subkey
, &uninstall
);
2484 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2486 CreateDirectoryA("msitest", NULL
);
2487 create_file("msitest\\maximus", 500);
2489 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
2491 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2493 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2494 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2496 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2497 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2499 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2500 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2502 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2503 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2504 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2505 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2507 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2508 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2510 /* PublishFeatures */
2511 r
= MsiInstallProductA(msifile
, "PUBLISH_FEATURES=1");
2512 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2513 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2514 ok(pf_exists("msitest"), "File not installed\n");
2516 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2517 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2519 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2520 ok(state
== INSTALLSTATE_ADVERTISED
, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state
);
2522 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2523 ok(state
== INSTALLSTATE_ADVERTISED
, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state
);
2525 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2526 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2527 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2528 ok(state
== INSTALLSTATE_ADVERTISED
, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state
);
2530 /* try to uninstall after PublishFeatures */
2531 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
2534 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2536 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2537 ok(pf_exists("msitest"), "File deleted\n");
2539 /* PublishFeatures and PublishProduct */
2540 r
= MsiInstallProductA(msifile
, "PUBLISH_PRODUCT=1 PUBLISH_FEATURES=1");
2541 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2542 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2543 ok(pf_exists("msitest"), "File not installed\n");
2545 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2546 ok(state
== INSTALLSTATE_ADVERTISED
, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state
);
2548 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2549 ok(state
== INSTALLSTATE_ADVERTISED
, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state
);
2551 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2552 ok(state
== INSTALLSTATE_ADVERTISED
, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state
);
2554 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2555 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2556 ok(r
== ERROR_UNKNOWN_COMPONENT
, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r
);
2557 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2559 /* PublishFeatures and RegisterProduct */
2560 r
= MsiInstallProductA(msifile
, "REGISTER_PRODUCT=1 PUBLISH_FEATURES=1");
2561 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2562 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2563 ok(pf_exists("msitest"), "File not installed\n");
2565 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2566 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
2568 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2569 ok(state
== INSTALLSTATE_ADVERTISED
, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state
);
2571 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2572 ok(state
== INSTALLSTATE_ADVERTISED
, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state
);
2574 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2575 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2576 ok(r
== ERROR_UNKNOWN_COMPONENT
, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r
);
2577 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2579 /* full install to remove */
2580 r
= MsiInstallProductA(msifile
, "FULL=1");
2581 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2582 r
= MsiInstallProductA(msifile
, "FULL=1 REMOVE=ALL");
2583 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2585 RegCloseKey(uninstall
);
2586 DeleteFile(msifile
);
2587 DeleteFile("msitest\\maximus");
2588 RemoveDirectory("msitest");
2589 delete_pfmsitest_files();
2592 static void test_publish_registeruser(void)
2596 HKEY uninstall
, prodkey
;
2598 CHAR prodcode
[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2600 static const CHAR subkey
[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2602 if (!pMsiQueryComponentStateA
)
2604 skip("MsiQueryComponentStateA is not available\n");
2608 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, subkey
, &uninstall
);
2609 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2611 CreateDirectoryA("msitest", NULL
);
2612 create_file("msitest\\maximus", 500);
2614 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
2616 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2618 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2619 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2621 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2622 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2624 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2625 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2627 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2628 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2629 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2630 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2632 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2633 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2636 r
= MsiInstallProductA(msifile
, "REGISTER_USER=1");
2637 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2638 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2639 ok(pf_exists("msitest"), "File not installed\n");
2641 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2644 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2647 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2648 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2650 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2651 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2653 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2654 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2655 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2656 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2658 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2659 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2661 /* try to uninstall after RegisterUser */
2662 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
2665 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2667 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2668 ok(pf_exists("msitest"), "File deleted\n");
2670 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2671 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2673 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2674 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2676 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2677 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2679 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2680 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2681 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2682 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2684 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2685 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2687 /* full install to remove */
2688 r
= MsiInstallProductA(msifile
, "FULL=1");
2689 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2690 r
= MsiInstallProductA(msifile
, "FULL=1 REMOVE=ALL");
2691 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2693 RegCloseKey(uninstall
);
2694 DeleteFile(msifile
);
2695 DeleteFile("msitest\\maximus");
2696 RemoveDirectory("msitest");
2697 delete_pfmsitest_files();
2700 static void get_user_sid(LPSTR
*usersid
)
2706 HMODULE hadvapi32
= GetModuleHandleA("advapi32.dll");
2707 static BOOL (WINAPI
*pConvertSidToStringSidA
)(PSID
, LPSTR
*);
2710 pConvertSidToStringSidA
= (void *)GetProcAddress(hadvapi32
, "ConvertSidToStringSidA");
2711 if (!pConvertSidToStringSidA
)
2714 OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY
, &token
);
2716 GetTokenInformation(token
, TokenUser
, (void *)buf
, size
, &size
);
2717 user
= (PTOKEN_USER
)buf
;
2718 pConvertSidToStringSidA(user
->User
.Sid
, usersid
);
2721 static void test_publish_processcomponents(void)
2729 CHAR keypath
[MAX_PATH
];
2731 static const CHAR keyfmt
[] =
2732 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
2733 "UserData\\%s\\Components\\CBABC2FDCCB35E749A8944D8C1C098B5";
2734 static const CHAR compkey
[] =
2735 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Components";
2737 get_user_sid(&usersid
);
2740 skip("ConvertSidToStringSidA is not available\n");
2744 CreateDirectoryA("msitest", NULL
);
2745 create_file("msitest\\maximus", 500);
2747 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
2749 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2751 /* ProcessComponents, per-user */
2752 r
= MsiInstallProductA(msifile
, "PROCESS_COMPONENTS=1");
2753 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2754 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
2755 ok(delete_pf("msitest", FALSE
), "File not installed\n");
2757 sprintf(keypath
, keyfmt
, usersid
);
2759 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, keypath
, &comp
);
2760 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2763 res
= RegQueryValueExA(comp
, "84A88FD7F6998CE40A22FB59F6B9C2BB",
2764 NULL
, NULL
, (LPBYTE
)val
, &size
);
2765 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2766 ok(!lstrcmpA(val
, "C:\\Program Files\\msitest\\maximus"),
2767 "Expected \"%s\", got \"%s\"\n", "C:\\Program Files\\msitest\\maximus", val
);
2769 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, compkey
, &hkey
);
2770 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2772 RegDeleteValueA(comp
, "84A88FD7F6998CE40A22FB59F6B9C2BB");
2773 RegDeleteKeyA(comp
, "");
2776 DeleteFile(msifile
);
2777 DeleteFile("msitest\\maximus");
2778 RemoveDirectory("msitest");
2781 static void test_publish(void)
2785 HKEY uninstall
, prodkey
;
2787 CHAR prodcode
[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2788 char date
[MAX_PATH
];
2789 char temp
[MAX_PATH
];
2791 static const CHAR subkey
[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
2793 if (!pMsiQueryComponentStateA
)
2795 skip("MsiQueryComponentStateA is not available\n");
2800 GetTempPath(MAX_PATH
, temp
);
2802 res
= RegOpenKeyA(HKEY_LOCAL_MACHINE
, subkey
, &uninstall
);
2803 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2805 CreateDirectoryA("msitest", NULL
);
2806 create_file("msitest\\maximus", 500);
2808 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
2810 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
2812 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2813 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2815 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2816 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2818 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2819 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2821 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2822 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2823 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2824 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2826 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2827 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2829 /* nothing published */
2830 r
= MsiInstallProductA(msifile
, NULL
);
2831 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
2832 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2833 ok(pf_exists("msitest"), "File not installed\n");
2835 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2836 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2838 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2839 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2841 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2842 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2844 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2845 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2846 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2847 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2849 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2850 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2852 /* PublishProduct and RegisterProduct */
2853 r
= MsiInstallProductA(msifile
, "REGISTER_PRODUCT=1 PUBLISH_PRODUCT=1");
2854 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2855 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2856 ok(pf_exists("msitest"), "File not installed\n");
2858 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2859 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
2861 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2862 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2864 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2865 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2867 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2868 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2869 ok(r
== ERROR_UNKNOWN_COMPONENT
, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r
);
2870 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2872 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2873 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2875 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
2876 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
2877 CHECK_REG_STR(prodkey
, "InstallDate", date
);
2878 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
2879 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2880 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
2881 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2882 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
2883 CHECK_REG_STR(prodkey
, "Comments", NULL
);
2884 CHECK_REG_STR(prodkey
, "Contact", NULL
);
2885 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
2886 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
2887 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
2888 CHECK_REG_STR(prodkey
, "Readme", NULL
);
2889 CHECK_REG_STR(prodkey
, "Size", NULL
);
2890 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
2891 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
2892 CHECK_REG_DWORD(prodkey
, "Language", 1033);
2893 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
2894 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
2895 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
2896 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
2899 CHECK_REG_DWORD(prodkey
, "EstimatedSize", 12);
2902 RegCloseKey(prodkey
);
2904 r
= MsiInstallProductA(msifile
, "FULL=1 REMOVE=ALL");
2905 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2906 ok(pf_exists("msitest\\maximus"), "File deleted\n");
2907 ok(pf_exists("msitest"), "File deleted\n");
2909 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2910 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2912 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2913 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2915 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2916 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2918 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2919 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2920 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2921 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2923 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2924 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
2926 /* complete install */
2927 r
= MsiInstallProductA(msifile
, "FULL=1");
2928 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2929 ok(pf_exists("msitest\\maximus"), "File not installed\n");
2930 ok(pf_exists("msitest"), "File not installed\n");
2932 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2933 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
2935 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2936 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
2938 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2939 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
2941 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2942 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2943 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2944 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
2946 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
2947 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
2949 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
2950 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
2951 CHECK_REG_STR(prodkey
, "InstallDate", date
);
2952 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
2953 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2954 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
2955 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2956 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
2957 CHECK_REG_STR(prodkey
, "Comments", NULL
);
2958 CHECK_REG_STR(prodkey
, "Contact", NULL
);
2959 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
2960 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
2961 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
2962 CHECK_REG_STR(prodkey
, "Readme", NULL
);
2963 CHECK_REG_STR(prodkey
, "Size", NULL
);
2964 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
2965 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
2966 CHECK_REG_DWORD(prodkey
, "Language", 1033);
2967 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
2968 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
2969 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
2970 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
2973 CHECK_REG_DWORD(prodkey
, "EstimatedSize", 12);
2976 RegCloseKey(prodkey
);
2978 /* no UnpublishFeatures */
2979 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
2980 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
2983 ok(!pf_exists("msitest\\maximus"), "File deleted\n");
2984 ok(!pf_exists("msitest"), "File deleted\n");
2987 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2988 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2990 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
2991 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2993 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
2994 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
2996 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
2997 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
2998 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
2999 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3001 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3002 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3004 /* complete install */
3005 r
= MsiInstallProductA(msifile
, "FULL=1");
3006 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3007 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3008 ok(pf_exists("msitest"), "File not installed\n");
3010 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3011 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
3013 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3014 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3016 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3017 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3019 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3020 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3021 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3022 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3024 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3025 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3027 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
3028 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
3029 CHECK_REG_STR(prodkey
, "InstallDate", date
);
3030 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
3031 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3032 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
3033 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3034 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
3035 CHECK_REG_STR(prodkey
, "Comments", NULL
);
3036 CHECK_REG_STR(prodkey
, "Contact", NULL
);
3037 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
3038 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
3039 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
3040 CHECK_REG_STR(prodkey
, "Readme", NULL
);
3041 CHECK_REG_STR(prodkey
, "Size", NULL
);
3042 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
3043 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
3044 CHECK_REG_DWORD(prodkey
, "Language", 1033);
3045 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
3046 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
3047 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
3048 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
3051 CHECK_REG_DWORD(prodkey
, "EstimatedSize", 12);
3054 RegCloseKey(prodkey
);
3056 /* UnpublishFeatures, only feature removed. Only works when entire product is removed */
3057 r
= MsiInstallProductA(msifile
, "UNPUBLISH_FEATURES=1 REMOVE=feature");
3058 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3059 ok(pf_exists("msitest\\maximus"), "File deleted\n");
3060 ok(pf_exists("msitest"), "File deleted\n");
3062 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3063 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
3065 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3066 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3068 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3069 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3071 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3072 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3073 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3074 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3076 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3077 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3079 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
3080 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
3081 CHECK_REG_STR(prodkey
, "InstallDate", date
);
3082 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
3083 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3084 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
3085 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3086 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
3087 CHECK_REG_STR(prodkey
, "Comments", NULL
);
3088 CHECK_REG_STR(prodkey
, "Contact", NULL
);
3089 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
3090 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
3091 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
3092 CHECK_REG_STR(prodkey
, "Readme", NULL
);
3093 CHECK_REG_STR(prodkey
, "Size", NULL
);
3094 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
3095 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
3096 CHECK_REG_DWORD(prodkey
, "Language", 1033);
3097 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
3098 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
3099 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
3100 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
3103 CHECK_REG_DWORD(prodkey
, "EstimatedSize", 12);
3106 RegCloseKey(prodkey
);
3108 /* complete install */
3109 r
= MsiInstallProductA(msifile
, "FULL=1");
3110 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3111 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3112 ok(pf_exists("msitest"), "File not installed\n");
3114 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3115 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
3117 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3118 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3120 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3121 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3123 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3124 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3125 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3126 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3128 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3129 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3131 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
3132 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
3133 CHECK_REG_STR(prodkey
, "InstallDate", date
);
3134 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
3135 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3136 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
3137 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3138 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
3139 CHECK_REG_STR(prodkey
, "Comments", NULL
);
3140 CHECK_REG_STR(prodkey
, "Contact", NULL
);
3141 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
3142 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
3143 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
3144 CHECK_REG_STR(prodkey
, "Readme", NULL
);
3145 CHECK_REG_STR(prodkey
, "Size", NULL
);
3146 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
3147 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
3148 CHECK_REG_DWORD(prodkey
, "Language", 1033);
3149 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
3150 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
3151 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
3152 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
3155 CHECK_REG_DWORD(prodkey
, "EstimatedSize", 12);
3158 RegCloseKey(prodkey
);
3160 /* UnpublishFeatures, both features removed */
3161 r
= MsiInstallProductA(msifile
, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo");
3162 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3165 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3166 ok(!pf_exists("msitest"), "File not deleted\n");
3169 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3170 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3172 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3173 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3175 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3176 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3178 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3179 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3180 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3181 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3183 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3184 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3186 /* complete install */
3187 r
= MsiInstallProductA(msifile
, "FULL=1");
3188 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3189 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3190 ok(pf_exists("msitest"), "File not installed\n");
3192 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3193 ok(state
== INSTALLSTATE_DEFAULT
, "Expected INSTALLSTATE_DEFAULT, got %d\n", state
);
3195 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3196 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3198 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3199 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3201 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3202 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3203 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3204 ok(state
== INSTALLSTATE_LOCAL
, "Expected INSTALLSTATE_LOCAL, got %d\n", state
);
3206 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3207 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
3209 CHECK_REG_STR(prodkey
, "DisplayName", "MSITEST");
3210 CHECK_REG_STR(prodkey
, "DisplayVersion", "1.1.1");
3211 CHECK_REG_STR(prodkey
, "InstallDate", date
);
3212 CHECK_REG_STR(prodkey
, "InstallSource", temp
);
3213 CHECK_REG_ISTR(prodkey
, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3214 CHECK_REG_STR(prodkey
, "Publisher", "Wine");
3215 CHECK_REG_STR(prodkey
, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3216 CHECK_REG_STR(prodkey
, "AuthorizedCDFPrefix", NULL
);
3217 CHECK_REG_STR(prodkey
, "Comments", NULL
);
3218 CHECK_REG_STR(prodkey
, "Contact", NULL
);
3219 CHECK_REG_STR(prodkey
, "HelpLink", NULL
);
3220 CHECK_REG_STR(prodkey
, "HelpTelephone", NULL
);
3221 CHECK_REG_STR(prodkey
, "InstallLocation", NULL
);
3222 CHECK_REG_STR(prodkey
, "Readme", NULL
);
3223 CHECK_REG_STR(prodkey
, "Size", NULL
);
3224 CHECK_REG_STR(prodkey
, "URLInfoAbout", NULL
);
3225 CHECK_REG_STR(prodkey
, "URLUpdateInfo", NULL
);
3226 CHECK_REG_DWORD(prodkey
, "Language", 1033);
3227 CHECK_REG_DWORD(prodkey
, "Version", 0x1010001);
3228 CHECK_REG_DWORD(prodkey
, "VersionMajor", 1);
3229 CHECK_REG_DWORD(prodkey
, "VersionMinor", 1);
3230 CHECK_REG_DWORD(prodkey
, "WindowsInstaller", 1);
3233 CHECK_REG_DWORD(prodkey
, "EstimatedSize", 12);
3236 RegCloseKey(prodkey
);
3238 /* complete uninstall */
3239 r
= MsiInstallProductA(msifile
, "FULL=1 REMOVE=ALL");
3240 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3243 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3244 ok(!pf_exists("msitest"), "File not deleted\n");
3247 state
= MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3248 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3250 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature");
3251 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3253 state
= MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo");
3254 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3256 r
= pMsiQueryComponentStateA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3257 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state
);
3258 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3259 ok(state
== INSTALLSTATE_UNKNOWN
, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state
);
3261 res
= RegOpenKeyA(uninstall
, prodcode
, &prodkey
);
3262 ok(res
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res
);
3264 /* make sure 'Program Files\msitest' is removed */
3265 delete_pfmsitest_files();
3267 RegCloseKey(uninstall
);
3268 DeleteFile(msifile
);
3269 DeleteFile("msitest\\maximus");
3270 RemoveDirectory("msitest");
3273 static void test_publishsourcelist(void)
3277 CHAR value
[MAX_PATH
];
3278 CHAR path
[MAX_PATH
];
3279 CHAR prodcode
[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
3281 if (!pMsiSourceListEnumSourcesA
|| !pMsiSourceListGetInfoA
)
3283 skip("MsiSourceListEnumSourcesA and/or MsiSourceListGetInfoA are not available\n");
3287 CreateDirectoryA("msitest", NULL
);
3288 create_file("msitest\\maximus", 500);
3290 create_database(msifile
, pp_tables
, sizeof(pp_tables
) / sizeof(msi_table
));
3292 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
3294 r
= MsiInstallProductA(msifile
, NULL
);
3295 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3296 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3297 ok(pf_exists("msitest"), "File not installed\n");
3299 /* nothing published */
3301 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3302 MSICODE_PRODUCT
, INSTALLPROPERTY_PACKAGENAME
, NULL
, &size
);
3303 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3304 ok(size
== 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size
);
3307 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3308 MSICODE_PRODUCT
| MSISOURCETYPE_URL
, 0, NULL
, &size
);
3309 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3310 ok(size
== 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size
);
3312 r
= MsiInstallProductA(msifile
, "REGISTER_PRODUCT=1");
3313 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3314 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3315 ok(pf_exists("msitest"), "File not installed\n");
3317 /* after RegisterProduct */
3319 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3320 MSICODE_PRODUCT
, INSTALLPROPERTY_PACKAGENAME
, NULL
, &size
);
3321 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3322 ok(size
== 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size
);
3325 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3326 MSICODE_PRODUCT
| MSISOURCETYPE_URL
, 0, NULL
, &size
);
3327 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3328 ok(size
== 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size
);
3330 r
= MsiInstallProductA(msifile
, "PROCESS_COMPONENTS=1");
3331 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3332 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3333 ok(pf_exists("msitest"), "File not installed\n");
3335 /* after ProcessComponents */
3337 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3338 MSICODE_PRODUCT
, INSTALLPROPERTY_PACKAGENAME
, NULL
, &size
);
3339 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3340 ok(size
== 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size
);
3343 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3344 MSICODE_PRODUCT
| MSISOURCETYPE_URL
, 0, NULL
, &size
);
3345 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3346 ok(size
== 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size
);
3348 r
= MsiInstallProductA(msifile
, "PUBLISH_FEATURES=1");
3349 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3350 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3351 ok(pf_exists("msitest"), "File not installed\n");
3353 /* after PublishFeatures */
3355 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3356 MSICODE_PRODUCT
, INSTALLPROPERTY_PACKAGENAME
, NULL
, &size
);
3357 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3358 ok(size
== 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size
);
3361 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3362 MSICODE_PRODUCT
| MSISOURCETYPE_URL
, 0, NULL
, &size
);
3363 ok(r
== ERROR_UNKNOWN_PRODUCT
, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r
);
3364 ok(size
== 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size
);
3366 r
= MsiInstallProductA(msifile
, "PUBLISH_PRODUCT=1");
3367 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3368 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3369 ok(pf_exists("msitest"), "File not installed\n");
3371 /* after PublishProduct */
3373 lstrcpyA(value
, "aaa");
3374 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3375 MSICODE_PRODUCT
, INSTALLPROPERTY_PACKAGENAME
, value
, &size
);
3376 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3377 ok(!lstrcmpA(value
, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value
);
3378 ok(size
== 11, "Expected 11, got %d\n", size
);
3381 lstrcpyA(value
, "aaa");
3382 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3383 MSICODE_PRODUCT
, INSTALLPROPERTY_MEDIAPACKAGEPATH
, value
, &size
);
3384 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3385 ok(!lstrcmpA(value
, ""), "Expected \"\", got \"%s\"\n", value
);
3386 ok(size
== 0, "Expected 0, got %d\n", size
);
3389 lstrcpyA(value
, "aaa");
3390 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3391 MSICODE_PRODUCT
, INSTALLPROPERTY_DISKPROMPT
, value
, &size
);
3392 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3393 ok(!lstrcmpA(value
, ""), "Expected \"\", got \"%s\"\n", value
);
3394 ok(size
== 0, "Expected 0, got %d\n", size
);
3396 lstrcpyA(path
, CURR_DIR
);
3397 lstrcatA(path
, "\\");
3400 lstrcpyA(value
, "aaa");
3401 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3402 MSICODE_PRODUCT
, INSTALLPROPERTY_LASTUSEDSOURCE
, value
, &size
);
3403 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3404 ok(!lstrcmpA(value
, path
), "Expected \"%s\", got \"%s\"\n", path
, value
);
3405 ok(size
== lstrlenA(path
), "Expected %d, got %d\n", lstrlenA(path
), size
);
3408 lstrcpyA(value
, "aaa");
3409 r
= pMsiSourceListGetInfoA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3410 MSICODE_PRODUCT
, INSTALLPROPERTY_LASTUSEDTYPE
, value
, &size
);
3411 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3412 ok(!lstrcmpA(value
, "n"), "Expected \"n\", got \"%s\"\n", value
);
3413 ok(size
== 1, "Expected 1, got %d\n", size
);
3416 lstrcpyA(value
, "aaa");
3417 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3418 MSICODE_PRODUCT
| MSISOURCETYPE_URL
, 0, value
, &size
);
3419 ok(r
== ERROR_NO_MORE_ITEMS
, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r
);
3420 ok(!lstrcmpA(value
, "aaa"), "Expected value to be unchanged, got %s\n", value
);
3421 ok(size
== MAX_PATH
, "Expected MAX_PATH, got %d\n", size
);
3424 lstrcpyA(value
, "aaa");
3425 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3426 MSICODE_PRODUCT
| MSISOURCETYPE_NETWORK
, 0, value
, &size
);
3427 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3428 ok(!lstrcmpA(value
, path
), "Expected \"%s\", got \"%s\"\n", path
, value
);
3429 ok(size
== lstrlenA(path
), "Expected %d, got %d\n", lstrlenA(path
), size
);
3432 lstrcpyA(value
, "aaa");
3433 r
= pMsiSourceListEnumSourcesA(prodcode
, NULL
, MSIINSTALLCONTEXT_USERUNMANAGED
,
3434 MSICODE_PRODUCT
| MSISOURCETYPE_NETWORK
, 1, value
, &size
);
3435 ok(r
== ERROR_NO_MORE_ITEMS
, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r
);
3436 ok(!lstrcmpA(value
, "aaa"), "Expected value to be unchanged, got %s\n", value
);
3437 ok(size
== MAX_PATH
, "Expected MAX_PATH, got %d\n", size
);
3439 /* complete uninstall */
3440 r
= MsiInstallProductA(msifile
, "FULL=1 REMOVE=ALL");
3441 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3444 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3445 ok(!pf_exists("msitest"), "File not deleted\n");
3448 /* make sure 'Program Files\msitest' is removed */
3449 delete_pfmsitest_files();
3451 DeleteFile(msifile
);
3452 DeleteFile("msitest\\maximus");
3453 RemoveDirectory("msitest");
3456 static UINT
run_query(MSIHANDLE hdb
, MSIHANDLE hrec
, const char *query
)
3458 MSIHANDLE hview
= 0;
3461 r
= MsiDatabaseOpenView(hdb
, query
, &hview
);
3462 if(r
!= ERROR_SUCCESS
)
3465 r
= MsiViewExecute(hview
, hrec
);
3466 if(r
== ERROR_SUCCESS
)
3467 r
= MsiViewClose(hview
);
3468 MsiCloseHandle(hview
);
3472 static void set_transform_summary_info(void)
3475 MSIHANDLE suminfo
= 0;
3477 /* build summary info */
3478 r
= MsiGetSummaryInformation(0, mstfile
, 3, &suminfo
);
3481 ok(r
== ERROR_SUCCESS
, "Failed to open summaryinfo\n");
3484 r
= MsiSummaryInfoSetProperty(suminfo
, PID_TITLE
, VT_LPSTR
, 0, NULL
, "MSITEST");
3487 ok(r
== ERROR_SUCCESS
, "Failed to set summary info\n");
3490 r
= MsiSummaryInfoSetProperty(suminfo
, PID_REVNUMBER
, VT_LPSTR
, 0, NULL
,
3491 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3492 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;"
3493 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}");
3496 ok(r
== ERROR_SUCCESS
, "Failed to set summary info\n");
3499 r
= MsiSummaryInfoSetProperty(suminfo
, PID_PAGECOUNT
, VT_I4
, 100, NULL
, NULL
);
3502 ok(r
== ERROR_SUCCESS
, "Failed to set summary info\n");
3505 r
= MsiSummaryInfoPersist(suminfo
);
3508 ok(r
== ERROR_SUCCESS
, "Failed to make summary info persist\n");
3511 r
= MsiCloseHandle(suminfo
);
3512 ok(r
== ERROR_SUCCESS
, "Failed to close suminfo\n");
3515 static void generate_transform(void)
3517 MSIHANDLE hdb1
, hdb2
;
3521 /* start with two identical databases */
3522 CopyFile(msifile
, msifile2
, FALSE
);
3524 r
= MsiOpenDatabase(msifile2
, MSIDBOPEN_TRANSACT
, &hdb1
);
3525 ok(r
== ERROR_SUCCESS
, "Failed to create database\n");
3527 r
= MsiDatabaseCommit(hdb1
);
3528 ok(r
== ERROR_SUCCESS
, "Failed to commit database\n");
3530 r
= MsiOpenDatabase(msifile
, MSIDBOPEN_READONLY
, &hdb2
);
3531 ok(r
== ERROR_SUCCESS
, "Failed to create database\n");
3533 query
= "INSERT INTO `Property` ( `Property`, `Value` ) VALUES ( 'prop', 'val' )";
3534 r
= run_query(hdb1
, 0, query
);
3535 ok(r
== ERROR_SUCCESS
, "failed to add property\n");
3537 /* database needs to be committed */
3538 MsiDatabaseCommit(hdb1
);
3540 r
= MsiDatabaseGenerateTransform(hdb1
, hdb2
, mstfile
, 0, 0);
3541 ok(r
== ERROR_SUCCESS
, "return code %d, should be ERROR_SUCCESS\n", r
);
3543 #if 0 /* not implemented in wine yet */
3544 r
= MsiCreateTransformSummaryInfo(hdb2
, hdb2
, mstfile
, 0, 0);
3545 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", r
);
3548 MsiCloseHandle(hdb1
);
3549 MsiCloseHandle(hdb2
);
3552 /* data for generating a transform */
3554 /* tables transform names - encoded as they would be in an msi database file */
3555 static const WCHAR name1
[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */
3556 static const WCHAR name2
[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */
3557 static const WCHAR name3
[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */
3559 /* data in each table */
3560 static const char data1
[] = /* _StringData */
3561 "propval"; /* all the strings squashed together */
3563 static const WCHAR data2
[] = { /* _StringPool */
3565 0, 0, /* string 0 '' */
3566 4, 1, /* string 1 'prop' */
3567 3, 1, /* string 2 'val' */
3570 static const WCHAR data3
[] = { /* Property */
3571 0x0201, 0x0001, 0x0002,
3574 static const struct {
3578 } table_transform_data
[] =
3580 { name1
, data1
, sizeof data1
- 1 },
3581 { name2
, data2
, sizeof data2
},
3582 { name3
, data3
, sizeof data3
},
3585 #define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0])
3587 static void generate_transform_manual(void)
3589 IStorage
*stg
= NULL
;
3594 const DWORD mode
= STGM_CREATE
|STGM_READWRITE
|STGM_DIRECT
|STGM_SHARE_EXCLUSIVE
;
3596 const CLSID CLSID_MsiTransform
= { 0xc1082,0,0,{0xc0,0,0,0,0,0,0,0x46}};
3598 MultiByteToWideChar(CP_ACP
, 0, mstfile
, -1, name
, 0x20);
3600 r
= StgCreateDocfile(name
, mode
, 0, &stg
);
3601 ok(r
== S_OK
, "failed to create storage\n");
3605 r
= IStorage_SetClass(stg
, &CLSID_MsiTransform
);
3606 ok(r
== S_OK
, "failed to set storage type\n");
3608 for (i
=0; i
<NUM_TRANSFORM_TABLES
; i
++)
3610 r
= IStorage_CreateStream(stg
, table_transform_data
[i
].name
,
3611 STGM_WRITE
| STGM_SHARE_EXCLUSIVE
, 0, 0, &stm
);
3614 ok(0, "failed to create stream %08x\n", r
);
3618 r
= IStream_Write(stm
, table_transform_data
[i
].data
,
3619 table_transform_data
[i
].size
, &count
);
3620 if (FAILED(r
) || count
!= table_transform_data
[i
].size
)
3621 ok(0, "failed to write stream\n");
3622 IStream_Release(stm
);
3625 IStorage_Release(stg
);
3627 set_transform_summary_info();
3630 static void test_transformprop(void)
3634 CreateDirectoryA("msitest", NULL
);
3635 create_file("msitest\\augustus", 500);
3637 create_database(msifile
, tp_tables
, sizeof(tp_tables
) / sizeof(msi_table
));
3639 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3641 r
= MsiInstallProductA(msifile
, NULL
);
3642 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3643 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3644 ok(!delete_pf("msitest", FALSE
), "File installed\n");
3647 generate_transform();
3649 generate_transform_manual();
3651 r
= MsiInstallProductA(msifile
, "TRANSFORMS=winetest.mst");
3652 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3653 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3654 ok(delete_pf("msitest", FALSE
), "File not installed\n");
3656 /* Delete the files in the temp (current) folder */
3657 DeleteFile(msifile
);
3658 DeleteFile(msifile2
);
3659 DeleteFile(mstfile
);
3660 DeleteFile("msitest\\augustus");
3661 RemoveDirectory("msitest");
3664 static void test_currentworkingdir(void)
3667 CHAR path
[MAX_PATH
];
3670 CreateDirectoryA("msitest", NULL
);
3671 create_file("msitest\\augustus", 500);
3673 create_database(msifile
, cwd_tables
, sizeof(cwd_tables
) / sizeof(msi_table
));
3675 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3677 CreateDirectoryA("diffdir", NULL
);
3678 SetCurrentDirectoryA("diffdir");
3680 sprintf(path
, "..\\%s", msifile
);
3681 r
= MsiInstallProductA(path
, NULL
);
3684 ok(r
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r
);
3685 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3686 ok(!delete_pf("msitest", FALSE
), "File installed\n");
3689 sprintf(path
, "%s\\%s", CURR_DIR
, msifile
);
3690 r
= MsiInstallProductA(path
, NULL
);
3691 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3692 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3693 ok(delete_pf("msitest", FALSE
), "File not installed\n");
3695 lstrcpyA(path
, CURR_DIR
);
3696 if (path
[lstrlenA(path
) - 1] != '\\')
3697 lstrcatA(path
, "\\");
3698 lstrcatA(path
, "msitest.msi");
3700 ptr2
= strrchr(path
, '\\');
3702 ptr
= strrchr(path
, '\\');
3706 SetCurrentDirectoryA(path
);
3708 r
= MsiInstallProductA(ptr
, NULL
);
3709 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3710 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
3711 ok(delete_pf("msitest", FALSE
), "File not installed\n");
3713 SetCurrentDirectoryA(CURR_DIR
);
3715 DeleteFile(msifile
);
3716 DeleteFile("msitest\\augustus");
3717 RemoveDirectory("msitest");
3718 RemoveDirectory("diffdir");
3721 static void set_admin_summary_info(const CHAR
*name
)
3723 MSIHANDLE db
, summary
;
3726 r
= MsiOpenDatabaseA(name
, MSIDBOPEN_DIRECT
, &db
);
3727 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3729 r
= MsiGetSummaryInformationA(db
, NULL
, 1, &summary
);
3730 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3732 r
= MsiSummaryInfoSetPropertyA(summary
, PID_WORDCOUNT
, VT_I4
, 5, NULL
, NULL
);
3733 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3735 /* write the summary changes back to the stream */
3736 r
= MsiSummaryInfoPersist(summary
);
3737 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3739 MsiCloseHandle(summary
);
3741 r
= MsiDatabaseCommit(db
);
3742 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3747 static void test_admin(void)
3751 CreateDirectoryA("msitest", NULL
);
3752 create_file("msitest\\augustus", 500);
3754 create_database(msifile
, adm_tables
, sizeof(adm_tables
) / sizeof(msi_table
));
3755 set_admin_summary_info(msifile
);
3757 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3759 r
= MsiInstallProductA(msifile
, NULL
);
3760 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3761 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3762 ok(!delete_pf("msitest", FALSE
), "File installed\n");
3763 ok(!DeleteFile("c:\\msitest\\augustus"), "File installed\n");
3764 ok(!RemoveDirectory("c:\\msitest"), "File installed\n");
3766 r
= MsiInstallProductA(msifile
, "ACTION=ADMIN");
3767 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3768 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3769 ok(!delete_pf("msitest", FALSE
), "File installed\n");
3772 ok(DeleteFile("c:\\msitest\\augustus"), "File not installed\n");
3773 ok(RemoveDirectory("c:\\msitest"), "File not installed\n");
3776 DeleteFile(msifile
);
3777 DeleteFile("msitest\\augustus");
3778 RemoveDirectory("msitest");
3781 static void set_admin_property_stream(LPCSTR file
)
3785 WCHAR fileW
[MAX_PATH
];
3788 const DWORD mode
= STGM_DIRECT
| STGM_READWRITE
| STGM_SHARE_EXCLUSIVE
;
3790 /* AdminProperties */
3791 static const WCHAR stmname
[] = {0x41ca,0x4330,0x3e71,0x44b5,0x4233,0x45f5,0x422c,0x4836,0};
3792 static const WCHAR data
[] = {'M','Y','P','R','O','P','=','2','7','1','8',0};
3794 MultiByteToWideChar(CP_ACP
, 0, file
, -1, fileW
, MAX_PATH
);
3796 hr
= StgOpenStorage(fileW
, NULL
, mode
, NULL
, 0, &stg
);
3797 ok(hr
== S_OK
, "Expected S_OK, got %d\n", hr
);
3801 hr
= IStorage_CreateStream(stg
, stmname
, STGM_WRITE
| STGM_SHARE_EXCLUSIVE
, 0, 0, &stm
);
3802 ok(hr
== S_OK
, "Expected S_OK, got %d\n", hr
);
3804 hr
= IStream_Write(stm
, data
, sizeof(data
), &count
);
3805 ok(hr
== S_OK
, "Expected S_OK, got %d\n", hr
);
3807 IStream_Release(stm
);
3808 IStorage_Release(stg
);
3811 static void test_adminprops(void)
3815 CreateDirectoryA("msitest", NULL
);
3816 create_file("msitest\\augustus", 500);
3818 create_database(msifile
, amp_tables
, sizeof(amp_tables
) / sizeof(msi_table
));
3819 set_admin_summary_info(msifile
);
3820 set_admin_property_stream(msifile
);
3822 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
3824 r
= MsiInstallProductA(msifile
, NULL
);
3825 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3826 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
3827 ok(delete_pf("msitest", FALSE
), "File installed\n");
3829 DeleteFile(msifile
);
3830 DeleteFile("msitest\\augustus");
3831 RemoveDirectory("msitest");
3834 static void create_pf_data(LPCSTR file
, LPCSTR data
, BOOL is_file
)
3836 CHAR path
[MAX_PATH
];
3838 lstrcpyA(path
, PROG_FILES_DIR
);
3839 lstrcatA(path
, "\\");
3840 lstrcatA(path
, file
);
3843 create_file_data(path
, data
, 500);
3845 CreateDirectoryA(path
, NULL
);
3848 #define create_pf(file, is_file) create_pf_data(file, file, is_file)
3850 static void test_removefiles(void)
3854 CreateDirectoryA("msitest", NULL
);
3855 create_file("msitest\\hydrogen", 500);
3856 create_file("msitest\\helium", 500);
3857 create_file("msitest\\lithium", 500);
3859 create_database(msifile
, rem_tables
, sizeof(rem_tables
) / sizeof(msi_table
));
3861 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
3863 r
= MsiInstallProductA(msifile
, NULL
);
3864 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3865 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3866 ok(!pf_exists("msitest\\helium"), "File installed\n");
3867 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3868 ok(pf_exists("msitest"), "File not installed\n");
3870 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
3871 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3872 ok(!pf_exists("msitest\\helium"), "File not deleted\n");
3873 ok(delete_pf("msitest\\lithium", TRUE
), "File deleted\n");
3876 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
3877 ok(delete_pf("msitest", FALSE
), "File deleted\n");
3880 create_pf("msitest", FALSE
);
3881 create_pf("msitest\\hydrogen", TRUE
);
3882 create_pf("msitest\\helium", TRUE
);
3883 create_pf("msitest\\lithium", TRUE
);
3885 r
= MsiInstallProductA(msifile
, NULL
);
3886 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3887 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3888 ok(pf_exists("msitest\\helium"), "File not installed\n");
3889 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3890 ok(pf_exists("msitest"), "File not installed\n");
3892 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
3893 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3894 ok(delete_pf("msitest\\helium", TRUE
), "File deleted\n");
3895 ok(delete_pf("msitest\\lithium", TRUE
), "File deleted\n");
3898 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
3899 ok(delete_pf("msitest", FALSE
), "File deleted\n");
3902 create_pf("msitest", FALSE
);
3903 create_pf("msitest\\furlong", TRUE
);
3904 create_pf("msitest\\firkin", TRUE
);
3905 create_pf("msitest\\fortnight", TRUE
);
3906 create_pf("msitest\\becquerel", TRUE
);
3907 create_pf("msitest\\dioptre", TRUE
);
3908 create_pf("msitest\\attoparsec", TRUE
);
3909 create_pf("msitest\\storeys", TRUE
);
3910 create_pf("msitest\\block", TRUE
);
3911 create_pf("msitest\\siriometer", TRUE
);
3913 r
= MsiInstallProductA(msifile
, NULL
);
3914 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3915 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
3916 ok(!pf_exists("msitest\\helium"), "File installed\n");
3917 ok(pf_exists("msitest\\lithium"), "File not installed\n");
3918 ok(pf_exists("msitest\\becquerel"), "File not installed\n");
3919 ok(pf_exists("msitest\\dioptre"), "File not installed\n");
3920 ok(pf_exists("msitest\\attoparsec"), "File not installed\n");
3921 ok(pf_exists("msitest"), "File not installed\n");
3924 ok(!pf_exists("msitest\\firkin"), "File not deleted\n");
3925 ok(!pf_exists("msitest\\fortnight"), "File not deleted\n");
3926 ok(!pf_exists("msitest\\furlong"), "File not deleted\n");
3927 ok(!pf_exists("msitest\\storeys"), "File not deleted\n");
3928 ok(!pf_exists("msitest\\block"), "File not deleted\n");
3929 ok(!pf_exists("msitest\\siriometer"), "File not deleted\n");
3932 create_pf("msitest\\furlong", TRUE
);
3933 create_pf("msitest\\firkin", TRUE
);
3934 create_pf("msitest\\fortnight", TRUE
);
3935 create_pf("msitest\\storeys", TRUE
);
3936 create_pf("msitest\\block", TRUE
);
3937 create_pf("msitest\\siriometer", TRUE
);
3939 r
= MsiInstallProductA(msifile
, "REMOVE=ALL");
3940 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
3941 ok(!delete_pf("msitest\\helium", TRUE
), "File not deleted\n");
3942 ok(delete_pf("msitest\\lithium", TRUE
), "File deleted\n");
3943 ok(delete_pf("msitest\\furlong", TRUE
), "File deleted\n");
3944 ok(delete_pf("msitest\\firkin", TRUE
), "File deleted\n");
3945 ok(delete_pf("msitest\\fortnight", TRUE
), "File deleted\n");
3946 ok(delete_pf("msitest\\attoparsec", TRUE
), "File deleted\n");
3947 ok(delete_pf("msitest\\siriometer", TRUE
), "File deleted\n");
3950 ok(!delete_pf("msitest\\hydrogen", TRUE
), "File not deleted\n");
3951 ok(!delete_pf("msitest\\becquerel", TRUE
), "File not deleted\n");
3952 ok(!delete_pf("msitest\\dioptre", TRUE
), "File not deleted\n");
3953 ok(!delete_pf("msitest\\storeys", TRUE
), "File not deleted\n");
3954 ok(!delete_pf("msitest\\block", TRUE
), "File not deleted\n");
3956 ok(delete_pf("msitest", FALSE
), "File deleted\n");
3958 DeleteFile(msifile
);
3959 DeleteFile("msitest\\hydrogen");
3960 DeleteFile("msitest\\helium");
3961 DeleteFile("msitest\\lithium");
3962 RemoveDirectory("msitest");
3965 static void test_movefiles(void)
3968 char props
[MAX_PATH
];
3970 CreateDirectoryA("msitest", NULL
);
3971 create_file("msitest\\augustus", 100);
3972 create_file("cameroon", 100);
3973 create_file("djibouti", 100);
3974 create_file("egypt", 100);
3975 create_file("finland", 100);
3976 create_file("gambai", 100);
3977 create_file("honduras", 100);
3978 create_file("msitest\\india", 100);
3979 create_file("japan", 100);
3980 create_file("kenya", 100);
3981 CreateDirectoryA("latvia", NULL
);
3982 create_file("nauru", 100);
3983 create_file("apple", 100);
3984 create_file("application", 100);
3985 create_file("ape", 100);
3986 create_file("foo", 100);
3987 create_file("fao", 100);
3988 create_file("fbod", 100);
3989 create_file("budding", 100);
3990 create_file("buddy", 100);
3991 create_file("bud", 100);
3992 create_file("bar", 100);
3993 create_file("bur", 100);
3994 create_file("bird", 100);
3996 create_database(msifile
, mov_tables
, sizeof(mov_tables
) / sizeof(msi_table
));
3998 MsiSetInternalUI(INSTALLUILEVEL_FULL
, NULL
);
4000 /* if the source or dest property is not a full path,
4001 * windows tries to access it as a network resource
4004 sprintf(props
, "SOURCEFULL=\"%s\\\" DESTFULL=\"%s\\msitest\" "
4005 "FILEPATHBAD=\"%s\\japan\" FILEPATHGOOD=\"%s\\kenya\"",
4006 CURR_DIR
, PROG_FILES_DIR
, CURR_DIR
, CURR_DIR
);
4008 r
= MsiInstallProductA(msifile
, props
);
4009 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4010 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
4011 ok(!delete_pf("msitest\\dest", TRUE
), "File copied\n");
4012 ok(delete_pf("msitest\\canada", TRUE
), "File not copied\n");
4013 ok(delete_pf("msitest\\dominica", TRUE
), "File not moved\n");
4014 ok(!delete_pf("msitest\\elsalvador", TRUE
), "File moved\n");
4015 ok(!delete_pf("msitest\\france", TRUE
), "File moved\n");
4016 ok(!delete_pf("msitest\\georgia", TRUE
), "File moved\n");
4017 ok(delete_pf("msitest\\hungary", TRUE
), "File not moved\n");
4018 ok(!delete_pf("msitest\\indonesia", TRUE
), "File moved\n");
4019 ok(!delete_pf("msitest\\jordan", TRUE
), "File moved\n");
4020 ok(delete_pf("msitest\\kiribati", TRUE
), "File not moved\n");
4021 ok(!delete_pf("msitest\\lebanon", TRUE
), "File moved\n");
4022 ok(!delete_pf("msitest\\lebanon", FALSE
), "Directory moved\n");
4023 /* either apple or application will be moved depending on directory order */
4024 if (!delete_pf("msitest\\apple", TRUE
))
4025 ok(delete_pf("msitest\\application", TRUE
), "File not moved\n");
4027 ok(!delete_pf("msitest\\application", TRUE
), "File should not exist\n");
4028 ok(delete_pf("msitest\\wildcard", TRUE
), "File not moved\n");
4029 ok(!delete_pf("msitest\\ape", TRUE
), "File moved\n");
4030 /* either fao or foo will be moved depending on directory order */
4031 if (delete_pf("msitest\\foo", TRUE
))
4032 ok(!delete_pf("msitest\\fao", TRUE
), "File should not exist\n");
4034 ok(delete_pf("msitest\\fao", TRUE
), "File not moved\n");
4035 ok(delete_pf("msitest\\single", TRUE
), "File not moved\n");
4036 ok(!delete_pf("msitest\\fbod", TRUE
), "File moved\n");
4037 ok(delete_pf("msitest\\budding", TRUE
), "File not moved\n");
4038 ok(delete_pf("msitest\\buddy", TRUE
), "File not moved\n");
4039 ok(!delete_pf("msitest\\bud", TRUE
), "File moved\n");
4040 ok(delete_pf("msitest\\bar", TRUE
), "File not moved\n");
4041 ok(delete_pf("msitest\\bur", TRUE
), "File not moved\n");
4042 ok(!delete_pf("msitest\\bird", TRUE
), "File moved\n");
4043 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4044 ok(DeleteFileA("cameroon"), "File moved\n");
4045 ok(!DeleteFileA("djibouti"), "File not moved\n");
4046 ok(DeleteFileA("egypt"), "File moved\n");
4047 ok(DeleteFileA("finland"), "File moved\n");
4048 ok(DeleteFileA("gambai"), "File moved\n");
4049 ok(!DeleteFileA("honduras"), "File not moved\n");
4050 ok(DeleteFileA("msitest\\india"), "File moved\n");
4051 ok(DeleteFileA("japan"), "File moved\n");
4052 ok(!DeleteFileA("kenya"), "File not moved\n");
4053 ok(RemoveDirectoryA("latvia"), "Directory moved\n");
4054 ok(!DeleteFileA("nauru"), "File not moved\n");
4055 ok(!DeleteFileA("apple"), "File not moved\n");
4056 ok(!DeleteFileA("application"), "File not moved\n");
4057 ok(DeleteFileA("ape"), "File moved\n");
4058 ok(!DeleteFileA("foo"), "File not moved\n");
4059 ok(!DeleteFileA("fao"), "File not moved\n");
4060 ok(DeleteFileA("fbod"), "File moved\n");
4061 ok(!DeleteFileA("budding"), "File not moved\n");
4062 ok(!DeleteFileA("buddy"), "File not moved\n");
4063 ok(DeleteFileA("bud"), "File moved\n");
4064 ok(!DeleteFileA("bar"), "File not moved\n");
4065 ok(!DeleteFileA("bur"), "File not moved\n");
4066 ok(DeleteFileA("bird"), "File moved\n");
4068 DeleteFile("msitest\\augustus");
4069 RemoveDirectory("msitest");
4070 DeleteFile(msifile
);
4073 static void test_missingcab(void)
4077 CreateDirectoryA("msitest", NULL
);
4078 create_file("msitest\\augustus", 500);
4079 create_file("maximus", 500);
4081 create_database(msifile
, mc_tables
, sizeof(mc_tables
) / sizeof(msi_table
));
4083 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4085 create_cab_file("test1.cab", MEDIA_SIZE
, "maximus\0");
4087 create_pf("msitest", FALSE
);
4088 create_pf_data("msitest\\caesar", "abcdefgh", TRUE
);
4090 r
= MsiInstallProductA(msifile
, NULL
);
4091 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4092 ok(delete_pf("msitest\\augustus", TRUE
), "File not installed\n");
4093 ok(delete_pf("msitest\\caesar", TRUE
), "File not installed\n");
4094 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
4095 ok(!delete_pf("msitest\\gaius", TRUE
), "File installed\n");
4096 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4098 create_pf("msitest", FALSE
);
4099 create_pf_data("msitest\\caesar", "abcdefgh", TRUE
);
4100 create_pf("msitest\\gaius", TRUE
);
4102 r
= MsiInstallProductA(msifile
, "GAIUS=1");
4103 ok(r
== ERROR_INSTALL_FAILURE
, "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
4106 ok(!delete_pf("msitest\\maximus", TRUE
), "File installed\n");
4107 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4109 ok(delete_pf("msitest\\caesar", TRUE
), "File removed\n");
4110 ok(delete_pf("msitest\\gaius", TRUE
), "File removed\n");
4111 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4113 DeleteFile("msitest\\augustus");
4114 RemoveDirectory("msitest");
4115 DeleteFile("maximus");
4116 DeleteFile("test1.cab");
4117 DeleteFile(msifile
);
4120 static void test_duplicatefiles(void)
4124 CreateDirectoryA("msitest", NULL
);
4125 create_file("msitest\\maximus", 500);
4126 create_database(msifile
, df_tables
, sizeof(df_tables
) / sizeof(msi_table
));
4128 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4130 /* fails if the destination folder is not a valid property */
4132 r
= MsiInstallProductA(msifile
, NULL
);
4133 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4134 ok(delete_pf("msitest\\maximus", TRUE
), "File not installed\n");
4135 ok(delete_pf("msitest\\augustus", TRUE
), "File not duplicated\n");
4136 ok(delete_pf("msitest\\this\\doesnot\\exist\\maximus", TRUE
), "File not duplicated\n");
4137 ok(delete_pf("msitest\\this\\doesnot\\exist", FALSE
), "File not duplicated\n");
4138 ok(delete_pf("msitest\\this\\doesnot", FALSE
), "File not duplicated\n");
4139 ok(delete_pf("msitest\\this", FALSE
), "File not duplicated\n");
4140 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4142 DeleteFile("msitest\\maximus");
4143 RemoveDirectory("msitest");
4144 DeleteFile(msifile
);
4147 static void test_writeregistryvalues(void)
4153 CHAR path
[MAX_PATH
];
4155 CreateDirectoryA("msitest", NULL
);
4156 create_file("msitest\\augustus", 500);
4158 create_database(msifile
, wrv_tables
, sizeof(wrv_tables
) / sizeof(msi_table
));
4160 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4162 r
= MsiInstallProductA(msifile
, NULL
);
4163 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4164 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4165 ok(delete_pf("msitest", FALSE
), "File installed\n");
4167 res
= RegOpenKey(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Wine\\msitest", &hkey
);
4168 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
4171 type
= REG_MULTI_SZ
;
4172 memset(path
, 'a', MAX_PATH
);
4173 res
= RegQueryValueExA(hkey
, "Value", NULL
, &type
, (LPBYTE
)path
, &size
);
4174 ok(res
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", res
);
4175 ok(!memcmp(path
, "one\0two\0three\0\0", size
), "Wrong multi-sz data\n");
4176 ok(size
== 15, "Expected 15, got %d\n", size
);
4177 ok(type
== REG_MULTI_SZ
, "Expected REG_MULTI_SZ, got %d\n", type
);
4179 DeleteFile(msifile
);
4180 DeleteFile("msitest\\augustus");
4181 RemoveDirectory("msitest");
4183 RegDeleteKeyA(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Wine\\msitest");
4184 RegDeleteKeyA(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Wine");
4187 static void test_sourcefolder(void)
4191 CreateDirectoryA("msitest", NULL
);
4192 create_file("augustus", 500);
4194 create_database(msifile
, sf_tables
, sizeof(sf_tables
) / sizeof(msi_table
));
4196 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4198 r
= MsiInstallProductA(msifile
, NULL
);
4199 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4202 ok(r
== ERROR_INSTALL_FAILURE
,
4203 "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
4204 ok(!delete_pf("msitest", FALSE
), "File installed\n");
4207 RemoveDirectoryA("msitest");
4209 r
= MsiInstallProductA(msifile
, NULL
);
4212 ok(r
== ERROR_INSTALL_FAILURE
,
4213 "Expected ERROR_INSTALL_FAILURE, got %u\n", r
);
4214 ok(!delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4215 ok(!delete_pf("msitest", FALSE
), "File installed\n");
4218 DeleteFile(msifile
);
4219 DeleteFile("augustus");
4222 static void test_customaction51(void)
4226 CreateDirectoryA("msitest", NULL
);
4227 create_file("msitest\\augustus", 500);
4229 create_database(msifile
, ca51_tables
, sizeof(ca51_tables
) / sizeof(msi_table
));
4231 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4233 r
= MsiInstallProductA(msifile
, NULL
);
4234 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4235 ok(delete_pf("msitest\\augustus", TRUE
), "File installed\n");
4236 ok(delete_pf("msitest", FALSE
), "File installed\n");
4238 DeleteFile(msifile
);
4239 DeleteFile("msitest\\augustus");
4240 RemoveDirectory("msitest");
4243 static void test_installstate(void)
4247 CreateDirectoryA("msitest", NULL
);
4248 create_file("msitest\\alpha", 500);
4249 create_file("msitest\\beta", 500);
4250 create_file("msitest\\gamma", 500);
4251 create_file("msitest\\theta", 500);
4252 create_file("msitest\\delta", 500);
4253 create_file("msitest\\epsilon", 500);
4254 create_file("msitest\\zeta", 500);
4255 create_file("msitest\\iota", 500);
4256 create_file("msitest\\eta", 500);
4257 create_file("msitest\\kappa", 500);
4258 create_file("msitest\\lambda", 500);
4259 create_file("msitest\\mu", 500);
4261 create_database(msifile
, is_tables
, sizeof(is_tables
) / sizeof(msi_table
));
4263 MsiSetInternalUI(INSTALLUILEVEL_NONE
, NULL
);
4265 r
= MsiInstallProductA(msifile
, NULL
);
4266 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4267 ok(delete_pf("msitest\\alpha", TRUE
), "File not installed\n");
4268 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4269 ok(delete_pf("msitest\\gamma", TRUE
), "File not installed\n");
4270 ok(delete_pf("msitest\\theta", TRUE
), "File not installed\n");
4271 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4272 ok(!delete_pf("msitest\\epsilon", TRUE
), "File installed\n");
4273 ok(!delete_pf("msitest\\zeta", TRUE
), "File installed\n");
4274 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4275 ok(!delete_pf("msitest\\eta", TRUE
), "File installed\n");
4276 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4277 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4278 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4279 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4281 r
= MsiInstallProductA(msifile
, "ADDLOCAL=\"one,two,three,four\"");
4282 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4283 ok(delete_pf("msitest\\alpha", TRUE
), "File not installed\n");
4284 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4285 ok(delete_pf("msitest\\gamma", TRUE
), "File not installed\n");
4286 ok(delete_pf("msitest\\theta", TRUE
), "File not installed\n");
4287 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4288 ok(delete_pf("msitest\\epsilon", TRUE
), "File not installed\n");
4289 ok(delete_pf("msitest\\zeta", TRUE
), "File not installed\n");
4290 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4291 ok(delete_pf("msitest\\eta", TRUE
), "File not installed\n");
4292 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4293 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4294 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4295 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4297 r
= MsiInstallProductA(msifile
, "ADDSOURCE=\"one,two,three,four\"");
4298 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4299 ok(delete_pf("msitest\\alpha", TRUE
), "File not installed\n");
4300 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4301 ok(!delete_pf("msitest\\gamma", TRUE
), "File installed\n");
4302 ok(delete_pf("msitest\\theta", TRUE
), "File not installed\n");
4303 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4304 ok(!delete_pf("msitest\\epsilon", TRUE
), "File installed\n");
4305 ok(delete_pf("msitest\\zeta", TRUE
), "File not installed\n");
4306 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4307 ok(!delete_pf("msitest\\eta", TRUE
), "File installed\n");
4308 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4309 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4310 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4311 ok(delete_pf("msitest", FALSE
), "File not installed\n");
4313 r
= MsiInstallProductA(msifile
, "REMOVE=\"one,two,three,four\"");
4314 ok(r
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %u\n", r
);
4315 ok(!delete_pf("msitest\\alpha", TRUE
), "File installed\n");
4316 ok(!delete_pf("msitest\\beta", TRUE
), "File installed\n");
4317 ok(!delete_pf("msitest\\gamma", TRUE
), "File installed\n");
4318 ok(!delete_pf("msitest\\theta", TRUE
), "File installed\n");
4319 ok(!delete_pf("msitest\\delta", TRUE
), "File installed\n");
4320 ok(!delete_pf("msitest\\epsilon", TRUE
), "File installed\n");
4321 ok(!delete_pf("msitest\\zeta", TRUE
), "File installed\n");
4322 ok(!delete_pf("msitest\\iota", TRUE
), "File installed\n");
4323 ok(!delete_pf("msitest\\eta", TRUE
), "File installed\n");
4324 ok(!delete_pf("msitest\\kappa", TRUE
), "File installed\n");
4325 ok(!delete_pf("msitest\\lambda", TRUE
), "File installed\n");
4326 ok(!delete_pf("msitest\\mu", TRUE
), "File installed\n");
4327 ok(!delete_pf("msitest", FALSE
), "File installed\n");
4329 DeleteFile(msifile
);
4330 DeleteFile("msitest\\alpha");
4331 DeleteFile("msitest\\beta");
4332 DeleteFile("msitest\\gamma");
4333 DeleteFile("msitest\\theta");
4334 DeleteFile("msitest\\delta");
4335 DeleteFile("msitest\\epsilon");
4336 DeleteFile("msitest\\zeta");
4337 DeleteFile("msitest\\iota");
4338 DeleteFile("msitest\\eta");
4339 DeleteFile("msitest\\kappa");
4340 DeleteFile("msitest\\lambda");
4341 DeleteFile("msitest\\mu");
4342 RemoveDirectory("msitest");
4348 char temp_path
[MAX_PATH
], prev_path
[MAX_PATH
];
4350 init_functionpointers();
4352 GetCurrentDirectoryA(MAX_PATH
, prev_path
);
4353 GetTempPath(MAX_PATH
, temp_path
);
4354 SetCurrentDirectoryA(temp_path
);
4356 lstrcpyA(CURR_DIR
, temp_path
);
4357 len
= lstrlenA(CURR_DIR
);
4359 if(len
&& (CURR_DIR
[len
- 1] == '\\'))
4360 CURR_DIR
[len
- 1] = 0;
4362 get_program_files_dir(PROG_FILES_DIR
, COMMON_FILES_DIR
);
4364 test_MsiInstallProduct();
4365 test_MsiSetComponentState();
4366 test_packagecoltypes();
4367 test_continuouscabs();
4370 test_samesequence();
4371 test_uiLevelFlags();
4372 test_readonlyfile();
4373 test_setdirproperty();
4374 test_cabisextracted();
4375 test_concurrentinstall();
4376 test_setpropertyfolder();
4377 test_publish_registerproduct();
4378 test_publish_publishproduct();
4379 test_publish_publishfeatures();
4380 test_publish_registeruser();
4381 test_publish_processcomponents();
4383 test_publishsourcelist();
4384 test_transformprop();
4385 test_currentworkingdir();
4391 test_duplicatefiles();
4392 test_writeregistryvalues();
4393 test_sourcefolder();
4394 test_customaction51();
4395 test_installstate();
4397 SetCurrentDirectoryA(prev_path
);