ReactOS 0.4.15-dev-8408-g466a198
action.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2006 James Hawkins
3 * Copyright 2010 Hans Leidekker for CodeWeavers
4 *
5 * Tests concentrating on standard actions
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#define _WIN32_MSI 300
23#include <stdio.h>
24#include <stdlib.h>
25
26#define COBJMACROS
27#include <windows.h>
28#include <msiquery.h>
29#include <msidefs.h>
30#include <msi.h>
31#include <fci.h>
32#include <srrestoreptapi.h>
33#include <wtypes.h>
34#include <shellapi.h>
35#include <winsvc.h>
36#include <odbcinst.h>
37#ifdef __REACTOS__
38#include <oleauto.h>
39#endif
40#include <sddl.h>
41
42#include "wine/test.h"
43#include "utils.h"
44#include "typelib.h"
45
46static UINT (WINAPI *pMsiQueryComponentStateA)
48static UINT (WINAPI *pMsiSourceListEnumSourcesA)
50static UINT (WINAPI *pMsiSourceListGetInfoA)
52static INSTALLSTATE (WINAPI *pMsiGetComponentPathExA)
54static UINT (WINAPI *pMsiQueryFeatureStateExA)
56
57static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD);
58static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
59
60static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD);
61static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA *, STATEMGRSTATUS *);
62
64static const BOOL is_64bit = sizeof(void *) > sizeof(int);
65
66static const char *msifile = "msitest.msi";
67
68/* msi database data */
69
70static const char component_dat[] =
71 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
72 "s72\tS38\ts72\ti2\tS255\tS72\n"
73 "Component\tComponent\n"
74 "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n"
75 "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n"
76 "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\tNOT REINSTALL\tone.txt\n"
77 "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n"
78 "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n"
79 "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n"
80 "component\t\tMSITESTDIR\t0\t1\tfile\n"
81 "service_comp\t{935A0A91-22A3-4F87-BCA8-928FFDFE2353}\tMSITESTDIR\t0\t\tservice_file\n"
82 "service_comp2\t{3F7B04A4-9521-4649-BDC9-0C8722740A49}\tMSITESTDIR\t0\t\tservice_file2\n"
83 "service_comp3\t{DBCD1502-20E3-423F-B53E-F37E263CDC7E}\tMSITESTDIR\t0\t\t\n";
84
85static const char directory_dat[] =
86 "Directory\tDirectory_Parent\tDefaultDir\n"
87 "s72\tS72\tl255\n"
88 "Directory\tDirectory\n"
89 "CABOUTDIR\tMSITESTDIR\tcabout\n"
90 "CHANGEDDIR\tMSITESTDIR\tchanged:second\n"
91 "FIRSTDIR\tMSITESTDIR\tfirst\n"
92 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
93 "NEWDIR\tCABOUTDIR\tnew\n"
94 "ProgramFilesFolder\tTARGETDIR\t.\n"
95 "TARGETDIR\t\tSourceDir";
96
97static const char feature_dat[] =
98 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
99 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
100 "Feature\tFeature\n"
101 "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n"
102 "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n"
103 "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n"
104 "Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n"
105 "Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n"
106 "feature\t\t\t\t2\t1\tTARGETDIR\t0\n"
107 "service_feature\t\t\t\t2\t1\tTARGETDIR\t0";
108
109static const char feature_comp_dat[] =
110 "Feature_\tComponent_\n"
111 "s38\ts72\n"
112 "FeatureComponents\tFeature_\tComponent_\n"
113 "Five\tFive\n"
114 "Four\tFour\n"
115 "One\tOne\n"
116 "Three\tThree\n"
117 "Two\tTwo\n"
118 "feature\tcomponent\n"
119 "service_feature\tservice_comp\n"
120 "service_feature\tservice_comp2\n"
121 "service_feature\tservice_comp3";
122
123static const char file_dat[] =
124 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
125 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
126 "File\tFile\n"
127 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
128 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
129 "one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n"
130 "three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n"
131 "two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n"
132 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
133 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t6\n"
134 "service_file2\tservice_comp2\tservice2.exe\t100\t\t\t8192\t7";
135
136static const char install_exec_seq_dat[] =
137 "Action\tCondition\tSequence\n"
138 "s72\tS255\tI2\n"
139 "InstallExecuteSequence\tAction\n"
140 "AllocateRegistrySpace\tNOT Installed\t1550\n"
141 "CostFinalize\t\t1000\n"
142 "CostInitialize\t\t800\n"
143 "FileCost\t\t900\n"
144 "ResolveSource\t\t950\n"
145 "MoveFiles\t\t1700\n"
146 "InstallFiles\t\t4000\n"
147 "DuplicateFiles\t\t4500\n"
148 "CreateShortcuts\t\t4600\n"
149 "InstallServices\t\t5000\n"
150 "InstallFinalize\t\t6600\n"
151 "InstallInitialize\t\t1500\n"
152 "InstallValidate\t\t1400\n"
153 "LaunchConditions\t\t100\n"
154 "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000";
155
156static const char media_dat[] =
157 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
158 "i2\ti4\tL64\tS255\tS32\tS72\n"
159 "Media\tDiskId\n"
160 "1\t3\t\t\tDISK1\t\n"
161 "2\t7\t\tmsitest.cab\tDISK2\t\n";
162
163static const char property_dat[] =
164 "Property\tValue\n"
165 "s72\tl0\n"
166 "Property\tProperty\n"
167 "DefaultUIFont\tDlgFont8\n"
168 "HASUIRUN\t0\n"
169 "INSTALLLEVEL\t3\n"
170 "InstallMode\tTypical\n"
171 "Manufacturer\tWine\n"
172 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
173 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
174 "ProductID\tnone\n"
175 "ProductLanguage\t1033\n"
176 "ProductName\tMSITEST\n"
177 "ProductVersion\t1.1.1\n"
178 "PROMPTROLLBACKCOST\tP\n"
179 "Setup\tSetup\n"
180 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
181 "AdminProperties\tPOSTADMIN\n"
182 "ROOTDRIVE\tC:\\\n"
183 "SERVNAME\tTestService\n"
184 "SERVNAME2\tTestService2\n"
185 "SERVDISP\tTestServiceDisp\n"
186 "SERVDISP2\tTestServiceDisp2\n"
187 "MSIFASTINSTALL\t1\n"
188 "ARPNOMODIFY\t1\n"
189 "regdata17\t#1\n";
190
191static const char env_install_exec_seq_dat[] =
192 "Action\tCondition\tSequence\n"
193 "s72\tS255\tI2\n"
194 "InstallExecuteSequence\tAction\n"
195 "CostInitialize\t\t100\n"
196 "FileCost\t\t200\n"
197 "CostFinalize\t\t300\n"
198 "InstallValidate\t\t400\n"
199 "InstallInitialize\t\t500\n"
200 "ProcessComponents\t\t600\n"
201 "WriteEnvironmentStrings\t\t700\n"
202 "wes_immediate\tNOT REMOVE\t701\n"
203 "wes_deferred\tNOT REMOVE\t702\n"
204 "RemoveEnvironmentStrings\t\t800\n"
205 "res_immediate\tREMOVE\t801\n"
206 "res_deferred\tREMOVE\t802\n"
207 "RegisterProduct\t\t900\n"
208 "PublishFeatures\t\t1000\n"
209 "PublishProduct\t\t1100\n"
210 "UnpublishFeatures\t\t1150\n"
211 "InstallFinalize\t\t1200\n";
212
213static const char env_custom_action_dat[] =
214 "Action\tType\tSource\tTarget\n"
215 "s72\ti2\tS64\tS0\n"
216 "CustomAction\tAction\n"
217 "wes_immediate\t1\tcustom.dll\tenv_absent\n"
218 "wes_deferred\t1025\tcustom.dll\tenv_present\n"
219 "res_immediate\t1\tcustom.dll\tenv_present\n"
220 "res_deferred\t1025\tcustom.dll\tenv_absent\n";
221
222static const char env_environment_dat[] =
223 "Environment\tName\tValue\tComponent_\n"
224 "s72\tl255\tL255\ts72\n"
225 "Environment\tEnvironment\n"
226 "Var1\t=-MSITESTVAR1\t1\tOne\n"
227 "Var2\tMSITESTVAR2\t1\tOne\n"
228 "Var3\t=-MSITESTVAR3\t1\tOne\n"
229 "Var4\tMSITESTVAR4\t1\tOne\n"
230 "Var5\t-MSITESTVAR5\t\tOne\n"
231 "Var6\tMSITESTVAR6\t\tOne\n"
232 "Var7\t!-MSITESTVAR7\t\tOne\n"
233 "Var8\t!-*MSITESTVAR8\t\tOne\n"
234 "Var9\t=-MSITESTVAR9\t\tOne\n"
235 "Var10\t=MSITESTVAR10\t\tOne\n"
236 "Var11\t+-MSITESTVAR11\t[~];1\tOne\n"
237 "Var12\t+-MSITESTVAR11\t[~];2\tOne\n"
238 "Var13\t+-MSITESTVAR12\t[~];1\tOne\n"
239 "Var14\t=MSITESTVAR13\t[~];1\tOne\n"
240 "Var15\t=MSITESTVAR13\t[~];2\tOne\n"
241 "Var16\t=MSITESTVAR14\t;1;\tOne\n"
242 "Var17\t=MSITESTVAR15\t;;1;;\tOne\n"
243 "Var18\t=MSITESTVAR16\t 1 \tOne\n"
244 "Var19\t+-MSITESTVAR17\t1\tOne\n"
245 "Var20\t+-MSITESTVAR17\t;;2;;[~]\tOne\n"
246 "Var21\t+-MSITESTVAR18\t1\tOne\n"
247 "Var22\t+-MSITESTVAR18\t[~];;2;;\tOne\n"
248 "Var23\t+-MSITESTVAR19\t1\tOne\n"
249 "Var24\t+-MSITESTVAR19\t[~]2\tOne\n"
250 "Var25\t+-MSITESTVAR20\t1\tOne\n"
251 "Var26\t+-MSITESTVAR20\t2[~]\tOne\n"
252 "Var27\t+-MSITESTVAR21\t[~];1\tOne\n"
253 "Var28\t-MSITESTVAR22\t1\tOne\n"
254 "Var29\t-MSITESTVAR23\t2\tOne\n"
255 "Var30\t*MSITESTVAR100\t1\tOne\n"
256 "Var31\t-=MSITESTVAR24\t[SERVNAME]\tOne\n"
257 "Var32\t-=MSITESTVAR25\t[bogus_prop]\tOne\n";
258
259static const char service_install_dat[] =
260 "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
261 "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n"
262 "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n"
263 "ServiceInstall\tServiceInstall\n"
264 "TestService\t[SERVNAME]\t[SERVDISP]\t2\t3\t0\t\tservice1[~]+group1[~]service2[~]+group2[~][~]\tTestService\t\t-a arg\tservice_comp\tdescription\n"
265 "TestService2\t[SERVNAME2]\t[SERVDISP2]\t2\t3\t0\t\tservice1[~]+group1[~]service2[~]+group2[~][~]\tTestService2\t\t-a arg\tservice_comp2\tdescription\n";
266
267static const char service_install2_dat[] =
268 "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
269 "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n"
270 "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n"
271 "ServiceInstall\tServiceInstall\n"
272 "TestService\tTestService\tTestService\t2\t3\t32768\t\t\tTestService\t\t\tservice_comp\t\n"
273 "TestService4\tTestService4\tTestService4\t2\t3\t0\t\t\tTestService4\t\t\tservice_comp3\t\n";
274
275static const char service_control_dat[] =
276 "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
277 "s72\tl255\ti2\tL255\tI2\ts72\n"
278 "ServiceControl\tServiceControl\n"
279 "ServiceControl\tTestService3\t8\t\t0\tservice_comp\n"
280 "ServiceControl2\tTestService3\t128\t\t0\tservice_comp2";
281
282static const char sss_service_control_dat[] =
283 "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
284 "s72\tl255\ti2\tL255\tI2\ts72\n"
285 "ServiceControl\tServiceControl\n"
286 "ServiceControl\tSpooler\t1\t\t1\tservice_comp\n"
287 "ServiceControl2\tSpooler\t2\t\t1\tservice_comp\n"
288 "ServiceControl3\tSpooler\t16\t\t1\tservice_comp\n"
289 "ServiceControl4\tSpooler\t32\t\t1\tservice_comp\n";
290
291static const char sss_install_exec_seq_dat[] =
292 "Action\tCondition\tSequence\n"
293 "s72\tS255\tI2\n"
294 "InstallExecuteSequence\tAction\n"
295 "LaunchConditions\t\t100\n"
296 "CostInitialize\t\t800\n"
297 "FileCost\t\t900\n"
298 "ResolveSource\t\t950\n"
299 "CostFinalize\t\t1000\n"
300 "InstallValidate\t\t1400\n"
301 "InstallInitialize\t\t1500\n"
302 "StopServices\t\t4000\n"
303 "stop_immediate\tNOT REMOVE\t4001\n"
304 "stop_deferred\tNOT REMOVE\t4002\n"
305 "DeleteServices\t\t5000\n"
306 "MoveFiles\t\t5100\n"
307 "InstallFiles\t\t5200\n"
308 "DuplicateFiles\t\t5300\n"
309 "StartServices\t\t5400\n"
310 "start_deferred\tNOT REMOVE\t5401\n"
311 "RegisterProduct\t\t5500\n"
312 "PublishFeatures\t\t5600\n"
313 "PublishProduct\t\t5700\n"
314 "UnpublishFeatures\t\t5800\n"
315 "InstallFinalize\t\t6000\n";
316
317static const char sss_custom_action_dat[] =
318 "Action\tType\tSource\tTarget\n"
319 "s72\ti2\tS64\tS0\n"
320 "CustomAction\tAction\n"
321 "stop_immediate\t1\tcustom.dll\tsss_started\n"
322 "stop_deferred\t1025\tcustom.dll\tsss_stopped\n"
323 "start_deferred\t1025\tcustom.dll\tsss_started\n";
324
325static const char sds_install_exec_seq_dat[] =
326 "Action\tCondition\tSequence\n"
327 "s72\tS255\tI2\n"
328 "InstallExecuteSequence\tAction\n"
329 "LaunchConditions\t\t100\n"
330 "CostInitialize\t\t800\n"
331 "FileCost\t\t900\n"
332 "ResolveSource\t\t950\n"
333 "CostFinalize\t\t1000\n"
334 "InstallValidate\t\t1400\n"
335 "InstallInitialize\t\t1500\n"
336 "StopServices\t\t5000\n"
337 "DeleteServices\t\t5050\n"
338 "sds_immediate\tNOT REMOVE\t5051\n"
339 "sds_deferred\tNOT REMOVE\t5052\n"
340 "MoveFiles\t\t5100\n"
341 "InstallFiles\t\t5200\n"
342 "DuplicateFiles\t\t5300\n"
343 "InstallServices\t\t5400\n"
344 "StartServices\t\t5450\n"
345 "RegisterProduct\t\t5500\n"
346 "PublishFeatures\t\t5600\n"
347 "PublishProduct\t\t5700\n"
348 "UnpublishFeatures\t\t5800\n"
349 "InstallFinalize\t\t6000\n";
350
351static const char sds_custom_action_dat[] =
352 "Action\tType\tSource\tTarget\n"
353 "s72\ti2\tS64\tS0\n"
354 "CustomAction\tAction\n"
355 "sds_immediate\t1\tcustom.dll\tsds_present\n"
356 "sds_deferred\t1025\tcustom.dll\tsds_absent\n";
357
358static const char sis_install_exec_seq_dat[] =
359 "Action\tCondition\tSequence\n"
360 "s72\tS255\tI2\n"
361 "InstallExecuteSequence\tAction\n"
362 "CostInitialize\t\t800\n"
363 "FileCost\t\t900\n"
364 "CostFinalize\t\t1000\n"
365 "InstallValidate\t\t1400\n"
366 "InstallInitialize\t\t1500\n"
367 "StopServices\t\t5000\n"
368 "DeleteServices\t\t5050\n"
369 "InstallFiles\t\t5200\n"
370 "InstallServices\t\t5400\n"
371 "sis_immediate\tNOT REMOVE\t5401\n"
372 "sis_deferred\tNOT REMOVE\t5402\n"
373 "StartServices\t\t5450\n"
374 "RegisterProduct\t\t5500\n"
375 "PublishFeatures\t\t5600\n"
376 "PublishProduct\t\t5700\n"
377 "UnpublishFeatures\t\t5800\n"
378 "InstallFinalize\t\t6000\n";
379
380static const char sis_custom_action_dat[] =
381 "Action\tType\tSource\tTarget\n"
382 "s72\ti2\tS64\tS0\n"
383 "CustomAction\tAction\n"
384 "sis_immediate\t1\tcustom.dll\tsis_absent\n"
385 "sis_deferred\t1025\tcustom.dll\tsis_present\n";
386
387static const char rof_component_dat[] =
388 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
389 "s72\tS38\ts72\ti2\tS255\tS72\n"
390 "Component\tComponent\n"
391 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n";
392
393static const char rof_feature_dat[] =
394 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
395 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
396 "Feature\tFeature\n"
397 "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n"
398 "montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0";
399
400static const char rof_feature_comp_dat[] =
401 "Feature_\tComponent_\n"
402 "s38\ts72\n"
403 "FeatureComponents\tFeature_\tComponent_\n"
404 "feature\tmaximus\n"
405 "montecristo\tmaximus";
406
407static const char rof_file_dat[] =
408 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
409 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
410 "File\tFile\n"
411 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1";
412
413static const char rof_media_dat[] =
414 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
415 "i2\ti4\tL64\tS255\tS32\tS72\n"
416 "Media\tDiskId\n"
417 "1\t1\t\t\tDISK1\t\n";
418
419static const char ci2_feature_comp_dat[] =
420 "Feature_\tComponent_\n"
421 "s38\ts72\n"
422 "FeatureComponents\tFeature_\tComponent_\n"
423 "feature\taugustus";
424
425static const char ci2_file_dat[] =
426 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
427 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
428 "File\tFile\n"
429 "augustus\taugustus\taugustus\t500\t\t\t8192\t1";
430
431static const char pp_install_exec_seq_dat[] =
432 "Action\tCondition\tSequence\n"
433 "s72\tS255\tI2\n"
434 "InstallExecuteSequence\tAction\n"
435 "ValidateProductID\t\t700\n"
436 "CostInitialize\t\t800\n"
437 "FileCost\t\t900\n"
438 "CostFinalize\t\t1000\n"
439 "InstallValidate\t\t1400\n"
440 "InstallInitialize\t\t1500\n"
441 "ProcessComponents\tPROCESS_COMPONENTS=1 Or FULL=1\t1600\n"
442 "ppc_immediate\tPROCESS_COMPONENTS AND ALLUSERS\t1601\n"
443 "ppc_deferred\tPROCESS_COMPONENTS AND ALLUSERS\t1602\n"
444 "UnpublishFeatures\tUNPUBLISH_FEATURES=1 Or FULL=1\t1800\n"
445 "uf_immediate\tUNPUBLISH_FEATURES AND ALLUSERS\t1801\n"
446 "uf_deferred\tUNPUBLISH_FEATURES AND ALLUSERS\t1802\n"
447 "RemoveFiles\t\t3500\n"
448 "InstallFiles\t\t4000\n"
449 "RegisterUser\tREGISTER_USER=1 Or FULL=1\t6000\n"
450 "ru_immediate\tREGISTER_USER AND ALLUSERS\t6001\n"
451 "ru_deferred\tREGISTER_USER AND ALLUSERS\t6002\n"
452 "RegisterProduct\tREGISTER_PRODUCT=1 Or FULL=1\t6100\n"
453 "rp_immediate\tREGISTER_PRODUCT AND ALLUSERS AND NOT RP_TEST64\t6101\n"
454 "rp_deferred\tREGISTER_PRODUCT AND ALLUSERS AND NOT RP_TEST64\t6102\n"
455 "PublishFeatures\tPUBLISH_FEATURES=1 Or FULL=1\t6300\n"
456 "pf_immediate\tPUBLISH_FEATURES AND ALLUSERS\t6301\n"
457 "pf_deferred\tPUBLISH_FEATURES AND ALLUSERS\t6302\n"
458 "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n"
459 "pp_immediate\tPUBLISH_PRODUCT AND ALLUSERS\t6401\n"
460 "pp_deferred\tPUBLISH_PRODUCT AND ALLUSERS\t6402\n"
461 "InstallFinalize\t\t6600";
462
463static const char pp_custom_action_dat[] =
464 "Action\tType\tSource\tTarget\n"
465 "s72\ti2\tS64\tS0\n"
466 "CustomAction\tAction\n"
467 "pf_immediate\t1\tcustom.dll\tpf_absent\n"
468 "pf_deferred\t1025\tcustom.dll\tpf_present\n"
469 "uf_immediate\t1\tcustom.dll\tpf_present\n"
470 "uf_deferred\t1025\tcustom.dll\tpf_absent\n"
471 "pp_immediate\t1\tcustom.dll\tpp_absent\n"
472 "pp_deferred\t1025\tcustom.dll\tpp_present\n"
473 "rp_immediate\t1\tcustom.dll\trp_absent\n"
474 "rp_deferred\t1025\tcustom.dll\trp_present\n"
475 "ru_immediate\t1\tcustom.dll\tru_absent\n"
476 "ru_deferred\t1025\tcustom.dll\tru_present\n"
477 "ppc_immediate\t1\tcustom.dll\tppc_absent\n"
478 "ppc_deferred\t1025\tcustom.dll\tppc_present\n";
479
480static const char pp_component_dat[] =
481 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
482 "s72\tS38\ts72\ti2\tS255\tS72\n"
483 "Component\tComponent\n"
484 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\t\tmaximus\n";
485
486static const char ppc_component_dat[] =
487 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
488 "s72\tS38\ts72\ti2\tS255\tS72\n"
489 "Component\tComponent\n"
490 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\t\tmaximus\n"
491 "augustus\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\taugustus\n";
492
493static const char ppc_file_dat[] =
494 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
495 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
496 "File\tFile\n"
497 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1\n"
498 "augustus\taugustus\taugustus\t500\t\t\t8192\t2";
499
500static const char ppc_media_dat[] =
501 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
502 "i2\ti4\tL64\tS255\tS32\tS72\n"
503 "Media\tDiskId\n"
504 "1\t2\t\t\tDISK1\t\n";
505
506static const char ppc_feature_comp_dat[] =
507 "Feature_\tComponent_\n"
508 "s38\ts72\n"
509 "FeatureComponents\tFeature_\tComponent_\n"
510 "feature\tmaximus\n"
511 "feature\taugustus\n"
512 "montecristo\tmaximus";
513
514static const char cwd_component_dat[] =
515 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
516 "s72\tS38\ts72\ti2\tS255\tS72\n"
517 "Component\tComponent\n"
518 "augustus\t\tMSITESTDIR\t0\t\taugustus\n";
519
520static const char rem_component_dat[] =
521 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
522 "s72\tS38\ts72\ti2\tS255\tS72\n"
523 "Component\tComponent\n"
524 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t0\t\thydrogen\n"
525 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\thelium\n"
526 "lithium\t\tMSITESTDIR\t2\t\tlithium\n";
527
528static const char rem_feature_comp_dat[] =
529 "Feature_\tComponent_\n"
530 "s38\ts72\n"
531 "FeatureComponents\tFeature_\tComponent_\n"
532 "feature\thydrogen\n"
533 "feature\thelium\n"
534 "feature\tlithium";
535
536static const char rem_file_dat[] =
537 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
538 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
539 "File\tFile\n"
540 "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n"
541 "helium\thelium\thelium\t0\t\t\t8192\t1\n"
542 "lithium\tlithium\tlithium\t0\t\t\t8192\t1";
543
544static const char rem_install_exec_seq_dat[] =
545 "Action\tCondition\tSequence\n"
546 "s72\tS255\tI2\n"
547 "InstallExecuteSequence\tAction\n"
548 "ValidateProductID\t\t700\n"
549 "CostInitialize\t\t800\n"
550 "FileCost\t\t900\n"
551 "CostFinalize\t\t1000\n"
552 "InstallValidate\t\t1400\n"
553 "InstallInitialize\t\t1500\n"
554 "ProcessComponents\t\t1600\n"
555 "RemoveFiles\t\t3500\n"
556 "InstallFiles\t\t4000\n"
557 "RegisterProduct\t\t6100\n"
558 "PublishFeatures\t\t6300\n"
559 "PublishProduct\t\t6400\n"
560 "UnpublishFeatures\t\t6500\n"
561 "InstallFinalize\t\t6600";
562
563static const char rem_remove_files_dat[] =
564 "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n"
565 "s72\ts72\tS255\ts72\tI2\n"
566 "RemoveFile\tFileKey\n"
567 "furlong\thydrogen\tfurlong\tMSITESTDIR\t1\n"
568 "firkin\thelium\tfirkin\tMSITESTDIR\t1\n"
569 "fortnight\tlithium\tfortnight\tMSITESTDIR\t1\n"
570 "becquerel\thydrogen\tbecquerel\tMSITESTDIR\t2\n"
571 "dioptre\thelium\tdioptre\tMSITESTDIR\t2\n"
572 "attoparsec\tlithium\tattoparsec\tMSITESTDIR\t2\n"
573 "storeys\thydrogen\tstoreys\tMSITESTDIR\t3\n"
574 "block\thelium\tblock\tMSITESTDIR\t3\n"
575 "siriometer\tlithium\tsiriometer\tMSITESTDIR\t3\n"
576 "nanoacre\thydrogen\t\tCABOUTDIR\t3\n";
577
578static const char mov_move_file_dat[] =
579 "FileKey\tComponent_\tSourceName\tDestName\tSourceFolder\tDestFolder\tOptions\n"
580 "s72\ts72\tS255\tS255\tS72\ts72\ti2\n"
581 "MoveFile\tFileKey\n"
582 "abkhazia\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t0\n"
583 "bahamas\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t1\n"
584 "cambodia\taugustus\tcameroon\tcanada\tSourceDir\tMSITESTDIR\t0\n"
585 "denmark\taugustus\tdjibouti\tdominica\tSourceDir\tMSITESTDIR\t1\n"
586 "ecuador\taugustus\tegypt\telsalvador\tNotAProp\tMSITESTDIR\t1\n"
587 "fiji\taugustus\tfinland\tfrance\tSourceDir\tNotAProp\t1\n"
588 "gabon\taugustus\tgambia\tgeorgia\tSOURCEFULL\tMSITESTDIR\t1\n"
589 "haiti\taugustus\thonduras\thungary\tSourceDir\tDESTFULL\t1\n"
590 "iceland\taugustus\tindia\tindonesia\tMSITESTDIR\tMSITESTDIR\t1\n"
591 "jamaica\taugustus\tjapan\tjordan\tFILEPATHBAD\tMSITESTDIR\t1\n"
592 "kazakhstan\taugustus\t\tkiribati\tFILEPATHGOOD\tMSITESTDIR\t1\n"
593 "laos\taugustus\tlatvia\tlebanon\tSourceDir\tMSITESTDIR\t1\n"
594 "namibia\taugustus\tnauru\tkiribati\tSourceDir\tMSITESTDIR\t1\n"
595 "pakistan\taugustus\tperu\tsfn|poland\tSourceDir\tMSITESTDIR\t1\n"
596 "wildcard\taugustus\tapp*\twildcard\tSourceDir\tMSITESTDIR\t1\n"
597 "single\taugustus\tf?o\tsingle\tSourceDir\tMSITESTDIR\t1\n"
598 "wildcardnodest\taugustus\tbudd*\t\tSourceDir\tMSITESTDIR\t1\n"
599 "singlenodest\taugustus\tb?r\t\tSourceDir\tMSITESTDIR\t1\n";
600
601static const char mov_install_exec_seq_dat[] =
602 "Action\tCondition\tSequence\n"
603 "s72\tS255\tI2\n"
604 "InstallExecuteSequence\tAction\n"
605 "CostInitialize\t\t100\n"
606 "FileCost\t\t200\n"
607 "ResolveSource\t\t300\n"
608 "CostFinalize\t\t400\n"
609 "InstallValidate\t\t500\n"
610 "InstallInitialize\t\t600\n"
611 "MoveFiles\t\t700\n"
612 "mov_immediate\t\t701\n"
613 "mov_deferred\t\t702\n"
614 "InstallFiles\t\t800\n"
615 "InstallFinalize\t\t900\n";
616
617static const char mov_custom_action_dat[] =
618 "Action\tType\tSource\tTarget\n"
619 "s72\ti2\tS64\tS0\n"
620 "CustomAction\tAction\n"
621 "mov_immediate\t1\tcustom.dll\tmov_absent\n"
622 "mov_deferred\t1025\tcustom.dll\tmov_present\n";
623
624static const char df_directory_dat[] =
625 "Directory\tDirectory_Parent\tDefaultDir\n"
626 "s72\tS72\tl255\n"
627 "Directory\tDirectory\n"
628 "THIS\tMSITESTDIR\tthis\n"
629 "DOESNOT\tTHIS\tdoesnot\n"
630 "NONEXISTENT\tDOESNOT\texist\n"
631 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
632 "ProgramFilesFolder\tTARGETDIR\t.\n"
633 "TARGETDIR\t\tSourceDir";
634
635static const char df_duplicate_file_dat[] =
636 "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n"
637 "s72\ts72\ts72\tS255\tS72\n"
638 "DuplicateFile\tFileKey\n"
639 "maximus\tmaximus\tmaximus\taugustus\t\n"
640 "caesar\tmaximus\tmaximus\t\tNONEXISTENT\n"
641 "augustus\tnosuchcomponent\tmaximus\t\tMSITESTDIR\n";
642
643static const char wrv_component_dat[] =
644 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
645 "s72\tS38\ts72\ti2\tS255\tS72\n"
646 "Component\tComponent\n"
647 "augustus\t{bafe0297-cbcc-4e08-8a78-7e9b83456eef}\tMSITESTDIR\t0\t\t\n"
648 "caesar\t{bafe0298-cbcc-4e08-8a78-7e9b83456eef}\tMSITESTDIR\t1\t\t\n";
649
650static const char wrv_feature_dat[] =
651 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
652 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
653 "Feature\tFeature\n"
654 "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n"
655 "feature2\t\tFeature2\tFeature2\t2\t1\tTARGETDIR\t1";
656
657static const char wrv_feature_comp_dat[] =
658 "Feature_\tComponent_\n"
659 "s38\ts72\n"
660 "FeatureComponents\tFeature_\tComponent_\n"
661 "feature\taugustus\n"
662 "feature2\tcaesar";
663
664static const char wrv_registry_dat[] =
665 "Registry\tRoot\tKey\tName\tValue\tComponent_\n"
666 "s72\ti2\tl255\tL255\tL0\ts72\n"
667 "Registry\tRegistry\n"
668 "regdata0\t1\tmsitest\tsz\tstring\taugustus\n"
669 "regdata1\t1\tmsitest\tmultisz\tone[~]two[~]three\taugustus\n"
670 "regdata2\t1\tmsitest\texpandsz\t#%string\taugustus\n"
671 "regdata3\t1\tmsitest\tdword\t#123\taugustus\n"
672 "regdata4\t1\tmsitest\tbinary\t#x01234567\taugustus\n"
673 "regdata5\t1\tmsitest\t\tdefault\taugustus\n"
674 "regdata6\t1\tmsitest\\subkey\t*\t\taugustus\n"
675 "regdata7\t1\tmsitest\\subkey\t*\t#%\taugustus\n"
676 "regdata8\t1\tmsitest\\subkey\t*\t#x\taugustus\n"
677 "regdata9\t1\tmsitest\\VisualStudio\\10.0\\AD7Metrics\\Exception\\{049EC4CC-30D2-4032-9256-EE18EB41B62B}\\Common Language Runtime Exceptions\\System.Workflow.ComponentModel.Serialization\\System.Workflow.ComponentModel.Serialization.WorkflowMarkupSerializationException\tlong\tkey\taugustus\n"
678 "regdata10\t1\tmsitest\tValue1\t[~]one[~]\taugustus\n"
679 "regdata11\t1\tmsitest\tValue2\t[~]two\taugustus\n"
680 "regdata12\t1\tmsitest\tValue3\tone[~]\taugustus\n"
681 "regdata13\t1\tmsitest\tValue4\tone[~]two\taugustus\n"
682 "regdata14\t1\tmsitest\tValue5\t[~]one[~]two[~]three\taugustus\n"
683 "regdata15\t1\tmsitest\tValue6\t[~]\taugustus\n"
684 "regdata16\t1\tmsitest\tValue7\t[~]two\taugustus\n"
685 "regdata17\t1\tmsitest\tformat\t[regdata17]\taugustus\n"
686 "regdata18\t1\tmsitest\tsource\t#1\tcaesar\n"
687 "regdata19\t1\tmsitest\\create\t+\t\taugustus\n"
688 "regdata20\t1\tmsitest\\delete\t-\t\taugustus\n";
689
690static const char wrv_remove_registry_dat[] =
691 "RemoveRegistry\tRoot\tKey\tName\tComponent_\n"
692 "s72\ti2\tl255\tL255\ts72\n"
693 "RemoveRegistry\tRemoveRegistry\n"
694 "regdata0\t1\tmsitest\tinstremove\taugustus\n"
695 "regdata1\t1\tmsitest\\instremove\t-\taugustus\n";
696
697static const char wrv_install_exec_seq_dat[] =
698 "Action\tCondition\tSequence\n"
699 "s72\tS255\tI2\n"
700 "InstallExecuteSequence\tAction\n"
701 "CostInitialize\t\t800\n"
702 "FileCost\t\t900\n"
703 "CostFinalize\t\t1000\n"
704 "InstallValidate\t\t1400\n"
705 "InstallInitialize\t\t1500\n"
706 "ProcessComponents\t\t1600\n"
707 "RemoveRegistryValues\t\t4900\n"
708 "rrv_immediate\tREMOVE\t4901\n"
709 "rrv_deferred\tREMOVE\t4902\n"
710 "WriteRegistryValues\t\t5000\n"
711 "wrv_immediate\tNOT REMOVE\t5001\n"
712 "wrv_deferred\tNOT REMOVE\t5002\n"
713 "RegisterProduct\t\t6100\n"
714 "PublishFeatures\t\t6200\n"
715 "PublishProduct\t\t6300\n"
716 "UnpublishFeatures\t\t6400\n"
717 "InstallFinalize\t\t6600\n";
718
719static const char wrv_custom_action_dat[] =
720 "Action\tType\tSource\tTarget\n"
721 "s72\ti2\tS64\tS0\n"
722 "CustomAction\tAction\n"
723 "wrv_immediate\t1\tcustom.dll\twrv_absent\n"
724 "wrv_deferred\t1025\tcustom.dll\twrv_present\n"
725 "rrv_immediate\t1\tcustom.dll\twrv_present\n"
726 "rrv_deferred\t1025\tcustom.dll\twrv_absent\n";
727
728static const char cf_directory_dat[] =
729 "Directory\tDirectory_Parent\tDefaultDir\n"
730 "s72\tS72\tl255\n"
731 "Directory\tDirectory\n"
732 "FIRSTDIR\tMSITESTDIR\tfirst\n"
733 "SECONDDIR\tMSITESTDIR\tsecond\n"
734 "THIRDDIR\tMSITESTDIR\tthird\n"
735 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
736 "ProgramFilesFolder\tTARGETDIR\t.\n"
737 "TARGETDIR\t\tSourceDir";
738
739static const char cf_component_dat[] =
740 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
741 "s72\tS38\ts72\ti2\tS255\tS72\n"
742 "Component\tComponent\n"
743 "One\t{F8CD42AC-9C38-48FE-8664-B35FD121012A}\tFIRSTDIR\t0\t\tone.txt\n"
744 "Two\t{DE2DB02E-2DDF-4E34-8CF6-DCA13E29DF52}\tSECONDDIR\t0\t\ttwo.txt\n";
745
746static const char cf_feature_dat[] =
747 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
748 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
749 "Feature\tFeature\n"
750 "One\t\tOne\tThe One Feature\t1\t3\tFIRSTDIR\t0\n"
751 "Two\t\tTwo\tThe Two Feature\t1\t3\tSECONDDIR\t0\n";
752
753static const char cf_feature_comp_dat[] =
754 "Feature_\tComponent_\n"
755 "s38\ts72\n"
756 "FeatureComponents\tFeature_\tComponent_\n"
757 "One\tOne\n"
758 "Two\tTwo\n";
759
760static const char cf_file_dat[] =
761 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
762 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
763 "File\tFile\n"
764 "one.txt\tOne\tone.txt\t0\t\t\t0\t1\n"
765 "two.txt\tTwo\ttwo.txt\t0\t\t\t0\t2\n";
766
767static const char cf_create_folders_dat[] =
768 "Directory_\tComponent_\n"
769 "s72\ts72\n"
770 "CreateFolder\tDirectory_\tComponent_\n"
771 "FIRSTDIR\tOne\n"
772 "SECONDDIR\tTwo\n"
773 "THIRDDIR\tTwo\n";
774
775static const char cf_install_exec_seq_dat[] =
776 "Action\tCondition\tSequence\n"
777 "s72\tS255\tI2\n"
778 "InstallExecuteSequence\tAction\n"
779 "CostFinalize\t\t1000\n"
780 "ValidateProductID\t\t700\n"
781 "CostInitialize\t\t800\n"
782 "FileCost\t\t900\n"
783 "RemoveFiles\t\t3500\n"
784 "rfi_immediate\tREMOVE\t3501\n"
785 "rfi_deferred\tREMOVE\t3502\n"
786 "CreateFolders\t\t3700\n"
787 "cf_immediate\tNOT REMOVE\t3701\n"
788 "cf_deferred\tNOT REMOVE\t3702\n"
789 "RemoveFolders\t\t3800\n"
790 "rf_immediate\tREMOVE\t3801\n"
791 "rf_deferred\tREMOVE\t3802\n"
792 "InstallFiles\t\t4000\n"
793 "ifi_immediate\tNOT REMOVE\t4001\n"
794 "ifi_deferred\tNOT REMOVE\t4002\n"
795 "RegisterUser\t\t6000\n"
796 "RegisterProduct\t\t6100\n"
797 "PublishFeatures\t\t6300\n"
798 "PublishProduct\t\t6400\n"
799 "InstallFinalize\t\t6600\n"
800 "InstallInitialize\t\t1500\n"
801 "ProcessComponents\t\t1600\n"
802 "UnpublishFeatures\t\t1800\n"
803 "InstallValidate\t\t1400\n"
804 "LaunchConditions\t\t100\n";
805
806static const char cf_custom_action_dat[] =
807 "Action\tType\tSource\tTarget\n"
808 "s72\ti2\tS64\tS0\n"
809 "CustomAction\tAction\n"
810 "ifi_immediate\t1\tcustom.dll\tfile_absent\n"
811 "ifi_deferred\t1025\tcustom.dll\tfile_present\n"
812 "rfi_immediate\t1\tcustom.dll\tfile_present\n"
813 "rfi_deferred\t1025\tcustom.dll\tfile_absent\n"
814 "cf_immediate\t1\tcustom.dll\tcf_absent\n"
815 "cf_deferred\t1025\tcustom.dll\tcf_present\n"
816 "rf_immediate\t1\tcustom.dll\tcf_present\n"
817 "rf_deferred\t1025\tcustom.dll\tcf_absent\n";
818
819static const char sr_file_dat[] =
820 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
821 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
822 "File\tFile\n"
823 "selfreg.dll\tselfreg\tselfreg.dll\t1000\t\t\t8192\t1\n";
824
825static const char sr_feature_dat[] =
826 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
827 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
828 "Feature\tFeature\n"
829 "selfreg\t\t\tselfreg feature\t1\t2\tMSITESTDIR\t0\n";
830
831static const char sr_feature_comp_dat[] =
832 "Feature_\tComponent_\n"
833 "s38\ts72\n"
834 "FeatureComponents\tFeature_\tComponent_\n"
835 "selfreg\tselfreg\n";
836
837static const char sr_component_dat[] =
838 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
839 "s72\tS38\ts72\ti2\tS255\tS72\n"
840 "Component\tComponent\n"
841 "selfreg\t{BB4C26FD-89D8-4E49-AF1C-DB4DCB5BF1B0}\tMSITESTDIR\t0\t\tselfreg.dll\n";
842
843static const char sr_selfreg_dat[] =
844 "File_\tCost\n"
845 "s72\tI2\n"
846 "SelfReg\tFile_\n"
847 "selfreg.dll\t\n";
848
849static const char sr_install_exec_seq_dat[] =
850 "Action\tCondition\tSequence\n"
851 "s72\tS255\tI2\n"
852 "InstallExecuteSequence\tAction\n"
853 "CostInitialize\t\t800\n"
854 "FileCost\t\t900\n"
855 "CostFinalize\t\t1000\n"
856 "InstallValidate\t\t1400\n"
857 "InstallInitialize\t\t1500\n"
858 "ProcessComponents\t\t1600\n"
859 "SelfUnregModules\t\t3800\n"
860 "su_immediate\tREMOVE\t3801\n"
861 "su_deferred\tREMOVE\t3802\n"
862 "RemoveFiles\t\t3900\n"
863 "InstallFiles\t\t4000\n"
864 "SelfRegModules\t\t4100\n"
865 "sr_immediate\tNOT REMOVE\t4101\n"
866 "sr_deferred\tNOT REMOVE\t4102\n"
867 "CreateShortcuts\t\t4600\n"
868 "RegisterProduct\t\t5100\n"
869 "PublishFeatures\t\t5200\n"
870 "PublishProduct\t\t5300\n"
871 "UnpublishFeatures\t\t5400\n"
872 "InstallFinalize\t\t6600\n";
873
874static const char sr_custom_action_dat[] =
875 "Action\tType\tSource\tTarget\n"
876 "s72\ti2\tS64\tS0\n"
877 "CustomAction\tAction\n"
878 "sr_immediate\t1\tcustom.dll\tsr_absent\n"
879 "sr_deferred\t1025\tcustom.dll\tsr_present\n"
880 "su_immediate\t1\tcustom.dll\tsr_present\n"
881 "su_deferred\t1025\tcustom.dll\tsr_absent\n";
882
883static const char font_media_dat[] =
884 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
885 "i2\ti4\tL64\tS255\tS32\tS72\n"
886 "Media\tDiskId\n"
887 "1\t3\t\t\tDISK1\t\n";
888
889static const char font_file_dat[] =
890 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
891 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
892 "File\tFile\n"
893 "font.ttf\tfonts\tfont.ttf\t1000\t\t\t8192\t1\n";
894
895static const char font_feature_dat[] =
896 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
897 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
898 "Feature\tFeature\n"
899 "fonts\t\t\tfont feature\t1\t2\tMSITESTDIR\t0\n";
900
901static const char font_component_dat[] =
902 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
903 "s72\tS38\ts72\ti2\tS255\tS72\n"
904 "Component\tComponent\n"
905 "fonts\t{F5920ED0-1183-4B8F-9330-86CE56557C05}\tMSITESTDIR\t0\t\tfont.ttf\n";
906
907static const char font_feature_comp_dat[] =
908 "Feature_\tComponent_\n"
909 "s38\ts72\n"
910 "FeatureComponents\tFeature_\tComponent_\n"
911 "fonts\tfonts\n";
912
913static const char font_dat[] =
914 "File_\tFontTitle\n"
915 "s72\tS128\n"
916 "Font\tFile_\n"
917 "font.ttf\tmsi test font\n";
918
919static const char font_install_exec_seq_dat[] =
920 "Action\tCondition\tSequence\n"
921 "s72\tS255\tI2\n"
922 "InstallExecuteSequence\tAction\n"
923 "ValidateProductID\t\t700\n"
924 "CostInitialize\t\t800\n"
925 "FileCost\t\t900\n"
926 "CostFinalize\t\t1000\n"
927 "InstallValidate\t\t1400\n"
928 "InstallInitialize\t\t1500\n"
929 "ProcessComponents\t\t1600\n"
930 "RemoveFiles\t\t3500\n"
931 "InstallFiles\t\t4000\n"
932 "RegisterFonts\t\t4100\n"
933 "rf_immediate\tNOT REMOVE\t4101\n"
934 "rf_deferred\tNOT REMOVE\t4102\n"
935 "UnregisterFonts\t\t4200\n"
936 "uf_immediate\tREMOVE\t4201\n"
937 "uf_deferred\tREMOVE\t4202\n"
938 "RegisterUser\t\t6000\n"
939 "RegisterProduct\t\t6100\n"
940 "PublishFeatures\t\t6300\n"
941 "PublishProduct\t\t6400\n"
942 "UnpublishFeatures\t\t6500\n"
943 "InstallFinalize\t\t6600";
944
945static const char font_custom_action_dat[] =
946 "Action\tType\tSource\tTarget\n"
947 "s72\ti2\tS64\tS0\n"
948 "CustomAction\tAction\n"
949 "rf_immediate\t1\tcustom.dll\tfont_absent\n"
950 "rf_deferred\t1025\tcustom.dll\tfont_present\n"
951 "uf_immediate\t1\tcustom.dll\tfont_present\n"
952 "uf_deferred\t1025\tcustom.dll\tfont_absent\n";
953
954static const char vp_property_dat[] =
955 "Property\tValue\n"
956 "s72\tl0\n"
957 "Property\tProperty\n"
958 "HASUIRUN\t0\n"
959 "INSTALLLEVEL\t3\n"
960 "InstallMode\tTypical\n"
961 "Manufacturer\tWine\n"
962 "PIDTemplate\t###-#######\n"
963 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
964 "ProductLanguage\t1033\n"
965 "ProductName\tMSITEST\n"
966 "ProductVersion\t1.1.1\n"
967 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
968 "MSIFASTINSTALL\t1\n";
969
970static const char vp_custom_action_dat[] =
971 "Action\tType\tSource\tTarget\tISComments\n"
972 "s72\ti2\tS64\tS0\tS255\n"
973 "CustomAction\tAction\n"
974 "SetProductID1\t51\tProductID\t1\t\n"
975 "SetProductID2\t51\tProductID\t2\t\n"
976 "TestProductID1\t19\t\t\tHalts installation\n"
977 "TestProductID2\t19\t\t\tHalts installation\n";
978
979static const char vp_install_exec_seq_dat[] =
980 "Action\tCondition\tSequence\n"
981 "s72\tS255\tI2\n"
982 "InstallExecuteSequence\tAction\n"
983 "LaunchConditions\t\t100\n"
984 "CostInitialize\t\t800\n"
985 "FileCost\t\t900\n"
986 "CostFinalize\t\t1000\n"
987 "InstallValidate\t\t1400\n"
988 "InstallInitialize\t\t1500\n"
989 "SetProductID1\tSET_PRODUCT_ID=1\t3000\n"
990 "SetProductID2\tSET_PRODUCT_ID=2\t3100\n"
991 "ValidateProductID\t\t3200\n"
992 "InstallExecute\t\t3300\n"
993 "TestProductID1\tProductID=1\t3400\n"
994 "TestProductID2\tProductID=\"123-1234567\"\t3500\n"
995 "InstallFiles\t\t4000\n"
996 "InstallFinalize\t\t6000\n";
997
998static const char odbc_file_dat[] =
999 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1000 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1001 "File\tFile\n"
1002 "ODBCdriver.dll\todbc\tODBCdriver.dll\t1000\t\t\t8192\t1\n"
1003 "ODBCdriver2.dll\todbc\tODBCdriver2.dll\t1000\t\t\t8192\t2\n"
1004 "ODBCtranslator.dll\todbc\tODBCtranslator.dll\t1000\t\t\t8192\t3\n"
1005 "ODBCtranslator2.dll\todbc\tODBCtranslator2.dll\t1000\t\t\t8192\t4\n"
1006 "ODBCsetup.dll\todbc\tODBCsetup.dll\t1000\t\t\t8192\t5\n";
1007
1008static const char odbc_feature_dat[] =
1009 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1010 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1011 "Feature\tFeature\n"
1012 "odbc\t\t\todbc feature\t1\t2\tMSITESTDIR\t0\n";
1013
1014static const char odbc_feature_comp_dat[] =
1015 "Feature_\tComponent_\n"
1016 "s38\ts72\n"
1017 "FeatureComponents\tFeature_\tComponent_\n"
1018 "odbc\todbc64\n"
1019 "odbc\todbc\n";
1020
1021static const char odbc_component_dat[] =
1022 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1023 "s72\tS38\ts72\ti2\tS255\tS72\n"
1024 "Component\tComponent\n"
1025 "odbc64\t{B6F3E4AF-35D1-4B72-9044-989F03E20A43}\tMSITESTDIR\t256\tMsix64\tODBCdriver.dll\n"
1026 "odbc\t{B6F3E4AE-35D1-4B72-9044-989F03E20A43}\tMSITESTDIR\t0\t\tODBCdriver.dll\n";
1027
1028static const char odbc_driver_dat[] =
1029 "Driver\tComponent_\tDescription\tFile_\tFile_Setup\n"
1030 "s72\ts72\ts255\ts72\tS72\n"
1031 "ODBCDriver\tDriver\n"
1032 "64-bit driver\todbc64\tODBC test driver\tODBCdriver.dll\t\n"
1033 "64-bit driver2\todbc64\tODBC test driver2\tODBCdriver2.dll\tODBCsetup.dll\n"
1034 "ODBC test driver\todbc\tODBC test driver\tODBCdriver.dll\t\n"
1035 "ODBC test driver2\todbc\tODBC test driver2\tODBCdriver2.dll\tODBCsetup.dll\n";
1036
1037static const char odbc_translator_dat[] =
1038 "Translator\tComponent_\tDescription\tFile_\tFile_Setup\n"
1039 "s72\ts72\ts255\ts72\tS72\n"
1040 "ODBCTranslator\tTranslator\n"
1041 "ODBC test translator\todbc\tODBC test translator\tODBCtranslator.dll\t\n"
1042 "ODBC test translator2\todbc\tODBC test translator2\tODBCtranslator2.dll\tODBCsetup.dll\n";
1043
1044static const char odbc_datasource_dat[] =
1045 "DataSource\tComponent_\tDescription\tDriverDescription\tRegistration\n"
1046 "s72\ts72\ts255\ts255\ti2\n"
1047 "ODBCDataSource\tDataSource\n"
1048 "ODBC data source\todbc\tODBC data source\tODBC driver\t0\n";
1049
1050static const char odbc_install_exec_seq_dat[] =
1051 "Action\tCondition\tSequence\n"
1052 "s72\tS255\tI2\n"
1053 "InstallExecuteSequence\tAction\n"
1054 "LaunchConditions\t\t100\n"
1055 "CostInitialize\t\t800\n"
1056 "FileCost\t\t900\n"
1057 "CostFinalize\t\t1000\n"
1058 "InstallValidate\t\t1400\n"
1059 "InstallInitialize\t\t1500\n"
1060 "ProcessComponents\t\t1600\n"
1061 "InstallODBC\t\t3000\n"
1062 "io_immediate\tNOT REMOVE\t3001\n"
1063 "io_deferred\tNOT REMOVE\t3002\n"
1064 "RemoveODBC\t\t3100\n"
1065 "ro_immediate\tREMOVE\t3101\n"
1066 "ro_deferred\tREMOVE\t3102\n"
1067 "RemoveFiles\t\t3900\n"
1068 "InstallFiles\t\t4000\n"
1069 "RegisterProduct\t\t5000\n"
1070 "PublishFeatures\t\t5100\n"
1071 "PublishProduct\t\t5200\n"
1072 "UnpublishFeatures\t\t5300\n"
1073 "InstallFinalize\t\t6000\n";
1074
1075static const char odbc_custom_action_dat[] =
1076 "Action\tType\tSource\tTarget\n"
1077 "s72\ti2\tS64\tS0\n"
1078 "CustomAction\tAction\n"
1079 "io_immediate\t1\tcustom.dll\todbc_absent\n"
1080 "io_deferred\t1025\tcustom.dll\todbc_present\n"
1081 "ro_immediate\t1\tcustom.dll\todbc_present\n"
1082 "ro_deferred\t1025\tcustom.dll\todbc_absent\n";
1083
1084static const char odbc_media_dat[] =
1085 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
1086 "i2\ti4\tL64\tS255\tS32\tS72\n"
1087 "Media\tDiskId\n"
1088 "1\t5\t\t\tDISK1\t\n";
1089
1090static const char tl_file_dat[] =
1091 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1092 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1093 "File\tFile\n"
1094 "typelib.dll\ttypelib\ttypelib.dll\t1000\t\t\t8192\t1\n";
1095
1096static const char tl_feature_dat[] =
1097 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1098 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1099 "Feature\tFeature\n"
1100 "typelib\t\t\ttypelib feature\t1\t2\tMSITESTDIR\t0\n";
1101
1102static const char tl_feature_comp_dat[] =
1103 "Feature_\tComponent_\n"
1104 "s38\ts72\n"
1105 "FeatureComponents\tFeature_\tComponent_\n"
1106 "typelib\ttypelib\n";
1107
1108static const char tl_component_dat[] =
1109 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1110 "s72\tS38\ts72\ti2\tS255\tS72\n"
1111 "Component\tComponent\n"
1112 "typelib\t{BB4C26FD-89D8-4E49-AF1C-DB4DCB5BF1B0}\tMSITESTDIR\t0\t\ttypelib.dll\n";
1113
1114static const char tl_typelib_dat[] =
1115 "LibID\tLanguage\tComponent_\tVersion\tDescription\tDirectory_\tFeature_\tCost\n"
1116 "s38\ti2\ts72\tI4\tL128\tS72\ts38\tI4\n"
1117 "TypeLib\tLibID\tLanguage\tComponent_\n"
1118 "{EAC5166A-9734-4D91-878F-1DD02304C66C}\t0\ttypelib\t1793\t\tMSITESTDIR\ttypelib\t\n";
1119
1120static const char tl_install_exec_seq_dat[] =
1121 "Action\tCondition\tSequence\n"
1122 "s72\tS255\tI2\n"
1123 "InstallExecuteSequence\tAction\n"
1124 "LaunchConditions\t\t100\n"
1125 "CostInitialize\t\t800\n"
1126 "FileCost\t\t900\n"
1127 "CostFinalize\t\t1000\n"
1128 "InstallValidate\t\t1400\n"
1129 "InstallInitialize\t\t1500\n"
1130 "ProcessComponents\t\t1600\n"
1131 "UnregisterTypeLibraries\t\t3100\n"
1132 "ut_immediate\tREMOVE\t3101\n"
1133 "ut_deferred\tREMOVE\t3102\n"
1134 "RemoveFiles\t\t3200\n"
1135 "InstallFiles\t\t3300\n"
1136 "RegisterTypeLibraries\t\t3400\n"
1137 "rt_immediate\tNOT REMOVE\t3401\n"
1138 "rt_deferred\tNOT REMOVE\t3402\n"
1139 "RegisterProduct\t\t5100\n"
1140 "PublishFeatures\t\t5200\n"
1141 "PublishProduct\t\t5300\n"
1142 "UnpublishFeatures\t\t5400\n"
1143 "InstallFinalize\t\t6000\n";
1144
1145static const char tl_custom_action_dat[] =
1146 "Action\tType\tSource\tTarget\n"
1147 "s72\ti2\tS64\tS0\n"
1148 "CustomAction\tAction\n"
1149 "rt_immediate\t1\tcustom.dll\ttl_absent\n"
1150 "rt_deferred\t1025\tcustom.dll\ttl_present\n"
1151 "ut_immediate\t1\tcustom.dll\ttl_present\n"
1152 "ut_deferred\t1025\tcustom.dll\ttl_absent\n";
1153
1154static const char crs_file_dat[] =
1155 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1156 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1157 "File\tFile\n"
1158 "target.txt\tshortcut\ttarget.txt\t1000\t\t\t8192\t1\n";
1159
1160static const char crs_feature_dat[] =
1161 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1162 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1163 "Feature\tFeature\n"
1164 "shortcut\t\t\tshortcut feature\t1\t2\tMSITESTDIR\t0\n";
1165
1166static const char crs_feature_comp_dat[] =
1167 "Feature_\tComponent_\n"
1168 "s38\ts72\n"
1169 "FeatureComponents\tFeature_\tComponent_\n"
1170 "shortcut\tshortcut\n";
1171
1172static const char crs_component_dat[] =
1173 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1174 "s72\tS38\ts72\ti2\tS255\tS72\n"
1175 "Component\tComponent\n"
1176 "shortcut\t{5D20E3C6-7206-498F-AC28-87AF2F9AD4CC}\tMSITESTDIR\t0\t\ttarget.txt\n";
1177
1178static const char crs_shortcut_dat[] =
1179 "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"
1180 "s72\ts72\tl128\ts72\ts72\tL255\tL255\tI2\tS72\tI2\tI2\tS72\n"
1181 "Shortcut\tShortcut\n"
1182 "shortcut\tMSITESTDIR\tshortcut\tshortcut\t[MSITESTDIR]target.txt\t\t\t\t\t\t\t\n";
1183
1184static const char crs_install_exec_seq_dat[] =
1185 "Action\tCondition\tSequence\n"
1186 "s72\tS255\tI2\n"
1187 "InstallExecuteSequence\tAction\n"
1188 "LaunchConditions\t\t100\n"
1189 "CostInitialize\t\t800\n"
1190 "FileCost\t\t900\n"
1191 "CostFinalize\t\t1000\n"
1192 "InstallValidate\t\t1400\n"
1193 "InstallInitialize\t\t1500\n"
1194 "ProcessComponents\t\t1600\n"
1195 "RemoveFiles\t\t1700\n"
1196 "InstallFiles\t\t2000\n"
1197 "RemoveShortcuts\t\t3000\n"
1198 "rs_immediate\tREMOVE\t3001\n"
1199 "rs_deferred\tREMOVE\t3002\n"
1200 "CreateShortcuts\t\t3100\n"
1201 "cs_immediate\tNOT REMOVE\t3101\n"
1202 "cs_deferred\tNOT REMOVE\t3102\n"
1203 "RegisterProduct\t\t5000\n"
1204 "PublishFeatures\t\t5100\n"
1205 "PublishProduct\t\t5200\n"
1206 "UnpublishFeatures\t\t5300\n"
1207 "InstallFinalize\t\t6000\n";
1208
1209static const char crs_custom_action_dat[] =
1210 "Action\tType\tSource\tTarget\n"
1211 "s72\ti2\tS64\tS0\n"
1212 "CustomAction\tAction\n"
1213 "cs_immediate\t1\tcustom.dll\tcrs_absent\n"
1214 "cs_deferred\t1025\tcustom.dll\tcrs_present\n"
1215 "rs_immediate\t1\tcustom.dll\tcrs_present\n"
1216 "rs_deferred\t1025\tcustom.dll\tcrs_absent\n";
1217
1218static const char pub_file_dat[] =
1219 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1220 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1221 "File\tFile\n"
1222 "english.txt\tpublish\tenglish.txt\t1000\t\t\t8192\t1\n";
1223
1224static const char pub_feature_dat[] =
1225 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1226 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1227 "Feature\tFeature\n"
1228 "publish\t\t\tpublish feature\t1\t2\tMSITESTDIR\t0\n";
1229
1230static const char pub_feature_comp_dat[] =
1231 "Feature_\tComponent_\n"
1232 "s38\ts72\n"
1233 "FeatureComponents\tFeature_\tComponent_\n"
1234 "publish\tpublish\n";
1235
1236static const char pub_component_dat[] =
1237 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1238 "s72\tS38\ts72\ti2\tS255\tS72\n"
1239 "Component\tComponent\n"
1240 "publish\t{B4EA0ACF-6238-426E-9C6D-7869F0F9C768}\tMSITESTDIR\t0\t\tenglish.txt\n";
1241
1242static const char pub_publish_component_dat[] =
1243 "ComponentId\tQualifier\tComponent_\tAppData\tFeature_\n"
1244 "s38\ts255\ts72\tL255\ts38\n"
1245 "PublishComponent\tComponentId\tQualifier\tComponent_\n"
1246 "{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}\tenglish.txt\tpublish\t\tpublish\n";
1247
1248static const char pub_install_exec_seq_dat[] =
1249 "Action\tCondition\tSequence\n"
1250 "s72\tS255\tI2\n"
1251 "InstallExecuteSequence\tAction\n"
1252 "LaunchConditions\t\t100\n"
1253 "CostInitialize\t\t800\n"
1254 "FileCost\t\t900\n"
1255 "CostFinalize\t\t1000\n"
1256 "InstallValidate\t\t1400\n"
1257 "InstallInitialize\t\t1500\n"
1258 "ProcessComponents\t\t1600\n"
1259 "RemoveFiles\t\t1700\n"
1260 "InstallFiles\t\t2000\n"
1261 "PublishComponents\t\t3000\n"
1262 "pub_immediate\tNOT REMOVE\t3001\n"
1263 "pub_deferred\tNOT REMOVE\t3002\n"
1264 "UnpublishComponents\t\t3100\n"
1265 "unp_immediate\tREMOVE\t3101\n"
1266 "unp_deferred\tREMOVE\t3102\n"
1267 "RegisterProduct\t\t5000\n"
1268 "PublishFeatures\t\t5100\n"
1269 "PublishProduct\t\t5200\n"
1270 "UnpublishFeatures\t\t5300\n"
1271 "InstallFinalize\t\t6000\n";
1272
1273static const char pub_custom_action_dat[] =
1274 "Action\tType\tSource\tTarget\n"
1275 "s72\ti2\tS64\tS0\n"
1276 "CustomAction\tAction\n"
1277 "pub_immediate\t1\tcustom.dll\tpub_absent\n"
1278 "pub_deferred\t1025\tcustom.dll\tpub_present\n"
1279 "unp_immediate\t1\tcustom.dll\tpub_present\n"
1280 "unp_deferred\t1025\tcustom.dll\tpub_absent\n";
1281
1282static const char rd_file_dat[] =
1283 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1284 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1285 "File\tFile\n"
1286 "original.txt\tduplicate\toriginal.txt\t1000\t\t\t8192\t1\n"
1287 "original2.txt\tduplicate\toriginal2.txt\t1000\t\t\t8192\t2\n"
1288 "original3.txt\tduplicate2\toriginal3.txt\t1000\t\t\t8192\t3\n";
1289
1290static const char rd_feature_dat[] =
1291 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1292 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1293 "Feature\tFeature\n"
1294 "duplicate\t\t\tduplicate feature\t1\t2\tMSITESTDIR\t0\n";
1295
1296static const char rd_feature_comp_dat[] =
1297 "Feature_\tComponent_\n"
1298 "s38\ts72\n"
1299 "FeatureComponents\tFeature_\tComponent_\n"
1300 "duplicate\tduplicate\n";
1301
1302static const char rd_component_dat[] =
1303 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1304 "s72\tS38\ts72\ti2\tS255\tS72\n"
1305 "Component\tComponent\n"
1306 "duplicate\t{EB45D06A-ADFE-44E3-8D41-B7DE150E41AD}\tMSITESTDIR\t0\t\toriginal.txt\n"
1307 "duplicate2\t{B8BA60E0-B2E9-488E-9D0E-E60F25F04F97}\tMSITESTDIR\t0\tDUPLICATE2=1\toriginal3.txt\n";
1308
1309static const char rd_duplicate_file_dat[] =
1310 "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n"
1311 "s72\ts72\ts72\tS255\tS72\n"
1312 "DuplicateFile\tFileKey\n"
1313 "duplicate\tduplicate\toriginal.txt\tduplicate.txt\t\n"
1314 "duplicate2\tduplicate\toriginal2.txt\t\tMSITESTDIR\n"
1315 "duplicate3\tduplicate2\toriginal3.txt\tduplicate2.txt\t\n";
1316
1317static const char rd_install_exec_seq_dat[] =
1318 "Action\tCondition\tSequence\n"
1319 "s72\tS255\tI2\n"
1320 "InstallExecuteSequence\tAction\n"
1321 "LaunchConditions\t\t100\n"
1322 "CostInitialize\t\t800\n"
1323 "FileCost\t\t900\n"
1324 "CostFinalize\t\t1000\n"
1325 "InstallValidate\t\t1400\n"
1326 "InstallInitialize\t\t1500\n"
1327 "ProcessComponents\t\t1600\n"
1328 "RemoveDuplicateFiles\t\t1900\n"
1329 "rd_immediate\tREMOVE\t1901\n"
1330 "rd_deferred\tREMOVE\t1902\n"
1331 "InstallFiles\t\t2000\n"
1332 "DuplicateFiles\t\t2100\n"
1333 "df_immediate\tNOT REMOVE\t2101\n"
1334 "df_deferred\tNOT REMOVE\t2102\n"
1335 "RegisterProduct\t\t5000\n"
1336 "PublishFeatures\t\t5100\n"
1337 "PublishProduct\t\t5200\n"
1338 "UnpublishFeatures\t\t5300\n"
1339 "InstallFinalize\t\t6000\n";
1340
1341static const char rd_custom_action_dat[] =
1342 "Action\tType\tSource\tTarget\n"
1343 "s72\ti2\tS64\tS0\n"
1344 "CustomAction\tAction\n"
1345 "df_immediate\t1\tcustom.dll\trd_absent\n"
1346 "df_deferred\t1025\tcustom.dll\trd_present\n"
1347 "rd_immediate\t1\tcustom.dll\trd_present\n"
1348 "rd_deferred\t1025\tcustom.dll\trd_absent\n";
1349
1350static const char frp_file_dat[] =
1351 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1352 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1353 "File\tFile\n"
1354 "product.txt\tproduct\tproduct.txt\t1000\t\t\t8192\t1\n";
1355
1356static const char frp_feature_dat[] =
1357 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1358 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1359 "Feature\tFeature\n"
1360 "product\t\t\tproduct feature\t1\t2\tMSITESTDIR\t0\n";
1361
1362static const char frp_feature_comp_dat[] =
1363 "Feature_\tComponent_\n"
1364 "s38\ts72\n"
1365 "FeatureComponents\tFeature_\tComponent_\n"
1366 "product\tproduct\n";
1367
1368static const char frp_component_dat[] =
1369 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1370 "s72\tS38\ts72\ti2\tS255\tS72\n"
1371 "Component\tComponent\n"
1372 "product\t{44725EE0-EEA8-40BD-8162-A48224A2FEA1}\tMSITESTDIR\t0\t\tproduct.txt\n";
1373
1374static const char frp_custom_action_dat[] =
1375 "Action\tType\tSource\tTarget\tISComments\n"
1376 "s72\ti2\tS64\tS0\tS255\n"
1377 "CustomAction\tAction\n"
1378 "TestProp\t19\t\t\tPROP set\n";
1379
1380static const char frp_upgrade_dat[] =
1381 "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n"
1382 "s38\tS20\tS20\tS255\ti4\tS255\ts72\n"
1383 "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n"
1384 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}\t1.1.1\t2.2.2\t\t768\t\tPROP\n";
1385
1386static const char frp_install_exec_seq_dat[] =
1387 "Action\tCondition\tSequence\n"
1388 "s72\tS255\tI2\n"
1389 "InstallExecuteSequence\tAction\n"
1390 "FindRelatedProducts\t\t50\n"
1391 "TestProp\tPROP AND NOT REMOVE\t51\n"
1392 "LaunchConditions\t\t100\n"
1393 "CostInitialize\t\t800\n"
1394 "FileCost\t\t900\n"
1395 "CostFinalize\t\t1000\n"
1396 "InstallValidate\t\t1400\n"
1397 "InstallInitialize\t\t1500\n"
1398 "ProcessComponents\t\t1600\n"
1399 "RemoveFiles\t\t1700\n"
1400 "InstallFiles\t\t2000\n"
1401 "RegisterProduct\t\t5000\n"
1402 "PublishFeatures\t\t5100\n"
1403 "PublishProduct\t\t5200\n"
1404 "UnpublishFeatures\t\t5300\n"
1405 "InstallFinalize\t\t6000\n";
1406
1407static const char ini_file_dat[] =
1408 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1409 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1410 "File\tFile\n"
1411 "inifile.txt\tinifile\tinifile.txt\t1000\t\t\t8192\t1\n";
1412
1413static const char ini_feature_dat[] =
1414 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1415 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1416 "Feature\tFeature\n"
1417 "inifile\t\t\tinifile feature\t1\t2\tMSITESTDIR\t0\n";
1418
1419static const char ini_feature_comp_dat[] =
1420 "Feature_\tComponent_\n"
1421 "s38\ts72\n"
1422 "FeatureComponents\tFeature_\tComponent_\n"
1423 "inifile\tinifile\n";
1424
1425static const char ini_component_dat[] =
1426 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1427 "s72\tS38\ts72\ti2\tS255\tS72\n"
1428 "Component\tComponent\n"
1429 "inifile\t{A0F15705-4F57-4437-88C4-6C8B37ACC6DE}\tMSITESTDIR\t0\t\tinifile.txt\n";
1430
1431static const char ini_ini_file_dat[] =
1432 "IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"
1433 "s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n"
1434 "IniFile\tIniFile\n"
1435 "inifile1\ttest.ini\tMSITESTDIR\tsection1\tkey1\tvalue1\t0\tinifile\n";
1436
1437static const char ini_remove_ini_file_dat[] =
1438 "RemoveIniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"
1439 "s72\tl255\tS72\tl96\tl128\tL255\ti2\ts72\n"
1440 "RemoveIniFile\tRemoveIniFile\n"
1441 "inifile1\ttest.ini\tMSITESTDIR\tsectionA\tkeyA\tvalueA\t2\tinifile\n";
1442
1443static const char ini_install_exec_seq_dat[] =
1444 "Action\tCondition\tSequence\n"
1445 "s72\tS255\tI2\n"
1446 "InstallExecuteSequence\tAction\n"
1447 "LaunchConditions\t\t100\n"
1448 "CostInitialize\t\t800\n"
1449 "FileCost\t\t900\n"
1450 "CostFinalize\t\t1000\n"
1451 "InstallValidate\t\t1400\n"
1452 "InstallInitialize\t\t1500\n"
1453 "ProcessComponents\t\t1600\n"
1454 "RemoveFiles\t\t1700\n"
1455 "InstallFiles\t\t2000\n"
1456 "RemoveIniValues\t\t3000\n"
1457 "riv_immediate\tREMOVE\t3001\n"
1458 "riv_deferred\tREMOVE\t3002\n"
1459 "WriteIniValues\t\t3100\n"
1460 "wiv_immediate\tNOT REMOVE\t3101\n"
1461 "wiv_deferred\tNOT REMOVE\t3102\n"
1462 "RegisterProduct\t\t5000\n"
1463 "PublishFeatures\t\t5100\n"
1464 "PublishProduct\t\t5200\n"
1465 "UnpublishFeatures\t\t5300\n"
1466 "InstallFinalize\t\t6000\n";
1467
1468static const char ini_custom_action_dat[] =
1469 "Action\tType\tSource\tTarget\n"
1470 "s72\ti2\tS64\tS0\n"
1471 "CustomAction\tAction\n"
1472 "wiv_immediate\t1\tcustom.dll\tini_absent\n"
1473 "wiv_deferred\t1025\tcustom.dll\tini_present\n"
1474 "riv_immediate\t1\tcustom.dll\tini_present\n"
1475 "riv_deferred\t1025\tcustom.dll\tini_absent\n";
1476
1477static const char rci_file_dat[] =
1478 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1479 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1480 "File\tFile\n"
1481 "class.txt\tclass\tclass.txt\t1000\t\t\t8192\t1\n";
1482
1483static const char rci_feature_dat[] =
1484 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1485 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1486 "Feature\tFeature\n"
1487 "class\t\t\tclass feature\t1\t2\tMSITESTDIR\t0\n";
1488
1489static const char rci_feature_comp_dat[] =
1490 "Feature_\tComponent_\n"
1491 "s38\ts72\n"
1492 "FeatureComponents\tFeature_\tComponent_\n"
1493 "class\tclass\n";
1494
1495static const char rci_component_dat[] =
1496 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1497 "s72\tS38\ts72\ti2\tS255\tS72\n"
1498 "Component\tComponent\n"
1499 "class\t{89A98345-F8A1-422E-A48B-0250B5809F2D}\tMSITESTDIR\t0\t\tclass.txt\n";
1500
1501static const char rci_appid_dat[] =
1502 "AppId\tRemoteServerName\tLocalService\tServiceParameters\tDllSurrogate\tActivateAtStorage\tRunAsInteractiveUser\n"
1503 "s38\tS255\tS255\tS255\tS255\tI2\tI2\n"
1504 "AppId\tAppId\n"
1505 "{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\t\t\t\t\t\t\n";
1506
1507static const char rci_class_dat[] =
1508 "CLSID\tContext\tComponent_\tProgId_Default\tDescription\tAppId_\tFileTypeMask\tIcon_\tIconIndex\tDefInprocHandler\tArgument\tFeature_\tAttributes\n"
1509 "s38\ts32\ts72\tS255\tL255\tS38\tS255\tS72\tI2\tS32\tS255\ts38\tI2\n"
1510 "Class\tCLSID\tContext\tComponent_\n"
1511 "{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tLocalServer\tclass\t\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tclass\t\n";
1512
1513static const char rci_install_exec_seq_dat[] =
1514 "Action\tCondition\tSequence\n"
1515 "s72\tS255\tI2\n"
1516 "InstallExecuteSequence\tAction\n"
1517 "LaunchConditions\t\t100\n"
1518 "CostInitialize\t\t800\n"
1519 "FileCost\t\t900\n"
1520 "CostFinalize\t\t1000\n"
1521 "InstallValidate\t\t1400\n"
1522 "InstallInitialize\t\t1500\n"
1523 "ProcessComponents\t\t1600\n"
1524 "RemoveFiles\t\t1700\n"
1525 "InstallFiles\t\t2000\n"
1526 "UnregisterClassInfo\t\t3000\n"
1527 "uci_immediate\tREMOVE\t3001\n"
1528 "uci_deferred\tREMOVE\t3002\n"
1529 "RegisterClassInfo\t\t4000\n"
1530 "rci_immediate\tNOT REMOVE\t4001\n"
1531 "rci_deferred\tNOT REMOVE\t4002\n"
1532 "RegisterProduct\t\t5000\n"
1533 "PublishFeatures\t\t5100\n"
1534 "PublishProduct\t\t5200\n"
1535 "UnpublishFeatures\t\t5300\n"
1536 "InstallFinalize\t\t6000\n";
1537
1538static const char rci_custom_action_dat[] =
1539 "Action\tType\tSource\tTarget\n"
1540 "s72\ti2\tS64\tS0\n"
1541 "CustomAction\tAction\n"
1542 "rci_immediate\t1\tcustom.dll\trci_absent\n"
1543 "rci_deferred\t1025\tcustom.dll\trci_present\n"
1544 "uci_immediate\t1\tcustom.dll\trci_present\n"
1545 "uci_deferred\t1025\tcustom.dll\trci_absent\n";
1546
1547static const char rei_file_dat[] =
1548 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1549 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1550 "File\tFile\n"
1551 "extension.txt\textension\textension.txt\t1000\t\t\t8192\t1\n";
1552
1553static const char rei_feature_dat[] =
1554 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1555 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1556 "Feature\tFeature\n"
1557 "extension\t\t\textension feature\t1\t2\tMSITESTDIR\t0\n";
1558
1559static const char rei_feature_comp_dat[] =
1560 "Feature_\tComponent_\n"
1561 "s38\ts72\n"
1562 "FeatureComponents\tFeature_\tComponent_\n"
1563 "extension\textension\n";
1564
1565static const char rei_component_dat[] =
1566 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1567 "s72\tS38\ts72\ti2\tS255\tS72\n"
1568 "Component\tComponent\n"
1569 "extension\t{9A3060D4-60BA-4A82-AB55-9FB148AD013C}\tMSITESTDIR\t0\t\textension.txt\n";
1570
1571static const char rei_extension_dat[] =
1572 "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n"
1573 "s255\ts72\tS255\tS64\ts38\n"
1574 "Extension\tExtension\tComponent_\n"
1575 "extension\textension\tProg.Id.1\t\textension\n";
1576
1577static const char rei_verb_dat[] =
1578 "Extension_\tVerb\tSequence\tCommand\tArgument\n"
1579 "s255\ts32\tI2\tL255\tL255\n"
1580 "Verb\tExtension_\tVerb\n"
1581 "extension\tOpen\t1\t&Open\t/argument\n";
1582
1583static const char rei_progid_dat[] =
1584 "ProgId\tProgId_Parent\tClass_\tDescription\tIcon_\tIconIndex\n"
1585 "s255\tS255\tS38\tL255\tS72\tI2\n"
1586 "ProgId\tProgId\n"
1587 "Prog.Id.1\t\t\tdescription\t\t\n";
1588
1589static const char rei_install_exec_seq_dat[] =
1590 "Action\tCondition\tSequence\n"
1591 "s72\tS255\tI2\n"
1592 "InstallExecuteSequence\tAction\n"
1593 "LaunchConditions\t\t100\n"
1594 "CostInitialize\t\t800\n"
1595 "FileCost\t\t900\n"
1596 "CostFinalize\t\t1000\n"
1597 "InstallValidate\t\t1400\n"
1598 "InstallInitialize\t\t1500\n"
1599 "ProcessComponents\t\t1600\n"
1600 "RemoveFiles\t\t1700\n"
1601 "InstallFiles\t\t2000\n"
1602 "UnregisterExtensionInfo\t\t3000\n"
1603 "uei_immediate\tREMOVE\t3001\n"
1604 "uei_deferred\tREMOVE\t3002\n"
1605 "RegisterExtensionInfo\t\t4000\n"
1606 "rei_immediate\tNOT REMOVE\t4001\n"
1607 "rei_deferred\tNOT REMOVE\t4002\n"
1608 "RegisterProduct\t\t5000\n"
1609 "PublishFeatures\t\t5100\n"
1610 "PublishProduct\t\t5200\n"
1611 "UnpublishFeatures\t\t5300\n"
1612 "InstallFinalize\t\t6000\n";
1613
1614static const char rei_custom_action_dat[] =
1615 "Action\tType\tSource\tTarget\n"
1616 "s72\ti2\tS64\tS0\n"
1617 "CustomAction\tAction\n"
1618 "rei_immediate\t1\tcustom.dll\trei_absent\n"
1619 "rei_deferred\t1025\tcustom.dll\trei_present\n"
1620 "uei_immediate\t1\tcustom.dll\trei_present\n"
1621 "uei_deferred\t1025\tcustom.dll\trei_absent\n";
1622
1623static const char rpi_file_dat[] =
1624 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1625 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1626 "File\tFile\n"
1627 "progid.txt\tprogid\tprogid.txt\t1000\t\t\t8192\t1\n";
1628
1629static const char rpi_feature_dat[] =
1630 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1631 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1632 "Feature\tFeature\n"
1633 "progid\t\t\tprogid feature\t1\t2\tMSITESTDIR\t0\n";
1634
1635static const char rpi_feature_comp_dat[] =
1636 "Feature_\tComponent_\n"
1637 "s38\ts72\n"
1638 "FeatureComponents\tFeature_\tComponent_\n"
1639 "progid\tprogid\n";
1640
1641static const char rpi_component_dat[] =
1642 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1643 "s72\tS38\ts72\ti2\tS255\tS72\n"
1644 "Component\tComponent\n"
1645 "progid\t{89A98345-F8A1-422E-A48B-0250B5809F2D}\tMSITESTDIR\t0\t\tprogid.txt\n";
1646
1647static const char rpi_appid_dat[] =
1648 "AppId\tRemoteServerName\tLocalService\tServiceParameters\tDllSurrogate\tActivateAtStorage\tRunAsInteractiveUser\n"
1649 "s38\tS255\tS255\tS255\tS255\tI2\tI2\n"
1650 "AppId\tAppId\n"
1651 "{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\t\t\t\t\t\t\n";
1652
1653static const char rpi_class_dat[] =
1654 "CLSID\tContext\tComponent_\tProgId_Default\tDescription\tAppId_\tFileTypeMask\tIcon_\tIconIndex\tDefInprocHandler\tArgument\tFeature_\tAttributes\n"
1655 "s38\ts32\ts72\tS255\tL255\tS38\tS255\tS72\tI2\tS32\tS255\ts38\tI2\n"
1656 "Class\tCLSID\tContext\tComponent_\n"
1657 "{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tLocalServer\tprogid\tWinetest.Class.1\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tprogid\t\n"
1658 "{904E6BC9-F57F-4412-B460-D40DE2F256E2}\tLocalServer\tprogid\tWinetest.VerClass\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tprogid\t\n"
1659 "{57C413FB-CA02-498A-81F6-7E769BDB7C97}\tLocalServer\tprogid\t\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tprogid\t\n";
1660
1661static const char rpi_extension_dat[] =
1662 "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n"
1663 "s255\ts72\tS255\tS64\ts38\n"
1664 "Extension\tExtension\tComponent_\n"
1665 "winetest\tprogid\tWinetest.Extension\t\tprogid\n";
1666
1667static const char rpi_verb_dat[] =
1668 "Extension_\tVerb\tSequence\tCommand\tArgument\n"
1669 "s255\ts32\tI2\tL255\tL255\n"
1670 "Verb\tExtension_\tVerb\n"
1671 "winetest\tOpen\t1\t&Open\t/argument\n";
1672
1673static const char rpi_progid_dat[] =
1674 "ProgId\tProgId_Parent\tClass_\tDescription\tIcon_\tIconIndex\n"
1675 "s255\tS255\tS38\tL255\tS72\tI2\n"
1676 "ProgId\tProgId\n"
1677 "Winetest.Class.1\t\t{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tdescription\t\t\n"
1678 "Winetest.Class\tWinetest.Class.1\t\tdescription\t\t\n"
1679 "Winetest.Class.2\t\t{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tdescription\t\t\n"
1680 "Winetest.VerClass.1\t\t{904E6BC9-F57F-4412-B460-D40DE2F256E2}\tdescription\t\t\n"
1681 "Winetest.VerClass\tWinetest.VerClass.1\t\tdescription\t\t\n"
1682 "Winetest.NoProgIdClass.1\t\t{57C413FB-CA02-498A-81F6-7E769BDB7C97}\tdescription\t\t\n"
1683 "Winetest.NoProgIdClass\tWinetest.NoProgIdClass.1\t\tdescription\t\t\n"
1684 "Winetest.Orphaned\t\t\tdescription\t\t\n"
1685 "Winetest.Orphaned2\t\t\tdescription\t\t\n"
1686 "Winetest.Extension\t\t\tdescription\t\t\n";
1687
1688static const char rpi_install_exec_seq_dat[] =
1689 "Action\tCondition\tSequence\n"
1690 "s72\tS255\tI2\n"
1691 "InstallExecuteSequence\tAction\n"
1692 "LaunchConditions\t\t100\n"
1693 "CostInitialize\t\t800\n"
1694 "FileCost\t\t900\n"
1695 "CostFinalize\t\t1000\n"
1696 "InstallValidate\t\t1400\n"
1697 "InstallInitialize\t\t1500\n"
1698 "ProcessComponents\t\t1600\n"
1699 "RemoveFiles\t\t1700\n"
1700 "UnregisterClassInfo\t\t3000\n"
1701 "UnregisterExtensionInfo\t\t3200\n"
1702 "UnregisterProgIdInfo\t\t3400\n"
1703 "upi_immediate\tREMOVE\t3401\n"
1704 "upi_deferred\tREMOVE\t3402\n"
1705 "InstallFiles\t\t3600\n"
1706 "RegisterClassInfo\t\t4000\n"
1707 "RegisterExtensionInfo\t\t4200\n"
1708 "RegisterProgIdInfo\t\t4400\n"
1709 "rpi_immediate\tNOT REMOVE\t4401\n"
1710 "rpi_deferred\tNOT REMOVE\t4402\n"
1711 "RegisterProduct\t\t5000\n"
1712 "PublishFeatures\t\t5100\n"
1713 "PublishProduct\t\t5200\n"
1714 "UnpublishFeatures\t\t5300\n"
1715 "InstallFinalize\t\t6000\n";
1716
1717static const char rpi_custom_action_dat[] =
1718 "Action\tType\tSource\tTarget\n"
1719 "s72\ti2\tS64\tS0\n"
1720 "CustomAction\tAction\n"
1721 "rpi_immediate\t1\tcustom.dll\trpi_absent\n"
1722 "rpi_deferred\t1025\tcustom.dll\trpi_present\n"
1723 "upi_immediate\t1\tcustom.dll\trpi_present\n"
1724 "upi_deferred\t1025\tcustom.dll\trpi_absent\n";
1725
1726static const char rmi_file_dat[] =
1727 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1728 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1729 "File\tFile\n"
1730 "mime.txt\tmime\tmime.txt\t1000\t\t\t8192\t1\n";
1731
1732static const char rmi_feature_dat[] =
1733 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1734 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1735 "Feature\tFeature\n"
1736 "mime\t\t\tmime feature\t1\t2\tMSITESTDIR\t0\n";
1737
1738static const char rmi_feature_comp_dat[] =
1739 "Feature_\tComponent_\n"
1740 "s38\ts72\n"
1741 "FeatureComponents\tFeature_\tComponent_\n"
1742 "mime\tmime\n";
1743
1744static const char rmi_component_dat[] =
1745 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1746 "s72\tS38\ts72\ti2\tS255\tS72\n"
1747 "Component\tComponent\n"
1748 "mime\t{A1D630CE-13A7-4882-AFDD-148E2BBAFC6D}\tMSITESTDIR\t0\t\tmime.txt\n";
1749
1750static const char rmi_extension_dat[] =
1751 "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n"
1752 "s255\ts72\tS255\tS64\ts38\n"
1753 "Extension\tExtension\tComponent_\n"
1754 "mime\tmime\t\tmime/type\tmime\n";
1755
1756static const char rmi_verb_dat[] =
1757 "Extension_\tVerb\tSequence\tCommand\tArgument\n"
1758 "s255\ts32\tI2\tL255\tL255\n"
1759 "Verb\tExtension_\tVerb\n"
1760 "mime\tOpen\t1\t&Open\t/argument\n";
1761
1762static const char rmi_mime_dat[] =
1763 "ContentType\tExtension_\tCLSID\n"
1764 "s64\ts255\tS38\n"
1765 "MIME\tContentType\n"
1766 "mime/type\tmime\t\n";
1767
1768static const char rmi_install_exec_seq_dat[] =
1769 "Action\tCondition\tSequence\n"
1770 "s72\tS255\tI2\n"
1771 "InstallExecuteSequence\tAction\n"
1772 "LaunchConditions\t\t100\n"
1773 "CostInitialize\t\t800\n"
1774 "FileCost\t\t900\n"
1775 "CostFinalize\t\t1000\n"
1776 "InstallValidate\t\t1400\n"
1777 "InstallInitialize\t\t1500\n"
1778 "ProcessComponents\t\t1600\n"
1779 "RemoveFiles\t\t1700\n"
1780 "InstallFiles\t\t2000\n"
1781 "UnregisterExtensionInfo\t\t3000\n"
1782 "UnregisterMIMEInfo\t\t3500\n"
1783 "umi_immediate\tREMOVE\t3501\n"
1784 "umi_deferred\tREMOVE\t3502\n"
1785 "RegisterExtensionInfo\t\t4000\n"
1786 "RegisterMIMEInfo\t\t4500\n"
1787 "rmi_immediate\tNOT REMOVE\t4501\n"
1788 "rmi_deferred\tNOT REMOVE\t4502\n"
1789 "RegisterProduct\t\t5000\n"
1790 "PublishFeatures\t\t5100\n"
1791 "PublishProduct\t\t5200\n"
1792 "UnpublishFeatures\t\t5300\n"
1793 "InstallFinalize\t\t6000\n";
1794
1795static const char rmi_custom_action_dat[] =
1796 "Action\tType\tSource\tTarget\n"
1797 "s72\ti2\tS64\tS0\n"
1798 "CustomAction\tAction\n"
1799 "rmi_immediate\t1\tcustom.dll\trmi_absent\n"
1800 "rmi_deferred\t1025\tcustom.dll\trmi_present\n"
1801 "umi_immediate\t1\tcustom.dll\trmi_present\n"
1802 "umi_deferred\t1025\tcustom.dll\trmi_absent\n";
1803
1804static const char pa_file_dat[] =
1805 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1806 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1807 "File\tFile\n"
1808 "fake_local.txt\tfake_local\tfake_local.txt\t1000\t\t\t8192\t1\n"
1809 "win32.txt\twin32\twin32.txt\t1000\t\t\t8192\t1\n"
1810 "manifest.txt\twin32\tmanifest.txt\t1000\t\t\t8192\t1\n"
1811 "win32_local.txt\twin32_local\twin32_local.txt\t1000\t\t\t8192\t1\n"
1812 "manifest_local.txt\twin32_local\tmanifest_local.txt\t1000\t\t\t8192\t1\n"
1813 "dotnet.txt\tdotnet\tdotnet.txt\t1000\t\t\t8192\t1\n"
1814 "dotnet_local.txt\tdotnet_local\tdotnet_local.txt\t1000\t\t\t8192\t1\n"
1815 "application_win32.txt\twin32_local\tapplication_win32.txt\t1000\t\t\t8192\t1\n"
1816 "application_dotnet.txt\tdotnet_local\tapplication_dotnet.txt\t1000\t\t\t8192\t1\n";
1817
1818static const char pa_feature_dat[] =
1819 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1820 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1821 "Feature\tFeature\n"
1822 "assembly\t\t\tassembly feature\t1\t2\tMSITESTDIR\t0\n";
1823
1824static const char pa_feature_comp_dat[] =
1825 "Feature_\tComponent_\n"
1826 "s38\ts72\n"
1827 "FeatureComponents\tFeature_\tComponent_\n"
1828 "assembly\tfake_local\n"
1829 "assembly\twin32\n"
1830 "assembly\twin32_local\n"
1831 "assembly\tdotnet\n"
1832 "assembly\tdotnet_local\n";
1833
1834static const char pa_component_dat[] =
1835 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1836 "s72\tS38\ts72\ti2\tS255\tS72\n"
1837 "Component\tComponent\n"
1838 "fake_local\t{F515549D-7E61-425D-AAC1-9BEF2E066D06}\tMSITESTDIR\t0\t\tfake_local.txt\n"
1839 "win32\t{F515549E-7E61-425D-AAC1-9BEF2E066D06}\tMSITESTDIR\t0\t\twin32.txt\n"
1840 "win32_local\t{D34D3FBA-6789-4E57-AD1A-1281297DC201}\tMSITESTDIR\t0\t\twin32_local.txt\n"
1841 "dotnet\t{8943164F-2B31-4C09-A894-493A8CBDE0A4}\tMSITESTDIR\t0\t\tdotnet.txt\n"
1842 "dotnet_local\t{4E8567E8-8EAE-4E36-90F1-B99D33C663F8}\tMSITESTDIR\t0\t\tdotnet_local.txt\n";
1843
1844static const char pa_msi_assembly_dat[] =
1845 "Component_\tFeature_\tFile_Manifest\tFile_Application\tAttributes\n"
1846 "s72\ts38\tS72\tS72\tI2\n"
1847 "MsiAssembly\tComponent_\n"
1848 "fake_local\tassembly\t\tnonexistent.txt\t0\n"
1849 "win32\tassembly\tmanifest.txt\t\t1\n"
1850 "win32_local\tassembly\tmanifest_local.txt\tapplication_win32.txt\t1\n"
1851 "dotnet\tassembly\t\t\t0\n"
1852 "dotnet_local\tassembly\t\tapplication_dotnet.txt\t0\n";
1853
1854static const char pa_msi_assembly_name_dat[] =
1855 "Component_\tName\tValue\n"
1856 "s72\ts255\ts255\n"
1857 "MsiAssemblyName\tComponent_\tName\n"
1858 "fake_local\tName\tWine.Fake.Application.Assembly\n"
1859 "fake_local\tprocessorArchitecture\tx86\n"
1860 "fake_local\tpublicKeyToken\tabcdef0123456789\n"
1861 "fake_local\ttype\twin32\n"
1862 "fake_local\tversion\t1.0.0.0\n"
1863 "win32\tName\tWine.Win32.Assembly\n"
1864 "win32\tprocessorArchitecture\tx86\n"
1865 "win32\tpublicKeyToken\tabcdef0123456789\n"
1866 "win32\ttype\twin32\n"
1867 "win32\tversion\t1.0.0.0\n"
1868 "win32_local\tName\tWine.Win32.Local.Assembly\n"
1869 "win32_local\tprocessorArchitecture\tx86\n"
1870 "win32_local\tpublicKeyToken\tabcdef0123456789\n"
1871 "win32_local\ttype\twin32\n"
1872 "win32_local\tversion\t1.0.0.0\n"
1873 "dotnet\tName\tWine.Dotnet.Assembly\n"
1874 "dotnet\tprocessorArchitecture\tMSIL\n"
1875 "dotnet\tpublicKeyToken\tabcdef0123456789\n"
1876 "dotnet\tculture\tneutral\n"
1877 "dotnet\tversion\t1.0.0.0\n"
1878 "dotnet_local\tName\tWine.Dotnet.Local.Assembly\n"
1879 "dotnet_local\tprocessorArchitecture\tMSIL\n"
1880 "dotnet_local\tpublicKeyToken\tabcdef0123456789\n"
1881 "dotnet_local\tculture\tneutral\n"
1882 "dotnet_local\tversion\t1.0.0.0\n";
1883
1884static const char pa_install_exec_seq_dat[] =
1885 "Action\tCondition\tSequence\n"
1886 "s72\tS255\tI2\n"
1887 "InstallExecuteSequence\tAction\n"
1888 "LaunchConditions\t\t100\n"
1889 "CostInitialize\t\t800\n"
1890 "FileCost\t\t900\n"
1891 "CostFinalize\t\t1000\n"
1892 "InstallValidate\t\t1400\n"
1893 "InstallInitialize\t\t1500\n"
1894 "ProcessComponents\t\t1600\n"
1895 "MsiPublishAssemblies\t\t3000\n"
1896 "pa_immediate\tNOT REMOVE AND NOT ALLUSERS\t3001\n"
1897 "pa_deferred\tNOT REMOVE AND NOT ALLUSERS\t3002\n"
1898 "MsiUnpublishAssemblies\t\t4000\n"
1899 "ua_immediate\tREMOVE AND NOT ALLUSERS\t4001\n"
1900 "ua_deferred\tREMOVE AND NOT ALLUSERS\t4002\n"
1901 "RegisterProduct\t\t5000\n"
1902 "PublishFeatures\t\t5100\n"
1903 "PublishProduct\t\t5200\n"
1904 "UnpublishFeatures\t\t5300\n"
1905 "InstallFinalize\t\t6000\n";
1906
1907static const char pa_custom_action_dat[] =
1908 "Action\tType\tSource\tTarget\n"
1909 "s72\ti2\tS64\tS0\n"
1910 "CustomAction\tAction\n"
1911 "pa_immediate\t1\tcustom.dll\tpa_absent\n"
1912 "pa_deferred\t1025\tcustom.dll\tpa_present\n"
1913 "ua_immediate\t1\tcustom.dll\tpa_present\n"
1914 "ua_deferred\t1025\tcustom.dll\tpa_absent\n";
1915
1916static const char rep_file_dat[] =
1917 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
1918 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
1919 "File\tFile\n"
1920 "rep.txt\trep\trep.txt\t1000\t\t\t8192\t1\n";
1921
1922static const char rep_feature_dat[] =
1923 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
1924 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
1925 "Feature\tFeature\n"
1926 "rep\t\t\trep feature\t1\t2\tMSITESTDIR\t0\n";
1927
1928static const char rep_feature_comp_dat[] =
1929 "Feature_\tComponent_\n"
1930 "s38\ts72\n"
1931 "FeatureComponents\tFeature_\tComponent_\n"
1932 "rep\trep\n";
1933
1934static const char rep_component_dat[] =
1935 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
1936 "s72\tS38\ts72\ti2\tS255\tS72\n"
1937 "Component\tComponent\n"
1938 "rep\t{A24FAF2A-3B2E-41EF-AA78-331542E1A29D}\tMSITESTDIR\t0\t\trep.txt\n";
1939
1940static const char rep_upgrade_dat[] =
1941 "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n"
1942 "s38\tS20\tS20\tS255\ti4\tS255\ts72\n"
1943 "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n"
1944 "{2967C1CC-34D4-42EE-8D96-CD6836F192BF}\t\t\t\t256\t\tPRODUCT\n";
1945
1946static const char rep_property_dat[] =
1947 "Property\tValue\n"
1948 "s72\tl0\n"
1949 "Property\tProperty\n"
1950 "HASUIRUN\t0\n"
1951 "INSTALLLEVEL\t3\n"
1952 "InstallMode\tTypical\n"
1953 "Manufacturer\tWine\n"
1954 "PIDTemplate\t###-#######\n"
1955 "ProductCode\t{1699F0BB-0B61-4A89-AFE4-CFD60DFD76F3}\n"
1956 "ProductLanguage\t1033\n"
1957 "ProductName\tMSITEST\n"
1958 "ProductVersion\t1.1.1\n"
1959 "UpgradeCode\t{2967C1CC-34D4-42EE-8D96-CD6836F192BF}\n"
1960 "PRODUCT\t2F41860D-7B4C-4DA7-BED9-B64F26594C56\n"
1961 "MSIFASTINSTALL\t1\n";
1962
1963static const char rep_install_exec_seq_dat[] =
1964 "Action\tCondition\tSequence\n"
1965 "s72\tS255\tI2\n"
1966 "InstallExecuteSequence\tAction\n"
1967 "FindRelatedProducts\t\t100\n"
1968 "CostInitialize\t\t800\n"
1969 "FileCost\t\t900\n"
1970 "CostFinalize\t\t1000\n"
1971 "InstallValidate\t\t1400\n"
1972 "RemoveExistingProducts\t\t1499\n"
1973 "InstallInitialize\t\t1500\n"
1974 "ProcessComponents\t\t1600\n"
1975 "RemoveFiles\t\t1700\n"
1976 "InstallFiles\t\t2000\n"
1977 "UnregisterExtensionInfo\t\t3000\n"
1978 "UnregisterMIMEInfo\t\t3500\n"
1979 "RegisterExtensionInfo\t\t4000\n"
1980 "RegisterMIMEInfo\t\t4500\n"
1981 "RegisterProduct\t\t5000\n"
1982 "PublishFeatures\t\t5100\n"
1983 "PublishProduct\t\t5200\n"
1984 "UnpublishFeatures\t\t5300\n"
1985 "InstallFinalize\t\t6000\n";
1986
1987static const msi_table env_tables[] =
1988{
1989 ADD_TABLE(component),
1992 ADD_TABLE(feature_comp),
1993 ADD_TABLE(file),
1994 ADD_TABLE(env_install_exec_seq),
1995 ADD_TABLE(env_custom_action),
1998 ADD_TABLE(env_environment)
1999};
2000
2001static const msi_table pp_tables[] =
2002{
2003 ADD_TABLE(pp_component),
2005 ADD_TABLE(rof_feature),
2006 ADD_TABLE(rof_feature_comp),
2007 ADD_TABLE(rof_file),
2008 ADD_TABLE(pp_install_exec_seq),
2009 ADD_TABLE(pp_custom_action),
2010 ADD_TABLE(rof_media),
2012};
2013
2014static const msi_table ppc_tables[] =
2015{
2016 ADD_TABLE(ppc_component),
2018 ADD_TABLE(rof_feature),
2019 ADD_TABLE(ppc_feature_comp),
2020 ADD_TABLE(ppc_file),
2021 ADD_TABLE(pp_install_exec_seq),
2022 ADD_TABLE(pp_custom_action),
2023 ADD_TABLE(ppc_media),
2025};
2026
2027static const msi_table rem_tables[] =
2028{
2029 ADD_TABLE(rem_component),
2031 ADD_TABLE(rof_feature),
2032 ADD_TABLE(rem_feature_comp),
2033 ADD_TABLE(rem_file),
2034 ADD_TABLE(rem_install_exec_seq),
2035 ADD_TABLE(rof_media),
2037 ADD_TABLE(rem_remove_files),
2038};
2039
2040static const msi_table mov_tables[] =
2041{
2042 ADD_TABLE(cwd_component),
2044 ADD_TABLE(rof_feature),
2045 ADD_TABLE(ci2_feature_comp),
2046 ADD_TABLE(ci2_file),
2047 ADD_TABLE(mov_install_exec_seq),
2048 ADD_TABLE(mov_custom_action),
2049 ADD_TABLE(rof_media),
2051 ADD_TABLE(mov_move_file),
2052};
2053
2054static const msi_table df_tables[] =
2055{
2056 ADD_TABLE(rof_component),
2057 ADD_TABLE(df_directory),
2058 ADD_TABLE(rof_feature),
2059 ADD_TABLE(rof_feature_comp),
2060 ADD_TABLE(rof_file),
2061 ADD_TABLE(install_exec_seq),
2062 ADD_TABLE(rof_media),
2064 ADD_TABLE(df_duplicate_file),
2065};
2066
2067static const msi_table wrv_tables[] =
2068{
2069 ADD_TABLE(wrv_component),
2071 ADD_TABLE(wrv_feature),
2072 ADD_TABLE(wrv_feature_comp),
2073 ADD_TABLE(wrv_install_exec_seq),
2074 ADD_TABLE(wrv_custom_action),
2077 ADD_TABLE(wrv_registry),
2078 ADD_TABLE(wrv_remove_registry),
2079};
2080
2081static const msi_table cf_tables[] =
2082{
2083 ADD_TABLE(cf_component),
2084 ADD_TABLE(cf_directory),
2085 ADD_TABLE(cf_feature),
2086 ADD_TABLE(cf_feature_comp),
2087 ADD_TABLE(cf_file),
2088 ADD_TABLE(cf_create_folders),
2089 ADD_TABLE(cf_install_exec_seq),
2090 ADD_TABLE(cf_custom_action),
2093};
2094
2095static const msi_table sss_tables[] =
2096{
2097 ADD_TABLE(component),
2100 ADD_TABLE(feature_comp),
2101 ADD_TABLE(file),
2102 ADD_TABLE(sss_install_exec_seq),
2103 ADD_TABLE(sss_service_control),
2104 ADD_TABLE(sss_custom_action),
2107};
2108
2109static const msi_table sds_tables[] =
2110{
2111 ADD_TABLE(component),
2114 ADD_TABLE(feature_comp),
2115 ADD_TABLE(file),
2116 ADD_TABLE(sds_install_exec_seq),
2117 ADD_TABLE(sds_custom_action),
2118 ADD_TABLE(service_control),
2119 ADD_TABLE(service_install),
2122};
2123
2124static const msi_table sis_tables[] =
2125{
2126 ADD_TABLE(component),
2129 ADD_TABLE(feature_comp),
2130 ADD_TABLE(file),
2131 ADD_TABLE(sis_install_exec_seq),
2132 ADD_TABLE(sis_custom_action),
2133 ADD_TABLE(service_install2),
2136};
2137
2138static const msi_table sr_tables[] =
2139{
2140 ADD_TABLE(sr_component),
2142 ADD_TABLE(sr_feature),
2143 ADD_TABLE(sr_feature_comp),
2144 ADD_TABLE(sr_file),
2145 ADD_TABLE(sr_selfreg),
2146 ADD_TABLE(sr_install_exec_seq),
2147 ADD_TABLE(sr_custom_action),
2150};
2151
2152static const msi_table font_tables[] =
2153{
2154 ADD_TABLE(font_component),
2156 ADD_TABLE(font_feature),
2157 ADD_TABLE(font_feature_comp),
2158 ADD_TABLE(font_file),
2159 ADD_TABLE(font),
2160 ADD_TABLE(font_install_exec_seq),
2161 ADD_TABLE(font_custom_action),
2162 ADD_TABLE(font_media),
2164};
2165
2166static const msi_table vp_tables[] =
2167{
2168 ADD_TABLE(component),
2171 ADD_TABLE(feature_comp),
2172 ADD_TABLE(file),
2173 ADD_TABLE(vp_custom_action),
2174 ADD_TABLE(vp_install_exec_seq),
2176 ADD_TABLE(vp_property)
2177};
2178
2179static const msi_table odbc_tables[] =
2180{
2181 ADD_TABLE(odbc_component),
2183 ADD_TABLE(odbc_feature),
2184 ADD_TABLE(odbc_feature_comp),
2185 ADD_TABLE(odbc_file),
2186 ADD_TABLE(odbc_driver),
2187 ADD_TABLE(odbc_translator),
2188 ADD_TABLE(odbc_datasource),
2189 ADD_TABLE(odbc_install_exec_seq),
2190 ADD_TABLE(odbc_custom_action),
2191 ADD_TABLE(odbc_media),
2193};
2194
2195static const msi_table tl_tables[] =
2196{
2197 ADD_TABLE(tl_component),
2199 ADD_TABLE(tl_feature),
2200 ADD_TABLE(tl_feature_comp),
2201 ADD_TABLE(tl_file),
2202 ADD_TABLE(tl_typelib),
2203 ADD_TABLE(tl_install_exec_seq),
2204 ADD_TABLE(tl_custom_action),
2207};
2208
2209static const msi_table crs_tables[] =
2210{
2211 ADD_TABLE(crs_component),
2213 ADD_TABLE(crs_feature),
2214 ADD_TABLE(crs_feature_comp),
2215 ADD_TABLE(crs_file),
2216 ADD_TABLE(crs_shortcut),
2217 ADD_TABLE(crs_install_exec_seq),
2218 ADD_TABLE(crs_custom_action),
2221};
2222
2223static const msi_table pub_tables[] =
2224{
2226 ADD_TABLE(pub_component),
2227 ADD_TABLE(pub_feature),
2228 ADD_TABLE(pub_feature_comp),
2229 ADD_TABLE(pub_file),
2230 ADD_TABLE(pub_publish_component),
2231 ADD_TABLE(pub_install_exec_seq),
2232 ADD_TABLE(pub_custom_action),
2235};
2236
2237static const msi_table rd_tables[] =
2238{
2240 ADD_TABLE(rd_component),
2241 ADD_TABLE(rd_feature),
2242 ADD_TABLE(rd_feature_comp),
2243 ADD_TABLE(rd_file),
2244 ADD_TABLE(rd_duplicate_file),
2245 ADD_TABLE(rd_install_exec_seq),
2246 ADD_TABLE(rd_custom_action),
2249};
2250
2251static const msi_table frp_tables[] =
2252{
2254 ADD_TABLE(frp_component),
2255 ADD_TABLE(frp_feature),
2256 ADD_TABLE(frp_feature_comp),
2257 ADD_TABLE(frp_file),
2258 ADD_TABLE(frp_upgrade),
2259 ADD_TABLE(frp_custom_action),
2260 ADD_TABLE(frp_install_exec_seq),
2263};
2264
2265static const msi_table ini_tables[] =
2266{
2268 ADD_TABLE(ini_component),
2269 ADD_TABLE(ini_feature),
2270 ADD_TABLE(ini_feature_comp),
2271 ADD_TABLE(ini_file),
2272 ADD_TABLE(ini_ini_file),
2273 ADD_TABLE(ini_remove_ini_file),
2274 ADD_TABLE(ini_install_exec_seq),
2275 ADD_TABLE(ini_custom_action),
2278};
2279
2280static const msi_table rci_tables[] =
2281{
2283 ADD_TABLE(rci_component),
2284 ADD_TABLE(rci_feature),
2285 ADD_TABLE(rci_feature_comp),
2286 ADD_TABLE(rci_file),
2287 ADD_TABLE(rci_appid),
2288 ADD_TABLE(rci_class),
2289 ADD_TABLE(rci_install_exec_seq),
2290 ADD_TABLE(rci_custom_action),
2293};
2294
2295static const msi_table rei_tables[] =
2296{
2298 ADD_TABLE(rei_component),
2299 ADD_TABLE(rei_feature),
2300 ADD_TABLE(rei_feature_comp),
2301 ADD_TABLE(rei_file),
2302 ADD_TABLE(rei_extension),
2303 ADD_TABLE(rei_verb),
2304 ADD_TABLE(rei_progid),
2305 ADD_TABLE(rei_install_exec_seq),
2306 ADD_TABLE(rei_custom_action),
2309};
2310
2311static const msi_table rpi_tables[] =
2312{
2314 ADD_TABLE(rpi_component),
2315 ADD_TABLE(rpi_feature),
2316 ADD_TABLE(rpi_feature_comp),
2317 ADD_TABLE(rpi_file),
2318 ADD_TABLE(rpi_appid),
2319 ADD_TABLE(rpi_class),
2320 ADD_TABLE(rpi_extension),
2321 ADD_TABLE(rpi_verb),
2322 ADD_TABLE(rpi_progid),
2323 ADD_TABLE(rpi_install_exec_seq),
2324 ADD_TABLE(rpi_custom_action),
2327};
2328
2329static const msi_table rmi_tables[] =
2330{
2332 ADD_TABLE(rmi_component),
2333 ADD_TABLE(rmi_feature),
2334 ADD_TABLE(rmi_feature_comp),
2335 ADD_TABLE(rmi_file),
2336 ADD_TABLE(rmi_extension),
2337 ADD_TABLE(rmi_verb),
2338 ADD_TABLE(rmi_mime),
2339 ADD_TABLE(rmi_install_exec_seq),
2340 ADD_TABLE(rmi_custom_action),
2343};
2344
2345static const msi_table pa_tables[] =
2346{
2348 ADD_TABLE(pa_component),
2349 ADD_TABLE(pa_feature),
2350 ADD_TABLE(pa_feature_comp),
2351 ADD_TABLE(pa_file),
2352 ADD_TABLE(pa_msi_assembly),
2353 ADD_TABLE(pa_msi_assembly_name),
2354 ADD_TABLE(pa_install_exec_seq),
2355 ADD_TABLE(pa_custom_action),
2358};
2359
2360static const msi_table rep_tables[] =
2361{
2363 ADD_TABLE(rep_component),
2364 ADD_TABLE(rep_feature),
2365 ADD_TABLE(rep_feature_comp),
2366 ADD_TABLE(rep_file),
2367 ADD_TABLE(rep_upgrade),
2368 ADD_TABLE(rep_property),
2369 ADD_TABLE(rep_install_exec_seq),
2371};
2372
2373/* cabinet definitions */
2374
2375/* make the max size large so there is only one cab file */
2376#define MEDIA_SIZE 0x7FFFFFFF
2377
2378static void init_functionpointers(void)
2379{
2380 HMODULE hmsi = GetModuleHandleA("msi.dll");
2381 HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
2382 HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
2383 HMODULE hsrclient = LoadLibraryA("srclient.dll");
2384
2385#define GET_PROC(mod, func) \
2386 p ## func = (void*)GetProcAddress(mod, #func); \
2387 if(!p ## func) \
2388 trace("GetProcAddress(%s) failed\n", #func);
2389
2395
2396 GET_PROC(hadvapi32, RegDeleteKeyExA)
2398
2399 GET_PROC(hsrclient, SRRemoveRestorePoint);
2400 GET_PROC(hsrclient, SRSetRestorePointA);
2401
2402#undef GET_PROC
2403}
2404
2405static char *get_user_sid(void)
2406{
2407 HANDLE token;
2408 DWORD size = 0;
2410 char *usersid = NULL;
2411
2414
2415 user = malloc(size);
2417 ConvertSidToStringSidA(user->User.Sid, &usersid);
2418 free(user);
2419
2421 return usersid;
2422}
2423
2424static void create_test_files(void)
2425{
2426 CreateDirectoryA("msitest", NULL);
2427 create_file("msitest\\one.txt", 100);
2428 CreateDirectoryA("msitest\\first", NULL);
2429 create_file("msitest\\first\\two.txt", 100);
2430 CreateDirectoryA("msitest\\second", NULL);
2431 create_file("msitest\\second\\three.txt", 100);
2432
2433 create_file("four.txt", 100);
2434 create_file("five.txt", 100);
2435 create_cab_file("msitest.cab", MEDIA_SIZE, "four.txt\0five.txt\0");
2436
2437 create_file("msitest\\filename", 100);
2438 create_file("msitest\\service.exe", 100);
2439 create_file("msitest\\service2.exe", 100);
2440
2441 DeleteFileA("four.txt");
2442 DeleteFileA("five.txt");
2443}
2444
2445static void delete_test_files(void)
2446{
2447 DeleteFileA("msitest.msi");
2448 DeleteFileA("msitest.cab");
2449 DeleteFileA("msitest\\second\\three.txt");
2450 DeleteFileA("msitest\\first\\two.txt");
2451 DeleteFileA("msitest\\one.txt");
2452 DeleteFileA("msitest\\service.exe");
2453 DeleteFileA("msitest\\service2.exe");
2454 DeleteFileA("msitest\\filename");
2455 RemoveDirectoryA("msitest\\second");
2456 RemoveDirectoryA("msitest\\first");
2457 RemoveDirectoryA("msitest");
2458}
2459
2461{
2462 RESTOREPOINTINFOA spec;
2463
2464 spec.dwEventType = event_type;
2466 spec.llSequenceNumber = status->llSequenceNumber;
2467 lstrcpyA(spec.szDescription, "msitest restore point");
2468
2469 return pSRSetRestorePointA(&spec, status);
2470}
2471
2472static void remove_restore_point(DWORD seq_number)
2473{
2474 DWORD res;
2475
2476 res = pSRRemoveRestorePoint(seq_number);
2477 if (res != ERROR_SUCCESS)
2478 trace("Failed to remove the restore point : %#lx\n", res);
2479}
2480
2482{
2483 if (pRegDeleteKeyExA)
2484 return pRegDeleteKeyExA( key, subkey, access, 0 );
2485 return RegDeleteKeyA( key, subkey );
2486}
2487
2488static void delete_pfmsitest_files(void)
2489{
2490 SHFILEOPSTRUCTA shfl;
2491 CHAR path[MAX_PATH+11];
2492
2494 lstrcatA(path, "\\msitest\\*");
2495 path[strlen(path) + 1] = '\0';
2496
2497 shfl.hwnd = NULL;
2498 shfl.wFunc = FO_DELETE;
2499 shfl.pFrom = path;
2500 shfl.pTo = NULL;
2502
2503 SHFileOperationA(&shfl);
2504
2506 lstrcatA(path, "\\msitest");
2508}
2509
2511{
2512 char val[MAX_PATH];
2513 DWORD size, type;
2514 LONG res;
2515
2516 size = MAX_PATH;
2517 val[0] = '\0';
2518 res = RegQueryValueExA(prodkey, name, NULL, &type, (BYTE *)val, &size);
2519 ok_(__FILE__, line)(!res, "Failed to query value, error %ld\n", res);
2520 ok_(__FILE__, line)(type == REG_SZ || type == REG_EXPAND_SZ, "Got wrong type %lu\n", type);
2522 {
2523 if (bcase)
2524 ok_(__FILE__, line)(!strcmp(val, expected), "got %s\n", debugstr_a(val));
2525 else
2526 ok_(__FILE__, line)(!strcasecmp(val, expected), "got %s\n", debugstr_a(val));
2527 }
2528}
2529
2530static void check_reg_multi(HKEY prodkey, const char *name, const char *expect, DWORD line)
2531{
2532 char val[MAX_PATH];
2533 DWORD expect_size = 0, size, type;
2534 const char *p;
2535 LONG res;
2536
2537 for (p = expect; *p; p += strlen(p) + 1)
2538 ;
2539 expect_size = (p + 1) - expect;
2540
2541 size = MAX_PATH;
2542 val[0] = '\0';
2543 res = RegQueryValueExA(prodkey, name, NULL, &type, (BYTE *)val, &size);
2544 ok_(__FILE__, line)(!res, "Failed to query value, error %ld\n", res);
2545 ok_(__FILE__, line)(type == REG_MULTI_SZ, "Got wrong type %lu\n", type);
2546 ok_(__FILE__, line)(size == expect_size, "expected size %lu, got %lu\n", expect_size, size);
2547 ok_(__FILE__, line)(!memcmp(val, expect, size), "got %s\n", debugstr_an(val, size));
2548}
2549
2551{
2552 DWORD val, size, type;
2553 LONG res;
2554
2555 size = sizeof(DWORD);
2556 res = RegQueryValueExA(prodkey, name, NULL, &type, (BYTE *)&val, &size);
2557 ok_(__FILE__, line)(!res, "Failed to query value, error %ld\n", res);
2558 ok_(__FILE__, line)(type == REG_DWORD, "Got wrong type %lu\n", type);
2560 ok_(__FILE__, line)(val == expected, "Expected %lu, got %lu\n", expected, val);
2561}
2562
2563#define CHECK_REG_STR(prodkey, name, expected) \
2564 check_reg_str(prodkey, name, expected, TRUE, FALSE, __LINE__);
2565
2566#define CHECK_DEL_REG_STR(prodkey, name, expected) \
2567 do { \
2568 check_reg_str(prodkey, name, expected, TRUE, FALSE, __LINE__); \
2569 RegDeleteValueA(prodkey, name); \
2570 } while(0)
2571
2572#define CHECK_DEL_REG_STR_TODO(prodkey, name, expected) \
2573 do { \
2574 check_reg_str(prodkey, name, expected, TRUE, TRUE, __LINE__); \
2575 RegDeleteValueA(prodkey, name); \
2576 } while(0)
2577
2578#define CHECK_REG_ISTR(prodkey, name, expected) \
2579 check_reg_str(prodkey, name, expected, FALSE, FALSE, __LINE__);
2580
2581#define CHECK_DEL_REG_ISTR(prodkey, name, expected) \
2582 do { \
2583 check_reg_str(prodkey, name, expected, FALSE, FALSE, __LINE__); \
2584 RegDeleteValueA(prodkey, name); \
2585 } while(0)
2586
2587#define CHECK_REG_MULTI(key, name, expect) \
2588 check_reg_multi(key, name, expect, __LINE__);
2589
2590#define CHECK_DEL_REG_MULTI(key, name, expect) \
2591 do { \
2592 check_reg_multi(key, name, expect, __LINE__); \
2593 RegDeleteValueA(key, name); \
2594 } while(0)
2595
2596#define CHECK_REG_DWORD(prodkey, name, expected) \
2597 check_reg_dword(prodkey, name, expected, FALSE, __LINE__);
2598
2599#define CHECK_REG_DWORD_TODO(prodkey, name, expected) \
2600 check_reg_dword(prodkey, name, expected, TRUE, __LINE__);
2601
2602#define CHECK_DEL_REG_DWORD(prodkey, name, expected) \
2603 do { \
2604 check_reg_dword(prodkey, name, expected, FALSE, __LINE__); \
2605 RegDeleteValueA(prodkey, name); \
2606 } while(0)
2607
2608#define CHECK_DEL_REG_DWORD_TODO(prodkey, name, expected) \
2609 do { \
2610 check_reg_dword(prodkey, name, expected, TRUE, __LINE__); \
2611 RegDeleteValueA(prodkey, name); \
2612 } while(0)
2613
2615{
2616 SYSTEMTIME systime;
2617
2618 static const char date_fmt[] = "%d%02d%02d";
2619 GetLocalTime(&systime);
2620 sprintf(date, date_fmt, systime.wYear, systime.wMonth, systime.wDay);
2621}
2622
2623/* EstimatedSize is the size in KiB of .msi + installed files, rounded up to page size. */
2625{
2626 SYSTEM_INFO si;
2627 HANDLE file;
2628 DWORD size;
2629
2630 GetSystemInfo(&si);
2631
2633 size = ((GetFileSize(file, NULL) + si.dwPageSize - 1) / si.dwPageSize + 1);
2634 size = size * si.dwPageSize / 1024;
2636 return size;
2637}
2638
2639static void extract_resource(const char *name, const char *type, const char *path)
2640{
2641 DWORD written;
2642 HANDLE file;
2643 HRSRC res;
2644 void *ptr;
2645
2647 ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %lu\n", path, GetLastError());
2648
2650 ok( res != 0, "couldn't find resource\n" );
2653 ok( written == SizeofResource( GetModuleHandleA(NULL), res ), "couldn't write resource\n" );
2654 CloseHandle( file );
2655}
2656
2657static void test_register_product(void)
2658{
2659 UINT r;
2660 LONG res;
2661 HKEY hkey, props, usage;
2662 LPSTR usersid;
2663 char date[MAX_PATH], temp[MAX_PATH], keypath[MAX_PATH], path[MAX_PATH];
2664 DWORD size, type;
2665
2666 static const CHAR uninstall[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2667 "\\Uninstall\\{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2668 static const CHAR userdata[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer"
2669 "\\UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2670 static const CHAR ugkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer"
2671 "\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
2672 static const CHAR userugkey[] = "Software\\Microsoft\\Installer\\UpgradeCodes"
2673 "\\51AAE0C44620A5E4788506E91F249BD2";
2674
2675 if (is_process_limited())
2676 {
2677 skip("process is limited\n");
2678 return;
2679 }
2680
2681 if (!(usersid = get_user_sid()))
2682 return;
2683
2686
2687 CreateDirectoryA("msitest", NULL);
2688 create_file("msitest\\maximus", 500);
2689
2691
2693
2694 /* RegisterProduct */
2695 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
2697 {
2698 skip("Not enough rights to perform tests\n");
2699 goto error;
2700 }
2701 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2702 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2703 ok(delete_pf("msitest", FALSE), "Directory not created\n");
2704
2705 res = RegOpenKeyA(HKEY_CURRENT_USER, userugkey, &hkey);
2706 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2707
2708 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_READ | KEY_WOW64_32KEY, &hkey);
2709 ok(!res, "got %ld\n", res);
2710
2711 CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST");
2712 CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1");
2713 CHECK_DEL_REG_STR(hkey, "InstallDate", date);
2714 CHECK_DEL_REG_STR(hkey, "InstallSource", temp);
2715 CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2716 CHECK_DEL_REG_STR(hkey, "Publisher", "Wine");
2717 CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2718 CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", "");
2719 CHECK_DEL_REG_STR(hkey, "Comments", "");
2720 CHECK_DEL_REG_STR(hkey, "Contact", "");
2721 CHECK_DEL_REG_STR(hkey, "HelpLink", "");
2722 CHECK_DEL_REG_STR(hkey, "HelpTelephone", "");
2723 CHECK_DEL_REG_STR(hkey, "InstallLocation", "");
2724 CHECK_DEL_REG_DWORD(hkey, "NoModify", 1);
2725 CHECK_DEL_REG_STR(hkey, "Readme", "");
2726 CHECK_DEL_REG_STR(hkey, "Size", "");
2727 CHECK_DEL_REG_STR(hkey, "URLInfoAbout", "");
2728 CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", "");
2729 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2730 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2731 CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1);
2732 CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1);
2733 CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1);
2734 CHECK_DEL_REG_DWORD_TODO(hkey, "EstimatedSize", get_estimated_size());
2735
2736 res = RegDeleteKeyA(hkey, "");
2737 ok(!res, "got %ld\n", res);
2738 RegCloseKey(hkey);
2739
2740 sprintf(keypath, userdata, usersid);
2742 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2743
2744 res = RegOpenKeyExA(hkey, "InstallProperties", 0, KEY_READ, &props);
2745 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2746
2747 size = sizeof(path);
2748 RegQueryValueExA(props, "LocalPackage", NULL, &type, (LPBYTE)path, &size);
2750 RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */
2751
2752 CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST");
2753 CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1");
2754 CHECK_DEL_REG_STR(props, "InstallDate", date);
2755 CHECK_DEL_REG_STR(props, "InstallSource", temp);
2756 CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2757 CHECK_DEL_REG_STR(props, "Publisher", "Wine");
2758 CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2759 CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", "");
2760 CHECK_DEL_REG_STR(props, "Comments", "");
2761 CHECK_DEL_REG_STR(props, "Contact", "");
2762 CHECK_DEL_REG_STR(props, "HelpLink", "");
2763 CHECK_DEL_REG_STR(props, "HelpTelephone", "");
2764 CHECK_DEL_REG_STR(props, "InstallLocation", "");
2765 CHECK_DEL_REG_DWORD(props, "NoModify", 1);
2766 CHECK_DEL_REG_STR(props, "Readme", "");
2767 CHECK_DEL_REG_STR(props, "Size", "");
2768 CHECK_DEL_REG_STR(props, "URLInfoAbout", "");
2769 CHECK_DEL_REG_STR(props, "URLUpdateInfo", "");
2770 CHECK_DEL_REG_DWORD(props, "Language", 1033);
2771 CHECK_DEL_REG_DWORD(props, "Version", 0x1010001);
2772 CHECK_DEL_REG_DWORD(props, "VersionMajor", 1);
2773 CHECK_DEL_REG_DWORD(props, "VersionMinor", 1);
2774 CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1);
2776
2777 res = RegDeleteKeyA(props, "");
2778 ok(!res, "got %ld\n", res);
2780
2781 res = RegOpenKeyExA(hkey, "Usage", 0, KEY_READ, &usage);
2782 todo_wine
2783 {
2784 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2785 }
2786
2787 res = RegDeleteKeyA(usage, "");
2788 todo_wine
2789 ok(!res, "got %ld\n", res);
2791 res = RegDeleteKeyA(hkey, "");
2792 ok(!res, "got %ld\n", res);
2793 RegCloseKey(hkey);
2794
2796 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2797
2798 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", "");
2799
2800 res = RegDeleteKeyA(hkey, "");
2801 ok(!res, "got %ld\n", res);
2802 RegCloseKey(hkey);
2803
2804 /* RegisterProduct, machine */
2805 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 ALLUSERS=1");
2806 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2807 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2808 ok(delete_pf("msitest", FALSE), "Directory not created\n");
2809
2810 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, userugkey, 0, KEY_READ | KEY_WOW64_64KEY, &hkey);
2811 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2812
2813 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_READ | KEY_WOW64_32KEY, &hkey);
2814 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2815
2816 CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST");
2817 CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1");
2818 CHECK_DEL_REG_STR(hkey, "InstallDate", date);
2819 CHECK_DEL_REG_STR(hkey, "InstallSource", temp);
2820 CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2821 CHECK_DEL_REG_STR(hkey, "Publisher", "Wine");
2822 CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2823 CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", "");
2824 CHECK_DEL_REG_STR(hkey, "Comments", "");
2825 CHECK_DEL_REG_STR(hkey, "Contact", "");
2826 CHECK_DEL_REG_STR(hkey, "HelpLink", "");
2827 CHECK_DEL_REG_STR(hkey, "HelpTelephone", "");
2828 CHECK_DEL_REG_STR(hkey, "InstallLocation", "");
2829 CHECK_DEL_REG_DWORD(hkey, "NoModify", 1);
2830 CHECK_DEL_REG_STR(hkey, "Readme", "");
2831 CHECK_DEL_REG_STR(hkey, "Size", "");
2832 CHECK_DEL_REG_STR(hkey, "URLInfoAbout", "");
2833 CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", "");
2834 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2835 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2836 CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1);
2837 CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1);
2838 CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1);
2839 CHECK_DEL_REG_DWORD_TODO(hkey, "EstimatedSize", get_estimated_size());
2840
2841 res = RegDeleteKeyA(hkey, "");
2842 ok(!res, "got %ld\n", res);
2843 RegCloseKey(hkey);
2844
2845 sprintf(keypath, userdata, "S-1-5-18");
2847 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2848
2849 res = RegOpenKeyExA(hkey, "InstallProperties", 0, KEY_READ, &props);
2850 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2851
2852 size = sizeof(path);
2853 RegQueryValueExA(props, "LocalPackage", NULL, &type, (LPBYTE)path, &size);
2855 RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */
2856
2857 CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST");
2858 CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1");
2859 CHECK_DEL_REG_STR(props, "InstallDate", date);
2860 CHECK_DEL_REG_STR(props, "InstallSource", temp);
2861 CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2862 CHECK_DEL_REG_STR(props, "Publisher", "Wine");
2863 CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2864 CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", "");
2865 CHECK_DEL_REG_STR(props, "Comments", "");
2866 CHECK_DEL_REG_STR(props, "Contact", "");
2867 CHECK_DEL_REG_STR(props, "HelpLink", "");
2868 CHECK_DEL_REG_STR(props, "HelpTelephone", "");
2869 CHECK_DEL_REG_STR(props, "InstallLocation", "");
2870 CHECK_DEL_REG_DWORD(props, "NoModify", 1);
2871 CHECK_DEL_REG_STR(props, "Readme", "");
2872 CHECK_DEL_REG_STR(props, "Size", "");
2873 CHECK_DEL_REG_STR(props, "URLInfoAbout", "");
2874 CHECK_DEL_REG_STR(props, "URLUpdateInfo", "");
2875 CHECK_DEL_REG_DWORD(props, "Language", 1033);
2876 CHECK_DEL_REG_DWORD(props, "Version", 0x1010001);
2877 CHECK_DEL_REG_DWORD(props, "VersionMajor", 1);
2878 CHECK_DEL_REG_DWORD(props, "VersionMinor", 1);
2879 CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1);
2881
2882 res = RegDeleteKeyA(props, "");
2883 ok(!res, "got %ld\n", res);
2885
2886 res = RegOpenKeyExA(hkey, "Usage", 0, KEY_READ, &usage);
2887 todo_wine
2888 {
2889 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2890 }
2891
2892 res = RegDeleteKeyA(usage, "");
2893 todo_wine
2894 ok(!res, "got %ld\n", res);
2896 res = RegDeleteKeyA(hkey, "");
2897 ok(!res, "got %ld\n", res);
2898 RegCloseKey(hkey);
2899
2901 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2902
2903 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", "");
2904
2905 res = RegDeleteKeyA(hkey, "");
2906 ok(!res, "got %ld\n", res);
2907 RegCloseKey(hkey);
2908
2909 if (is_wow64 || is_64bit)
2910 {
2913
2914 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 ALLUSERS=1 RP_TEST64=1");
2915 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2916 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2917 ok(delete_pf("msitest", FALSE), "Directory not created\n");
2918
2919 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, userugkey, 0, KEY_READ | KEY_WOW64_64KEY, &hkey);
2920 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2921
2922 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_READ | KEY_WOW64_32KEY, &hkey);
2923 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_SUCCESS, got %ld\n", res);
2924
2925 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_READ | KEY_WOW64_64KEY, &hkey);
2926 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2927
2928 CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST");
2929 CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1");
2930 CHECK_DEL_REG_STR(hkey, "InstallDate", date);
2931 CHECK_DEL_REG_STR(hkey, "InstallSource", temp);
2932 CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2933 CHECK_DEL_REG_STR(hkey, "Publisher", "Wine");
2934 CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2935 CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", "");
2936 CHECK_DEL_REG_STR(hkey, "Comments", "");
2937 CHECK_DEL_REG_STR(hkey, "Contact", "");
2938 CHECK_DEL_REG_STR(hkey, "HelpLink", "");
2939 CHECK_DEL_REG_STR(hkey, "HelpTelephone", "");
2940 CHECK_DEL_REG_STR(hkey, "InstallLocation", "");
2941 CHECK_DEL_REG_DWORD(hkey, "NoModify", 1);
2942 CHECK_DEL_REG_STR(hkey, "Readme", "");
2943 CHECK_DEL_REG_STR(hkey, "Size", "");
2944 CHECK_DEL_REG_STR(hkey, "URLInfoAbout", "");
2945 CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", "");
2946 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2947 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2948 CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1);
2949 CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1);
2950 CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1);
2951 CHECK_DEL_REG_DWORD_TODO(hkey, "EstimatedSize", get_estimated_size());
2952
2953 res = RegDeleteKeyA(hkey, "");
2954 ok(!res, "got %ld\n", res);
2955 RegCloseKey(hkey);
2956
2957 sprintf(keypath, userdata, "S-1-5-18");
2959 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2960
2961 res = RegOpenKeyExA(hkey, "InstallProperties", 0, KEY_READ, &props);
2962 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2963
2964 size = sizeof(path);
2965 RegQueryValueExA(props, "LocalPackage", NULL, &type, (LPBYTE)path, &size);
2967 RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */
2968
2969 CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST");
2970 CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1");
2971 CHECK_DEL_REG_STR(props, "InstallDate", date);
2972 CHECK_DEL_REG_STR(props, "InstallSource", temp);
2973 CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2974 CHECK_DEL_REG_STR(props, "Publisher", "Wine");
2975 CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2976 CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", "");
2977 CHECK_DEL_REG_STR(props, "Comments", "");
2978 CHECK_DEL_REG_STR(props, "Contact", "");
2979 CHECK_DEL_REG_STR(props, "HelpLink", "");
2980 CHECK_DEL_REG_STR(props, "HelpTelephone", "");
2981 CHECK_DEL_REG_STR(props, "InstallLocation", "");
2982 CHECK_DEL_REG_DWORD(props, "NoModify", 1);
2983 CHECK_DEL_REG_STR(props, "Readme", "");
2984 CHECK_DEL_REG_STR(props, "Size", "");
2985 CHECK_DEL_REG_STR(props, "URLInfoAbout", "");
2986 CHECK_DEL_REG_STR(props, "URLUpdateInfo", "");
2987 CHECK_DEL_REG_DWORD(props, "Language", 1033);
2988 CHECK_DEL_REG_DWORD(props, "Version", 0x1010001);
2989 CHECK_DEL_REG_DWORD(props, "VersionMajor", 1);
2990 CHECK_DEL_REG_DWORD(props, "VersionMinor", 1);
2991 CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1);
2993
2994 res = RegDeleteKeyA(props, "");
2995 ok(!res, "got %ld\n", res);
2997
2998 res = RegOpenKeyExA(hkey, "Usage", 0, KEY_READ, &usage);
2999 todo_wine
3000 {
3001 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3002 }
3003
3004 res = RegDeleteKeyA(usage, "");
3005 todo_wine
3006 ok(!res, "got %ld\n", res);
3008 res = RegDeleteKeyA(hkey, "");
3009 ok(!res, "got %ld\n", res);
3010 RegCloseKey(hkey);
3011
3013 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3014
3015 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", "");
3016
3017 res = RegDeleteKeyA(hkey, "");
3018 ok(!res, "got %ld\n", res);
3019 RegCloseKey(hkey);
3020 }
3021 else
3022 skip("64-bit RegisterProduct tests\n");
3023
3024error:
3026 DeleteFileA("msitest\\maximus");
3027 RemoveDirectoryA("msitest");
3028 LocalFree(usersid);
3029}
3030
3031static void test_publish_product(void)
3032{
3033 static const char prodpath[] =
3034 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products"
3035 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3036 static const char cuprodpath[] =
3037 "Software\\Microsoft\\Installer\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3038 static const char cuupgrades[] =
3039 "Software\\Microsoft\\Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
3040 static const char badprod[] =
3041 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Products"
3042 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3043 static const char machprod[] =
3044 "Software\\Classes\\Installer\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3045 static const char machup[] =
3046 "Software\\Classes\\Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
3047 UINT r;
3048 LONG res;
3049 LPSTR usersid;
3050 HKEY sourcelist, net, props;
3051 HKEY hkey, patches, media;
3052 CHAR keypath[MAX_PATH];
3055 BOOL old_installer = FALSE;
3057
3058 if (is_process_limited())
3059 {
3060 skip("process is limited\n");
3061 return;
3062 }
3063
3064 if (!(usersid = get_user_sid()))
3065 return;
3066
3068
3069 CreateDirectoryA("msitest", NULL);
3070 create_file("msitest\\maximus", 500);
3071
3073
3074 if (is_wow64)
3076
3078
3079 /* PublishProduct, current user */
3080 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
3082 {
3083 skip("Not enough rights to perform tests\n");
3084 goto error;
3085 }
3086 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3087 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3088 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3089
3090 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, badprod, 0, access, &hkey);
3091 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3092
3093 sprintf(keypath, prodpath, usersid);
3094 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey);
3096 {
3097 res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey);
3098 if (res == ERROR_SUCCESS)
3099 {
3100 win_skip("Windows Installer < 3.0 detected\n");
3101 RegCloseKey(hkey);
3102 old_installer = TRUE;
3103 goto currentuser;
3104 }
3105 else
3106 {
3107 win_skip("Install failed, no need to continue\n");
3108 return;
3109 }
3110 }
3111 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3112
3113 res = RegOpenKeyExA(hkey, "InstallProperties", 0, access, &props);
3114 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3115
3116 res = RegOpenKeyExA(hkey, "Patches", 0, access, &patches);
3117 todo_wine ok(!res, "Expected ERROR_SUCCESS, got %ld\n", res);
3118 if (!res)
3119 CHECK_DEL_REG_STR(patches, "AllPatches", "");
3120
3121 delete_key(patches, "", access);
3122 RegCloseKey(patches);
3123 delete_key(hkey, "", access);
3124 RegCloseKey(hkey);
3125
3126currentuser:
3127 res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey);
3128 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3129
3130 CHECK_DEL_REG_STR(hkey, "ProductName", "MSITEST");
3131 CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052C94DA02821EECD05F2F");
3132 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
3133 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
3134 if (!old_installer)
3135 CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0);
3136 CHECK_DEL_REG_DWORD(hkey, "Assignment", 0);
3137 CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184);
3138 CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0);
3139 CHECK_DEL_REG_MULTI(hkey, "Clients", ":\0");
3140
3141 res = RegOpenKeyA(hkey, "SourceList", &sourcelist);
3142 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3143
3144 lstrcpyA(path, "n;1;");
3145 lstrcatA(path, temp);
3146 CHECK_DEL_REG_STR(sourcelist, "LastUsedSource", path);
3147 CHECK_DEL_REG_STR(sourcelist, "PackageName", "msitest.msi");
3148
3149 res = RegOpenKeyA(sourcelist, "Net", &net);
3150 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3151
3152 CHECK_DEL_REG_STR(net, "1", temp);
3153
3154 RegDeleteKeyA(net, "");
3156
3157 res = RegOpenKeyA(sourcelist, "Media", &media);
3158 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3159
3160 CHECK_DEL_REG_STR(media, "1", "DISK1;");
3161
3162 RegDeleteKeyA(media, "");
3164 RegDeleteKeyA(sourcelist, "");
3165 RegCloseKey(sourcelist);
3166 RegDeleteKeyA(hkey, "");
3167 RegCloseKey(hkey);
3168
3169 res = RegOpenKeyA(HKEY_CURRENT_USER, cuupgrades, &hkey);
3170 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3171
3172 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", "");
3173
3174 RegDeleteKeyA(hkey, "");
3175 RegCloseKey(hkey);
3176
3177 /* PublishProduct, machine */
3178 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 ALLUSERS=1");
3179 if (old_installer)
3180 goto machprod;
3181 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3182 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3183 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3184
3185 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, badprod, 0, access, &hkey);
3186 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3187
3188 sprintf(keypath, prodpath, "S-1-5-18");
3189 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey);
3190 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3191
3192 res = RegOpenKeyExA(hkey, "InstallProperties", 0, access, &props);
3193 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3194
3195 res = RegOpenKeyExA(hkey, "Patches", 0, access, &patches);
3196 todo_wine ok(!res, "Expected ERROR_SUCCESS, got %ld\n", res);
3197 if (!res)
3198 CHECK_DEL_REG_STR(patches, "AllPatches", "");
3199
3200 delete_key(patches, "", access);
3201 RegCloseKey(patches);
3202 delete_key(hkey, "", access);
3203 RegCloseKey(hkey);
3204
3205machprod:
3206 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, machprod, 0, access, &hkey);
3207 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3208
3209 CHECK_DEL_REG_STR(hkey, "ProductName", "MSITEST");
3210 CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052C94DA02821EECD05F2F");
3211 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
3212 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
3213 if (!old_installer)
3214 CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0);
3215 CHECK_DEL_REG_DWORD_TODO(hkey, "Assignment", 1);
3216 CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184);
3217 CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0);
3218 CHECK_DEL_REG_MULTI(hkey, "Clients", ":\0");
3219
3220 res = RegOpenKeyExA(hkey, "SourceList", 0, access, &sourcelist);
3221 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3222
3223 lstrcpyA(path, "n;1;");
3224 lstrcatA(path, temp);
3225 CHECK_DEL_REG_STR(sourcelist, "LastUsedSource", path);
3226 CHECK_DEL_REG_STR(sourcelist, "PackageName", "msitest.msi");
3227
3228 res = RegOpenKeyExA(sourcelist, "Net", 0, access, &net);
3229 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3230
3231 CHECK_DEL_REG_STR(net, "1", temp);
3232
3233 res = delete_key(net, "", access);
3234 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3236
3237 res = RegOpenKeyExA(sourcelist, "Media", 0, access, &media);
3238 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3239
3240 CHECK_DEL_REG_STR(media, "1", "DISK1;");
3241
3242 res = delete_key(media, "", access);
3243 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3245 res = delete_key(sourcelist, "", access);
3246 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3247 RegCloseKey(sourcelist);
3248 res = delete_key(hkey, "", access);
3249 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3250 RegCloseKey(hkey);
3251
3252 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, machup, 0, access, &hkey);
3253 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3254
3255 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", "");
3256
3257 res = delete_key(hkey, "", access);
3258 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3259 RegCloseKey(hkey);
3260
3261error:
3263 DeleteFileA("msitest\\maximus");
3264 RemoveDirectoryA("msitest");
3265 LocalFree(usersid);
3266}
3267
3268static void test_publish_features(void)
3269{
3270 static const char cupath[] =
3271 "Software\\Microsoft\\Installer\\Features\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3272 static const char udfeatpath[] =
3273 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products"
3274 "\\84A88FD7F6998CE40A22FB59F6B9C2BB\\Features";
3275 static const char udpridpath[] =
3276 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products"
3277 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3278 static const char featkey[] =
3279 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Features";
3280 static const char classfeat[] =
3281 "Software\\Classes\\Installer\\Features\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3282 UINT r;
3283 LONG res;
3284 HKEY hkey;
3285 LPSTR usersid;
3286 CHAR keypath[MAX_PATH];
3288
3289 if (is_process_limited())
3290 {
3291 skip("process is limited\n");
3292 return;
3293 }
3294
3295 if (!(usersid = get_user_sid()))
3296 return;
3297
3298 CreateDirectoryA("msitest", NULL);
3299 create_file("msitest\\maximus", 500);
3300
3302
3303 if (is_wow64)
3305
3307
3308 /* PublishFeatures, current user */
3309 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1");
3311 {
3312 skip("Not enough rights to perform tests\n");
3313 goto error;
3314 }
3315 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3316 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3317 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3318
3319 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, featkey, 0, access, &hkey);
3320 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3321
3322 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, classfeat, 0, access, &hkey);
3323 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3324
3325 res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey);
3326 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3327
3328 CHECK_REG_STR(hkey, "feature", "");
3329 CHECK_REG_STR(hkey, "montecristo", "");
3330
3331 RegDeleteValueA(hkey, "feature");
3332 RegDeleteValueA(hkey, "montecristo");
3333 delete_key(hkey, "", access);
3334 RegCloseKey(hkey);
3335
3336 sprintf(keypath, udfeatpath, usersid);
3337 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey);
3338 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3339
3340 CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE");
3341 CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE");
3342
3343 RegDeleteValueA(hkey, "feature");
3344 RegDeleteValueA(hkey, "montecristo");
3345 delete_key(hkey, "", access);
3346 RegCloseKey(hkey);
3347 sprintf(keypath, udpridpath, usersid);
3349
3350 /* PublishFeatures, machine */
3351 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1 ALLUSERS=1");
3352 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3353 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3354 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3355
3356 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, featkey, 0, access, &hkey);
3357 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3358
3359 res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey);
3360 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3361 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, classfeat, 0, access, &hkey);
3362 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3363
3364 CHECK_REG_STR(hkey, "feature", "");
3365 CHECK_REG_STR(hkey, "montecristo", "");
3366
3367 RegDeleteValueA(hkey, "feature");
3368 RegDeleteValueA(hkey, "montecristo");
3369 delete_key(hkey, "", access);
3370 RegCloseKey(hkey);
3371
3372 sprintf(keypath, udfeatpath, "S-1-5-18");
3373 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey);
3374 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3375
3376 CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE");
3377 CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE");
3378
3379 RegDeleteValueA(hkey, "feature");
3380 RegDeleteValueA(hkey, "montecristo");
3381 delete_key(hkey, "", access);
3382 RegCloseKey(hkey);
3383 sprintf(keypath, udpridpath, "S-1-5-18");
3385
3386error:
3388 DeleteFileA("msitest\\maximus");
3389 RemoveDirectoryA("msitest");
3390 LocalFree(usersid);
3391}
3392
3394{
3395 DWORD len = 0;
3396 LPSTR val;
3397 LONG r;
3398
3399 r = RegQueryValueExA(hkey, name, NULL, NULL, NULL, &len);
3400 if (r != ERROR_SUCCESS)
3401 return NULL;
3402
3403 len += sizeof (WCHAR);
3404 val = malloc(len);
3405 if (!val) return NULL;
3406 val[0] = 0;
3408 return val;
3409}
3410
3411static void get_owner_company(LPSTR *owner, LPSTR *company)
3412{
3413 LONG res;
3414 HKEY hkey;
3416
3417 *owner = *company = NULL;
3418
3419 if (is_wow64)
3421
3423 "Software\\Microsoft\\MS Setup (ACME)\\User Info", &hkey);
3424 if (res == ERROR_SUCCESS)
3425 {
3426 *owner = reg_get_val_str(hkey, "DefName");
3427 *company = reg_get_val_str(hkey, "DefCompany");
3428 RegCloseKey(hkey);
3429 }
3430
3431 if (!*owner || !*company)
3432 {
3434 "Software\\Microsoft\\Windows NT\\CurrentVersion", 0, access, &hkey);
3435 if (res == ERROR_SUCCESS)
3436 {
3437 *owner = reg_get_val_str(hkey, "RegisteredOwner");
3438 *company = reg_get_val_str(hkey, "RegisteredOrganization");
3439 RegCloseKey(hkey);
3440 }
3441 }
3442
3443 if (!*owner || !*company)
3444 {
3446 "Software\\Microsoft\\Windows\\CurrentVersion", 0, access, &hkey);
3447 if (res == ERROR_SUCCESS)
3448 {
3449 *owner = reg_get_val_str(hkey, "RegisteredOwner");
3450 *company = reg_get_val_str(hkey, "RegisteredOrganization");
3451 RegCloseKey(hkey);
3452 }
3453 }
3454}
3455
3456static void test_register_user(void)
3457{
3458 UINT r;
3459 LONG res;
3460 HKEY props;
3461 LPSTR usersid;
3462 LPSTR owner, company;
3463 CHAR keypath[MAX_PATH];
3465
3466 static const CHAR keypropsfmt[] =
3467 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
3468 "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties";
3469 static const CHAR keypridfmt[] =
3470 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
3471 "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3472
3473 if (is_process_limited())
3474 {
3475 skip("process is limited\n");
3476 return;
3477 }
3478
3479 if (!(usersid = get_user_sid()))
3480 return;
3481
3482 get_owner_company(&owner, &company);
3483
3484 CreateDirectoryA("msitest", NULL);
3485 create_file("msitest\\maximus", 500);
3486
3488
3489 if (is_wow64)
3491
3493
3494 /* RegisterUser, per-user */
3495 r = MsiInstallProductA(msifile, "REGISTER_USER=1");
3497 {
3498 skip("Not enough rights to perform tests\n");
3499 goto error;
3500 }
3501 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3502 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3503 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3504
3505 sprintf(keypath, keypropsfmt, usersid);
3507 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3508
3509 CHECK_REG_STR(props, "ProductID", "none");
3510 CHECK_REG_STR(props, "RegCompany", company);
3511 CHECK_REG_STR(props, "RegOwner", owner);
3512
3513 RegDeleteValueA(props, "ProductID");
3514 RegDeleteValueA(props, "RegCompany");
3515 RegDeleteValueA(props, "RegOwner");
3516 delete_key(props, "", access);
3518 sprintf(keypath, keypridfmt, usersid);
3520
3521 /* RegisterUser, machine */
3522 r = MsiInstallProductA(msifile, "REGISTER_USER=1 ALLUSERS=1");
3523 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3524 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3525 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3526
3527 sprintf(keypath, keypropsfmt, "S-1-5-18");
3529 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3530
3531 CHECK_REG_STR(props, "ProductID", "none");
3532 CHECK_REG_STR(props, "RegCompany", company);
3533 CHECK_REG_STR(props, "RegOwner", owner);
3534
3535 RegDeleteValueA(props, "ProductID");
3536 RegDeleteValueA(props, "RegCompany");
3537 RegDeleteValueA(props, "RegOwner");
3538 delete_key(props, "", access);
3540 sprintf(keypath, keypridfmt, "S-1-5-18");
3542
3543error:
3544 free(company);
3545 free(owner);
3546
3548 DeleteFileA("msitest\\maximus");
3549 RemoveDirectoryA("msitest");
3550 LocalFree(usersid);
3551}
3552
3554{
3555 static const char keyfmt[] =
3556 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Components\\%s";
3557 static const char compkey[] =
3558 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Components";
3559 UINT r;
3560 LONG res;
3561 DWORD size;
3562 HKEY comp, hkey;
3563 LPSTR usersid;
3564 CHAR val[MAX_PATH];
3565 CHAR keypath[MAX_PATH];
3566 CHAR program_files_maximus[MAX_PATH];
3568
3569 if (is_process_limited())
3570 {
3571 skip("process is limited\n");
3572 return;
3573 }
3574
3575 if (!(usersid = get_user_sid()))
3576 return;
3577
3578 CreateDirectoryA("msitest", NULL);
3579 create_file("msitest\\maximus", 500);
3580
3582
3583 if (is_wow64)
3585
3587
3588 /* ProcessComponents, per-user */
3589 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1");
3591 {
3592 skip("Not enough rights to perform tests\n");
3593 goto error;
3594 }
3595 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3596 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3597 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3598
3599 sprintf(keypath, keyfmt, usersid, "CBABC2FDCCB35E749A8944D8C1C098B5");
3600 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp);
3601 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3602
3603 size = MAX_PATH;
3604 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3605 NULL, NULL, (LPBYTE)val, &size);
3606 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3607
3608 lstrcpyA(program_files_maximus,PROG_FILES_DIR);
3609 lstrcatA(program_files_maximus,"\\msitest\\maximus");
3610
3611 ok(!lstrcmpiA(val, program_files_maximus),
3612 "Expected \"%s\", got \"%s\"\n", program_files_maximus, val);
3613
3614 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey);
3615 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3616
3617 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3618 delete_key(comp, "", access);
3619 RegCloseKey(comp);
3620
3621 sprintf(keypath, keyfmt, usersid, "241C3DA58FECD0945B9687D408766058");
3622 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp);
3623 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3624
3625 size = MAX_PATH;
3626 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3627 NULL, NULL, (LPBYTE)val, &size);
3628 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3629 ok(!lstrcmpA(val, "01\\msitest\\augustus"),
3630 "Expected \"01\\msitest\\augustus\", got \"%s\"\n", val);
3631
3632 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey);
3633 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3634
3635 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3636 delete_key(comp, "", access);
3637 RegCloseKey(comp);
3638
3639 /* ProcessComponents, machine */
3640 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1 ALLUSERS=1");
3641 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3642 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3643 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3644
3645 sprintf(keypath, keyfmt, "S-1-5-18", "CBABC2FDCCB35E749A8944D8C1C098B5");
3646 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp);
3647 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3648
3649 size = MAX_PATH;
3650 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3651 NULL, NULL, (LPBYTE)val, &size);
3652 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3653 ok(!lstrcmpiA(val, program_files_maximus),
3654 "Expected \"%s\", got \"%s\"\n", program_files_maximus, val);
3655
3656 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey);
3657 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3658
3659 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3660 delete_key(comp, "", access);
3661 RegCloseKey(comp);
3662
3663 sprintf(keypath, keyfmt, "S-1-5-18", "241C3DA58FECD0945B9687D408766058");
3664 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp);
3665 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3666
3667 size = MAX_PATH;
3668 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3669 NULL, NULL, (LPBYTE)val, &size);
3670 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3671 ok(!lstrcmpA(val, "01\\msitest\\augustus"),
3672 "Expected \"01\\msitest\\augustus\", got \"%s\"\n", val);
3673
3674 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey);
3675 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3676
3677 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3678 delete_key(comp, "", access);
3679 RegCloseKey(comp);
3680
3681error:
3683 DeleteFileA("msitest\\maximus");
3684 RemoveDirectoryA("msitest");
3685 LocalFree(usersid);
3686}
3687
3688static void test_publish(void)
3689{
3690 static const char subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
3691 static const char subkey_32node[] = "Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
3692 UINT r;
3693 LONG res;
3694 HKEY uninstall, prodkey, uninstall_32node = NULL;
3696 char date[MAX_PATH], temp[MAX_PATH], prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
3698 DWORD error;
3699
3700 if (!pMsiQueryFeatureStateExA)
3701 {
3702 win_skip("MsiQueryFeatureStateExA is not available\n");
3703 return;
3704 }
3705 if (is_process_limited())
3706 {
3707 skip("process is limited\n");
3708 return;
3709 }
3710
3713
3714 if (is_wow64)
3716
3717 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, subkey, 0, KEY_ALL_ACCESS, &uninstall);
3718 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3719
3720 if (is_64bit)
3721 {
3722 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, subkey_32node, 0, KEY_ALL_ACCESS, &uninstall_32node);
3723 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3724 }
3725
3726 CreateDirectoryA("msitest", NULL);
3727 create_file("msitest\\maximus", 500);
3728
3730
3732
3733 state = MsiQueryProductStateA(prodcode);
3734 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3735
3736 state = MsiQueryFeatureStateA(prodcode, "feature");
3737 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3738
3739 state = 0xdead;
3740 SetLastError(0xdeadbeef);
3741 r = pMsiQueryFeatureStateExA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, "feature", &state);
3742 error = GetLastError();
3743 ok(r == ERROR_UNKNOWN_PRODUCT, "got %u\n", r);
3744 ok(state == 0xdead, "got %d\n", state);
3745 ok(error == 0xdeadbeef, "got %lu\n", error);
3746
3747 state = 0xdead;
3748 SetLastError(0xdeadbeef);
3749 r = pMsiQueryFeatureStateExA(prodcode, NULL, MSIINSTALLCONTEXT_USERMANAGED, "feature", &state);
3750 error = GetLastError();
3751 ok(r == ERROR_UNKNOWN_PRODUCT, "got %u\n", r);
3752 ok(state == 0xdead, "got %d\n", state);
3753 ok(error == ERROR_SUCCESS, "got %lu\n", error);
3754
3755 state = 0xdead;
3756 SetLastError(0xdeadbeef);
3757 r = pMsiQueryFeatureStateExA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, "feature", &state);
3758 error = GetLastError();
3759 ok(r == ERROR_UNKNOWN_PRODUCT, "got %u\n", r);
3760 ok(state == 0xdead, "got %d\n", state);
3761 ok(error == ERROR_SUCCESS, "got %lu\n", error);
3762
3763 state = MsiQueryFeatureStateA(prodcode, "feature");
3764 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3765
3766 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3767 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3768
3769 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3770 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3771 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3772 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3773
3774 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
3775 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3776
3777 /* nothing published */
3780 {
3781 skip("Not enough rights to perform tests\n");
3782 goto error;
3783 }
3784 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3785 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3786 ok(pf_exists("msitest"), "File not installed\n");
3787
3788 state = MsiQueryProductStateA(prodcode);
3789 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3790
3791 state = MsiQueryFeatureStateA(prodcode, "feature");
3792 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3793
3794 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3795 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3796
3797 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3798 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3799 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3800 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3801
3802 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
3803 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3804
3805 /* PublishProduct and RegisterProduct */
3806 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 PUBLISH_PRODUCT=1");
3807 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3808 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3809 ok(pf_exists("msitest"), "File not installed\n");
3810
3811 state = MsiQueryProductStateA(prodcode);
3812 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3813
3814 state = MsiQueryFeatureStateA(prodcode, "feature");
3815 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3816
3817 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3818 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3819
3820 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3821 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3822 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
3823 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3824
3825 if (is_64bit)
3826 {
3827 res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3828 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3829 }
3830 else
3831 {
3832 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
3833 if (is_wow64 && res == ERROR_FILE_NOT_FOUND) /* XP - Vista, Wow64 */
3834 res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3835 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3836 }
3837
3838 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3839 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3840 CHECK_REG_STR(prodkey, "InstallDate", date);
3841 CHECK_REG_STR(prodkey, "InstallSource", temp);
3842 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3843 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3844 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3845 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", "");
3846 CHECK_REG_STR(prodkey, "Comments", "");
3847 CHECK_REG_STR(prodkey, "Contact", "");
3848 CHECK_REG_STR(prodkey, "HelpLink", "");
3849 CHECK_REG_STR(prodkey, "HelpTelephone", "");
3850 CHECK_REG_STR(prodkey, "InstallLocation", "");
3851 CHECK_REG_DWORD(prodkey, "NoModify", 1);
3852 CHECK_REG_STR(prodkey, "Readme", "");
3853 CHECK_REG_STR(prodkey, "Size", "");
3854 CHECK_REG_STR(prodkey, "URLInfoAbout", "");
3855 CHECK_REG_STR(prodkey, "URLUpdateInfo", "");
3856 CHECK_REG_DWORD(prodkey, "Language", 1033);
3857 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3858 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3859 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3860 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3861 CHECK_REG_DWORD_TODO(prodkey, "EstimatedSize", get_estimated_size());
3862
3863 RegCloseKey(prodkey);
3864
3865 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3866 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3867 ok(pf_exists("msitest\\maximus"), "File deleted\n");
3868 ok(pf_exists("msitest"), "File deleted\n");
3869
3870 state = MsiQueryProductStateA(prodcode);
3871 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3872
3873 state = MsiQueryFeatureStateA(prodcode, "feature");
3874 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3875
3876 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3877 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3878
3879 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3880 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3881 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3882 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3883
3884 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
3885 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3886
3887 /* complete install */
3888 r = MsiInstallProductA(msifile, "FULL=1");
3889 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3890 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3891 ok(pf_exists("msitest"), "File not installed\n");
3892
3893 state = MsiQueryProductStateA(prodcode);
3894 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3895
3896 state = MsiQueryFeatureStateA(prodcode, "feature");
3897 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3898
3899 state = 0xdead;
3900 SetLastError(0xdeadbeef);
3901 r = pMsiQueryFeatureStateExA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, "feature", &state);
3902 error = GetLastError();
3903 ok(r == ERROR_UNKNOWN_PRODUCT, "got %u\n", r);
3904 ok(state == 0xdead, "got %d\n", state);
3905 ok(error == 0xdeadbeef, "got %lu\n", error);
3906
3907 state = 0xdead;
3908 SetLastError(0xdeadbeef);
3909 r = pMsiQueryFeatureStateExA(prodcode, NULL, MSIINSTALLCONTEXT_USERMANAGED, "feature", &state);
3910 error = GetLastError();
3911 ok(r == ERROR_UNKNOWN_PRODUCT, "got %u\n", r);
3912 ok(state == 0xdead, "got %d\n", state);
3913 ok(error == ERROR_SUCCESS, "got %lu\n", error);
3914
3915 state = 0xdead;
3916 SetLastError(0xdeadbeef);
3917 r = pMsiQueryFeatureStateExA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, "feature", &state);
3918 error = GetLastError();
3919 ok(r == ERROR_SUCCESS, "got %u\n", r);
3920 ok(state == INSTALLSTATE_LOCAL, "got %d\n", state);
3921 ok(error == ERROR_SUCCESS, "got %lu\n", error);
3922
3923 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3924 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3925
3926 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3927 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3928 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3929 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3930
3931 if (is_64bit)
3932 {
3933 res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3934 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3935 }
3936 else
3937 {
3938 res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3939 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3940 }
3941
3942 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3943 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3944 CHECK_REG_STR(prodkey, "InstallDate", date);
3945 CHECK_REG_STR(prodkey, "InstallSource", temp);
3946 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3947 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3948 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3949 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", "");
3950 CHECK_REG_STR(prodkey, "Comments", "");
3951 CHECK_REG_STR(prodkey, "Contact", "");
3952 CHECK_REG_STR(prodkey, "HelpLink", "");
3953 CHECK_REG_STR(prodkey, "HelpTelephone", "");
3954 CHECK_REG_STR(prodkey, "InstallLocation", "");
3955 CHECK_REG_DWORD(prodkey, "NoModify", 1);
3956 CHECK_REG_STR(prodkey, "Readme", "");
3957 CHECK_REG_STR(prodkey, "Size", "");
3958 CHECK_REG_STR(prodkey, "URLInfoAbout", "");
3959 CHECK_REG_STR(prodkey, "URLUpdateInfo", "");
3960 CHECK_REG_DWORD(prodkey, "Language", 1033);
3961 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3962 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3963 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3964 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3965 CHECK_REG_DWORD_TODO(prodkey, "EstimatedSize", get_estimated_size());
3966
3967 RegCloseKey(prodkey);
3968
3969 /* no UnpublishFeatures */
3970 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3971 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3972 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3973 ok(!pf_exists("msitest"), "Directory not deleted\n");
3974
3975 state = MsiQueryProductStateA(prodcode);
3976 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3977
3978 state = MsiQueryFeatureStateA(prodcode, "feature");
3979 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3980
3981 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3982 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3983
3984 r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
3985 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3986