1 /* 2 * Copyright (C) 2006 James Hawkins 3 * 4 * A test program for installing MSI products. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19 */ 20 21 #include "precomp.h" 22 23 static UINT (WINAPI *pMsiQueryComponentStateA) 24 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPCSTR, INSTALLSTATE*); 25 static UINT (WINAPI *pMsiSourceListEnumSourcesA) 26 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD); 27 static INSTALLSTATE (WINAPI *pMsiGetComponentPathExA) 28 (LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPSTR, LPDWORD); 29 30 static BOOL (WINAPI *pCheckTokenMembership)(HANDLE,PSID,PBOOL); 31 static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*); 32 static BOOL (WINAPI *pOpenProcessToken)( HANDLE, DWORD, PHANDLE ); 33 static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD); 34 static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); 35 36 static HMODULE hsrclient = 0; 37 static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD); 38 static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*); 39 40 static BOOL is_wow64; 41 static const BOOL is_64bit = sizeof(void *) > sizeof(int); 42 43 static const char *msifile = "msitest.msi"; 44 static const char *msifile2 = "winetest2.msi"; 45 static const char *mstfile = "winetest.mst"; 46 47 static const WCHAR msifileW[] = {'m','s','i','t','e','s','t','.','m','s','i',0}; 48 static const WCHAR msifile2W[] = {'w','i','n','e','t','e','s','t','2','.','m','s','i',0}; 49 50 static CHAR CURR_DIR[MAX_PATH]; 51 static CHAR PROG_FILES_DIR[MAX_PATH]; 52 static CHAR PROG_FILES_DIR_NATIVE[MAX_PATH]; 53 static CHAR COMMON_FILES_DIR[MAX_PATH]; 54 static CHAR APP_DATA_DIR[MAX_PATH]; 55 static CHAR WINDOWS_DIR[MAX_PATH]; 56 57 /* msi database data */ 58 59 static const CHAR component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 60 "s72\tS38\ts72\ti2\tS255\tS72\n" 61 "Component\tComponent\n" 62 "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n" 63 "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n" 64 "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\tNOT REINSTALL\tone.txt\n" 65 "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n" 66 "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n" 67 "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n" 68 "component\t\tMSITESTDIR\t0\t1\tfile\n" 69 "service_comp\t\tMSITESTDIR\t0\t1\tservice_file"; 70 71 static const CHAR directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n" 72 "s72\tS72\tl255\n" 73 "Directory\tDirectory\n" 74 "CABOUTDIR\tMSITESTDIR\tcabout\n" 75 "CHANGEDDIR\tMSITESTDIR\tchanged:second\n" 76 "FIRSTDIR\tMSITESTDIR\tfirst\n" 77 "MSITESTDIR\tProgramFilesFolder\tmsitest\n" 78 "NEWDIR\tCABOUTDIR\tnew\n" 79 "ProgramFilesFolder\tTARGETDIR\t.\n" 80 "TARGETDIR\t\tSourceDir"; 81 82 static const CHAR feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 83 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 84 "Feature\tFeature\n" 85 "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n" 86 "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n" 87 "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n" 88 "Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n" 89 "Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n" 90 "feature\t\t\t\t2\t1\tTARGETDIR\t0\n" 91 "service_feature\t\t\t\t2\t1\tTARGETDIR\t0"; 92 93 static const CHAR feature_comp_dat[] = "Feature_\tComponent_\n" 94 "s38\ts72\n" 95 "FeatureComponents\tFeature_\tComponent_\n" 96 "Five\tFive\n" 97 "Four\tFour\n" 98 "One\tOne\n" 99 "Three\tThree\n" 100 "Two\tTwo\n" 101 "feature\tcomponent\n" 102 "service_feature\tservice_comp\n"; 103 104 static const CHAR file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 105 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 106 "File\tFile\n" 107 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n" 108 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n" 109 "one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n" 110 "three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n" 111 "two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n" 112 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n" 113 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1"; 114 115 static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 116 "s72\tS255\tI2\n" 117 "InstallExecuteSequence\tAction\n" 118 "AllocateRegistrySpace\tNOT Installed\t1550\n" 119 "CostFinalize\t\t1000\n" 120 "CostInitialize\t\t800\n" 121 "FileCost\t\t900\n" 122 "ResolveSource\t\t950\n" 123 "MoveFiles\t\t1700\n" 124 "InstallFiles\t\t4000\n" 125 "DuplicateFiles\t\t4500\n" 126 "WriteEnvironmentStrings\t\t4550\n" 127 "CreateShortcuts\t\t4600\n" 128 "InstallServices\t\t5000\n" 129 "InstallFinalize\t\t6600\n" 130 "InstallInitialize\t\t1500\n" 131 "InstallValidate\t\t1400\n" 132 "LaunchConditions\t\t100\n" 133 "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000"; 134 135 static const CHAR media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 136 "i2\ti4\tL64\tS255\tS32\tS72\n" 137 "Media\tDiskId\n" 138 "1\t3\t\t\tDISK1\t\n" 139 "2\t5\t\tmsitest.cab\tDISK2\t\n"; 140 141 static const CHAR property_dat[] = "Property\tValue\n" 142 "s72\tl0\n" 143 "Property\tProperty\n" 144 "DefaultUIFont\tDlgFont8\n" 145 "HASUIRUN\t0\n" 146 "INSTALLLEVEL\t3\n" 147 "InstallMode\tTypical\n" 148 "Manufacturer\tWine\n" 149 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" 150 "PRIMARYFOLDER\tTARGETDIR\n" 151 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" 152 "ProductID\tnone\n" 153 "ProductLanguage\t1033\n" 154 "ProductName\tMSITEST\n" 155 "ProductVersion\t1.1.1\n" 156 "PROMPTROLLBACKCOST\tP\n" 157 "Setup\tSetup\n" 158 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" 159 "AdminProperties\tPOSTADMIN\n" 160 "ROOTDRIVE\tC:\\\n" 161 "SERVNAME\tTestService\n" 162 "SERVDISP\tTestServiceDisp\n" 163 "MSIFASTINSTALL\t1\n"; 164 165 static const CHAR aup_property_dat[] = "Property\tValue\n" 166 "s72\tl0\n" 167 "Property\tProperty\n" 168 "DefaultUIFont\tDlgFont8\n" 169 "HASUIRUN\t0\n" 170 "ALLUSERS\t1\n" 171 "INSTALLLEVEL\t3\n" 172 "InstallMode\tTypical\n" 173 "Manufacturer\tWine\n" 174 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" 175 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" 176 "ProductID\tnone\n" 177 "ProductLanguage\t1033\n" 178 "ProductName\tMSITEST\n" 179 "ProductVersion\t1.1.1\n" 180 "PROMPTROLLBACKCOST\tP\n" 181 "Setup\tSetup\n" 182 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" 183 "AdminProperties\tPOSTADMIN\n" 184 "ROOTDRIVE\tC:\\\n" 185 "SERVNAME\tTestService\n" 186 "SERVDISP\tTestServiceDisp\n" 187 "MSIFASTINSTALL\t1\n"; 188 189 static const CHAR aup2_property_dat[] = "Property\tValue\n" 190 "s72\tl0\n" 191 "Property\tProperty\n" 192 "DefaultUIFont\tDlgFont8\n" 193 "HASUIRUN\t0\n" 194 "ALLUSERS\t2\n" 195 "INSTALLLEVEL\t3\n" 196 "InstallMode\tTypical\n" 197 "Manufacturer\tWine\n" 198 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" 199 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" 200 "ProductID\tnone\n" 201 "ProductLanguage\t1033\n" 202 "ProductName\tMSITEST\n" 203 "ProductVersion\t1.1.1\n" 204 "PROMPTROLLBACKCOST\tP\n" 205 "Setup\tSetup\n" 206 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" 207 "AdminProperties\tPOSTADMIN\n" 208 "ROOTDRIVE\tC:\\\n" 209 "SERVNAME\tTestService\n" 210 "SERVDISP\tTestServiceDisp\n" 211 "MSIFASTINSTALL\t1\n"; 212 213 static const CHAR icon_property_dat[] = "Property\tValue\n" 214 "s72\tl0\n" 215 "Property\tProperty\n" 216 "DefaultUIFont\tDlgFont8\n" 217 "HASUIRUN\t0\n" 218 "INSTALLLEVEL\t3\n" 219 "InstallMode\tTypical\n" 220 "Manufacturer\tWine\n" 221 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" 222 "ProductCode\t{7DF88A49-996F-4EC8-A022-BF956F9B2CBB}\n" 223 "ProductID\tnone\n" 224 "ProductLanguage\t1033\n" 225 "ProductName\tMSITEST\n" 226 "ProductVersion\t1.1.1\n" 227 "PROMPTROLLBACKCOST\tP\n" 228 "Setup\tSetup\n" 229 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" 230 "AdminProperties\tPOSTADMIN\n" 231 "ROOTDRIVE\tC:\\\n" 232 "SERVNAME\tTestService\n" 233 "SERVDISP\tTestServiceDisp\n" 234 "MSIFASTINSTALL\t1\n"; 235 236 static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n" 237 "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n" 238 "Shortcut\tShortcut\n" 239 "Shortcut\tMSITESTDIR\tShortcut\tcomponent\tShortcut\t\tShortcut\t\t\t\t\t\n"; 240 241 static const CHAR condition_dat[] = "Feature_\tLevel\tCondition\n" 242 "s38\ti2\tS255\n" 243 "Condition\tFeature_\tLevel\n" 244 "One\t4\t1\n"; 245 246 static const CHAR up_property_dat[] = "Property\tValue\n" 247 "s72\tl0\n" 248 "Property\tProperty\n" 249 "DefaultUIFont\tDlgFont8\n" 250 "HASUIRUN\t0\n" 251 "INSTALLLEVEL\t3\n" 252 "InstallMode\tTypical\n" 253 "Manufacturer\tWine\n" 254 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" 255 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" 256 "ProductID\tnone\n" 257 "ProductLanguage\t1033\n" 258 "ProductName\tMSITEST\n" 259 "ProductVersion\t1.1.1\n" 260 "PROMPTROLLBACKCOST\tP\n" 261 "Setup\tSetup\n" 262 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" 263 "AdminProperties\tPOSTADMIN\n" 264 "ROOTDRIVE\tC:\\\n" 265 "SERVNAME\tTestService\n" 266 "SERVDISP\tTestServiceDisp\n" 267 "RemovePreviousVersions\t1\n" 268 "MSIFASTINSTALL\t1\n"; 269 270 static const CHAR up2_property_dat[] = "Property\tValue\n" 271 "s72\tl0\n" 272 "Property\tProperty\n" 273 "DefaultUIFont\tDlgFont8\n" 274 "HASUIRUN\t0\n" 275 "INSTALLLEVEL\t3\n" 276 "InstallMode\tTypical\n" 277 "Manufacturer\tWine\n" 278 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" 279 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" 280 "ProductID\tnone\n" 281 "ProductLanguage\t1033\n" 282 "ProductName\tMSITEST\n" 283 "ProductVersion\t1.1.2\n" 284 "PROMPTROLLBACKCOST\tP\n" 285 "Setup\tSetup\n" 286 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" 287 "AdminProperties\tPOSTADMIN\n" 288 "ROOTDRIVE\tC:\\\n" 289 "SERVNAME\tTestService\n" 290 "SERVDISP\tTestServiceDisp\n" 291 "MSIFASTINSTALL\t1\n"; 292 293 static const CHAR up3_property_dat[] = "Property\tValue\n" 294 "s72\tl0\n" 295 "Property\tProperty\n" 296 "DefaultUIFont\tDlgFont8\n" 297 "HASUIRUN\t0\n" 298 "INSTALLLEVEL\t3\n" 299 "InstallMode\tTypical\n" 300 "Manufacturer\tWine\n" 301 "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" 302 "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" 303 "ProductID\tnone\n" 304 "ProductLanguage\t1033\n" 305 "ProductName\tMSITEST\n" 306 "ProductVersion\t1.1.2\n" 307 "PROMPTROLLBACKCOST\tP\n" 308 "Setup\tSetup\n" 309 "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" 310 "AdminProperties\tPOSTADMIN\n" 311 "ROOTDRIVE\tC:\\\n" 312 "SERVNAME\tTestService\n" 313 "SERVDISP\tTestServiceDisp\n" 314 "RemovePreviousVersions\t1\n" 315 "MSIFASTINSTALL\t1\n"; 316 317 static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n" 318 "s72\ti2\tl255\tL255\tL0\ts72\n" 319 "Registry\tRegistry\n" 320 "Apples\t1\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n" 321 "Oranges\t1\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n" 322 "regdata\t1\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n" 323 "OrderTest\t1\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent"; 324 325 static const CHAR service_install_dat[] = "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t" 326 "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n" 327 "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n" 328 "ServiceInstall\tServiceInstall\n" 329 "TestService\t[SERVNAME]\t[SERVDISP]\t2\t3\t0\t\t\tTestService\t\t\tservice_comp\t\t"; 330 331 static const CHAR service_control_dat[] = "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n" 332 "s72\tl255\ti2\tL255\tI2\ts72\n" 333 "ServiceControl\tServiceControl\n" 334 "ServiceControl\tTestService\t8\t\t0\tservice_comp"; 335 336 /* tables for test_continuouscabs */ 337 static const CHAR cc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 338 "s72\tS38\ts72\ti2\tS255\tS72\n" 339 "Component\tComponent\n" 340 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n" 341 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n" 342 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"; 343 344 static const CHAR cc2_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 345 "s72\tS38\ts72\ti2\tS255\tS72\n" 346 "Component\tComponent\n" 347 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n" 348 "augustus\t\tMSITESTDIR\t0\t0\taugustus\n" 349 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"; 350 351 static const CHAR cc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 352 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 353 "Feature\tFeature\n" 354 "feature\t\t\t\t2\t1\tTARGETDIR\t0"; 355 356 static const CHAR cc_feature_comp_dat[] = "Feature_\tComponent_\n" 357 "s38\ts72\n" 358 "FeatureComponents\tFeature_\tComponent_\n" 359 "feature\tmaximus\n" 360 "feature\taugustus\n" 361 "feature\tcaesar"; 362 363 static const CHAR cc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 364 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 365 "File\tFile\n" 366 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n" 367 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n" 368 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12"; 369 370 static const CHAR cc2_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 371 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 372 "File\tFile\n" 373 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n" 374 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n" 375 "tiberius\tmaximus\ttiberius\t500\t\t\t16384\t3\n" 376 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12"; 377 378 static const CHAR cc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 379 "i2\ti4\tL64\tS255\tS32\tS72\n" 380 "Media\tDiskId\n" 381 "1\t10\t\ttest1.cab\tDISK1\t\n" 382 "2\t2\t\ttest2.cab\tDISK2\t\n" 383 "3\t12\t\ttest3.cab\tDISK3\t\n"; 384 385 static const CHAR cc3_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 386 "i2\ti4\tL64\tS255\tS32\tS72\n" 387 "Media\tDiskId\n" 388 "1\t10\t\ttest1.cab\tDISK1\t\n" 389 "2\t2\t\ttest2_.cab\tDISK2\t\n" 390 "3\t12\t\ttest3.cab\tDISK3\t\n"; 391 392 static const CHAR co_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 393 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 394 "File\tFile\n" 395 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n" 396 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n" 397 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3"; 398 399 static const CHAR co_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 400 "i2\ti4\tL64\tS255\tS32\tS72\n" 401 "Media\tDiskId\n" 402 "1\t10\t\ttest1.cab\tDISK1\t\n" 403 "2\t2\t\ttest2.cab\tDISK2\t\n" 404 "3\t3\t\ttest3.cab\tDISK3\t\n"; 405 406 static const CHAR co2_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 407 "i2\ti4\tL64\tS255\tS32\tS72\n" 408 "Media\tDiskId\n" 409 "1\t10\t\ttest1.cab\tDISK1\t\n" 410 "2\t12\t\ttest3.cab\tDISK3\t\n" 411 "3\t2\t\ttest2.cab\tDISK2\t\n"; 412 413 static const CHAR mm_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 414 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 415 "File\tFile\n" 416 "maximus\tmaximus\tmaximus\t500\t\t\t512\t1\n" 417 "augustus\taugustus\taugustus\t500\t\t\t512\t2\n" 418 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3"; 419 420 static const CHAR mm_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 421 "i2\ti4\tL64\tS255\tS32\tS72\n" 422 "Media\tDiskId\n" 423 "1\t3\t\ttest1.cab\tDISK1\t\n"; 424 425 static const CHAR ss_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 426 "i2\ti4\tL64\tS255\tS32\tS72\n" 427 "Media\tDiskId\n" 428 "1\t2\t\ttest1.cab\tDISK1\t\n" 429 "2\t2\t\ttest2.cab\tDISK2\t\n" 430 "3\t12\t\ttest3.cab\tDISK3\t\n"; 431 432 /* tables for test_uiLevelFlags */ 433 static const CHAR ui_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 434 "s72\tS38\ts72\ti2\tS255\tS72\n" 435 "Component\tComponent\n" 436 "maximus\t\tMSITESTDIR\t0\tHASUIRUN=1\tmaximus\n" 437 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n" 438 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n"; 439 440 static const CHAR ui_install_ui_seq_dat[] = "Action\tCondition\tSequence\n" 441 "s72\tS255\tI2\n" 442 "InstallUISequence\tAction\n" 443 "SetUIProperty\t\t5\n" 444 "ExecuteAction\t\t1100\n"; 445 446 static const CHAR ui_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" 447 "s72\ti2\tS64\tS0\tS255\n" 448 "CustomAction\tAction\n" 449 "SetUIProperty\t51\tHASUIRUN\t1\t\n"; 450 451 static const CHAR rof_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 452 "s72\tS38\ts72\ti2\tS255\tS72\n" 453 "Component\tComponent\n" 454 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"; 455 456 static const CHAR rof_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 457 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 458 "Feature\tFeature\n" 459 "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n" 460 "montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0"; 461 462 static const CHAR rof_feature_comp_dat[] = "Feature_\tComponent_\n" 463 "s38\ts72\n" 464 "FeatureComponents\tFeature_\tComponent_\n" 465 "feature\tmaximus\n" 466 "montecristo\tmaximus"; 467 468 static const CHAR rof_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 469 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 470 "File\tFile\n" 471 "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1"; 472 473 static const CHAR rof_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 474 "i2\ti4\tL64\tS255\tS32\tS72\n" 475 "Media\tDiskId\n" 476 "1\t1\t\t\tDISK1\t\n"; 477 478 static const CHAR rofc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 479 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 480 "File\tFile\n" 481 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1"; 482 483 static const CHAR rofc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 484 "i2\ti4\tL64\tS255\tS32\tS72\n" 485 "Media\tDiskId\n" 486 "1\t1\t\ttest1.cab\tDISK1\t\n"; 487 488 static const CHAR sdp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 489 "s72\tS255\tI2\n" 490 "InstallExecuteSequence\tAction\n" 491 "AllocateRegistrySpace\tNOT Installed\t1550\n" 492 "CostFinalize\t\t1000\n" 493 "CostInitialize\t\t800\n" 494 "FileCost\t\t900\n" 495 "InstallFiles\t\t4000\n" 496 "InstallFinalize\t\t6600\n" 497 "InstallInitialize\t\t1500\n" 498 "InstallValidate\t\t1400\n" 499 "LaunchConditions\t\t100\n" 500 "SetDirProperty\t\t950"; 501 502 static const CHAR sdp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" 503 "s72\ti2\tS64\tS0\tS255\n" 504 "CustomAction\tAction\n" 505 "SetDirProperty\t51\tMSITESTDIR\t[CommonFilesFolder]msitest\\\t\n"; 506 507 static const CHAR pv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 508 "s72\tS255\tI2\n" 509 "InstallExecuteSequence\tAction\n" 510 "LaunchConditions\t\t100\n" 511 "CostInitialize\t\t800\n" 512 "FileCost\t\t900\n" 513 "CostFinalize\t\t1000\n" 514 "InstallValidate\t\t1400\n" 515 "InstallInitialize\t\t1500\n" 516 "InstallFiles\t\t4000\n" 517 "InstallFinalize\t\t6600\n"; 518 519 static const CHAR cie_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 520 "s72\tS38\ts72\ti2\tS255\tS72\n" 521 "Component\tComponent\n" 522 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n" 523 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n" 524 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n" 525 "gaius\t\tMSITESTDIR\t0\t1\tgaius\n"; 526 527 static const CHAR cie_feature_comp_dat[] = "Feature_\tComponent_\n" 528 "s38\ts72\n" 529 "FeatureComponents\tFeature_\tComponent_\n" 530 "feature\tmaximus\n" 531 "feature\taugustus\n" 532 "feature\tcaesar\n" 533 "feature\tgaius"; 534 535 static const CHAR cie_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 536 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 537 "File\tFile\n" 538 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n" 539 "augustus\taugustus\taugustus\t50000\t\t\t16384\t2\n" 540 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t12\n" 541 "gaius\tgaius\tgaius\t500\t\t\t8192\t11"; 542 543 static const CHAR cie_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 544 "i2\ti4\tL64\tS255\tS32\tS72\n" 545 "Media\tDiskId\n" 546 "1\t1\t\ttest1.cab\tDISK1\t\n" 547 "2\t2\t\ttest2.cab\tDISK2\t\n" 548 "3\t12\t\ttest3.cab\tDISK3\t\n"; 549 550 static const CHAR ci_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 551 "s72\tS38\ts72\ti2\tS255\tS72\n" 552 "Component\tComponent\n" 553 "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n"; 554 555 static const CHAR ci2_feature_comp_dat[] = "Feature_\tComponent_\n" 556 "s38\ts72\n" 557 "FeatureComponents\tFeature_\tComponent_\n" 558 "feature\taugustus"; 559 560 static const CHAR ci2_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 561 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 562 "File\tFile\n" 563 "augustus\taugustus\taugustus\t500\t\t\t8192\t1"; 564 565 static const CHAR pp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 566 "s72\tS255\tI2\n" 567 "InstallExecuteSequence\tAction\n" 568 "ValidateProductID\t\t700\n" 569 "CostInitialize\t\t800\n" 570 "FileCost\t\t900\n" 571 "CostFinalize\t\t1000\n" 572 "InstallValidate\t\t1400\n" 573 "InstallInitialize\t\t1500\n" 574 "ProcessComponents\tPROCESS_COMPONENTS=1 Or FULL=1\t1600\n" 575 "UnpublishFeatures\tUNPUBLISH_FEATURES=1 Or FULL=1\t1800\n" 576 "RemoveFiles\t\t3500\n" 577 "InstallFiles\t\t4000\n" 578 "RegisterUser\tREGISTER_USER=1 Or FULL=1\t6000\n" 579 "RegisterProduct\tREGISTER_PRODUCT=1 Or FULL=1\t6100\n" 580 "PublishFeatures\tPUBLISH_FEATURES=1 Or FULL=1\t6300\n" 581 "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n" 582 "InstallFinalize\t\t6600"; 583 584 static const CHAR tp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 585 "s72\tS38\ts72\ti2\tS255\tS72\n" 586 "Component\tComponent\n" 587 "augustus\t\tMSITESTDIR\t0\tprop=\"val\"\taugustus\n"; 588 589 static const CHAR cwd_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 590 "s72\tS38\ts72\ti2\tS255\tS72\n" 591 "Component\tComponent\n" 592 "augustus\t\tMSITESTDIR\t0\t\taugustus\n"; 593 594 static const CHAR adm_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 595 "s72\tS38\ts72\ti2\tS255\tS72\n" 596 "Component\tComponent\n" 597 "augustus\t\tMSITESTDIR\t0\tPOSTADMIN=1\taugustus"; 598 599 static const CHAR adm_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" 600 "s72\ti2\tS64\tS0\tS255\n" 601 "CustomAction\tAction\n" 602 "SetPOSTADMIN\t51\tPOSTADMIN\t1\t\n"; 603 604 static const CHAR adm_admin_exec_seq_dat[] = "Action\tCondition\tSequence\n" 605 "s72\tS255\tI2\n" 606 "AdminExecuteSequence\tAction\n" 607 "CostFinalize\t\t1000\n" 608 "CostInitialize\t\t800\n" 609 "FileCost\t\t900\n" 610 "SetPOSTADMIN\t\t950\n" 611 "InstallFiles\t\t4000\n" 612 "InstallFinalize\t\t6600\n" 613 "InstallInitialize\t\t1500\n" 614 "InstallValidate\t\t1400\n" 615 "LaunchConditions\t\t100"; 616 617 static const CHAR amp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 618 "s72\tS38\ts72\ti2\tS255\tS72\n" 619 "Component\tComponent\n" 620 "augustus\t\tMSITESTDIR\t0\tMYPROP=2718 and MyProp=42\taugustus\n"; 621 622 static const CHAR rem_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 623 "s72\tS255\tI2\n" 624 "InstallExecuteSequence\tAction\n" 625 "ValidateProductID\t\t700\n" 626 "CostInitialize\t\t800\n" 627 "FileCost\t\t900\n" 628 "CostFinalize\t\t1000\n" 629 "InstallValidate\t\t1400\n" 630 "InstallInitialize\t\t1500\n" 631 "ProcessComponents\t\t1600\n" 632 "UnpublishFeatures\t\t1800\n" 633 "RemoveFiles\t\t3500\n" 634 "InstallFiles\t\t4000\n" 635 "RegisterProduct\t\t6100\n" 636 "PublishFeatures\t\t6300\n" 637 "PublishProduct\t\t6400\n" 638 "InstallFinalize\t\t6600"; 639 640 static const CHAR mc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 641 "s72\tS38\ts72\ti2\tS255\tS72\n" 642 "Component\tComponent\n" 643 "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n" 644 "augustus\t\tMSITESTDIR\t0\t1\taugustus\n" 645 "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n" 646 "gaius\t\tMSITESTDIR\t0\tGAIUS=1\tgaius\n" 647 "tiberius\t\tMSITESTDIR\t0\t\ttiberius\n"; 648 649 static const CHAR mc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 650 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 651 "File\tFile\n" 652 "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n" 653 "augustus\taugustus\taugustus\t500\t\t\t0\t2\n" 654 "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3\n" 655 "gaius\tgaius\tgaius\t500\t\t\t16384\t4\n" 656 "tiberius\ttiberius\ttiberius\t500\t\t\t0\t5\n"; 657 658 static const CHAR mc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 659 "i2\ti4\tL64\tS255\tS32\tS72\n" 660 "Media\tDiskId\n" 661 "1\t1\t\ttest1.cab\tDISK1\t\n" 662 "2\t2\t\ttest2.cab\tDISK2\t\n" 663 "3\t3\t\ttest3.cab\tDISK3\t\n" 664 "4\t4\t\ttest3.cab\tDISK3\t\n" 665 "5\t5\t\ttest4.cab\tDISK4\t\n"; 666 667 static const CHAR mc_file_hash_dat[] = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n" 668 "s72\ti2\ti4\ti4\ti4\ti4\n" 669 "MsiFileHash\tFile_\n" 670 "caesar\t0\t850433704\t-241429251\t675791761\t-1221108824"; 671 672 static const CHAR wrv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 673 "s72\tS38\ts72\ti2\tS255\tS72\n" 674 "Component\tComponent\n" 675 "augustus\t\tMSITESTDIR\t0\t\taugustus\n"; 676 677 static const CHAR ca51_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 678 "s72\tS38\ts72\ti2\tS255\tS72\n" 679 "Component\tComponent\n" 680 "augustus\t\tMSITESTDIR\t0\tMYPROP=42\taugustus\n"; 681 682 static const CHAR ca51_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 683 "s72\tS255\tI2\n" 684 "InstallExecuteSequence\tAction\n" 685 "ValidateProductID\t\t700\n" 686 "GoodSetProperty\t\t725\n" 687 "BadSetProperty\t\t750\n" 688 "CostInitialize\t\t800\n" 689 "ResolveSource\t\t810\n" 690 "FileCost\t\t900\n" 691 "SetSourceDir\tSRCDIR\t910\n" 692 "CostFinalize\t\t1000\n" 693 "InstallValidate\t\t1400\n" 694 "InstallInitialize\t\t1500\n" 695 "InstallFiles\t\t4000\n" 696 "InstallFinalize\t\t6600"; 697 698 static const CHAR ca51_custom_action_dat[] = "Action\tType\tSource\tTarget\n" 699 "s72\ti2\tS64\tS0\n" 700 "CustomAction\tAction\n" 701 "GoodSetProperty\t51\tMYPROP\t42\n" 702 "BadSetProperty\t51\t\tMYPROP\n" 703 "SetSourceDir\t51\tSourceDir\t[SRCDIR]\n"; 704 705 static const CHAR is_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 706 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 707 "Feature\tFeature\n" 708 "one\t\t\t\t2\t1\t\t0\n" /* favorLocal */ 709 "two\t\t\t\t2\t1\t\t1\n" /* favorSource */ 710 "three\t\t\t\t2\t1\t\t4\n" /* favorAdvertise */ 711 "four\t\t\t\t2\t0\t\t0"; /* disabled */ 712 713 static const CHAR is_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 714 "s72\tS38\ts72\ti2\tS255\tS72\n" 715 "Component\tComponent\n" 716 "alpha\t\tMSITESTDIR\t0\t\talpha_file\n" /* favorLocal:Local */ 717 "beta\t\tMSITESTDIR\t1\t\tbeta_file\n" /* favorLocal:Source */ 718 "gamma\t\tMSITESTDIR\t2\t\tgamma_file\n" /* favorLocal:Optional */ 719 "theta\t\tMSITESTDIR\t0\t\ttheta_file\n" /* favorSource:Local */ 720 "delta\t\tMSITESTDIR\t1\t\tdelta_file\n" /* favorSource:Source */ 721 "epsilon\t\tMSITESTDIR\t2\t\tepsilon_file\n" /* favorSource:Optional */ 722 "zeta\t\tMSITESTDIR\t0\t\tzeta_file\n" /* favorAdvertise:Local */ 723 "iota\t\tMSITESTDIR\t1\t\tiota_file\n" /* favorAdvertise:Source */ 724 "eta\t\tMSITESTDIR\t2\t\teta_file\n" /* favorAdvertise:Optional */ 725 "kappa\t\tMSITESTDIR\t0\t\tkappa_file\n" /* disabled:Local */ 726 "lambda\t\tMSITESTDIR\t1\t\tlambda_file\n" /* disabled:Source */ 727 "mu\t\tMSITESTDIR\t2\t\tmu_file\n"; /* disabled:Optional */ 728 729 static const CHAR is_feature_comp_dat[] = "Feature_\tComponent_\n" 730 "s38\ts72\n" 731 "FeatureComponents\tFeature_\tComponent_\n" 732 "one\talpha\n" 733 "one\tbeta\n" 734 "one\tgamma\n" 735 "two\ttheta\n" 736 "two\tdelta\n" 737 "two\tepsilon\n" 738 "three\tzeta\n" 739 "three\tiota\n" 740 "three\teta\n" 741 "four\tkappa\n" 742 "four\tlambda\n" 743 "four\tmu"; 744 745 static const CHAR is_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 746 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 747 "File\tFile\n" 748 "alpha_file\talpha\talpha\t500\t\t\t8192\t1\n" 749 "beta_file\tbeta\tbeta\t500\t\t\t8291\t2\n" 750 "gamma_file\tgamma\tgamma\t500\t\t\t8192\t3\n" 751 "theta_file\ttheta\ttheta\t500\t\t\t8192\t4\n" 752 "delta_file\tdelta\tdelta\t500\t\t\t8192\t5\n" 753 "epsilon_file\tepsilon\tepsilon\t500\t\t\t8192\t6\n" 754 "zeta_file\tzeta\tzeta\t500\t\t\t8192\t7\n" 755 "iota_file\tiota\tiota\t500\t\t\t8192\t8\n" 756 "eta_file\teta\teta\t500\t\t\t8192\t9\n" 757 "kappa_file\tkappa\tkappa\t500\t\t\t8192\t10\n" 758 "lambda_file\tlambda\tlambda\t500\t\t\t8192\t11\n" 759 "mu_file\tmu\tmu\t500\t\t\t8192\t12"; 760 761 static const CHAR is_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" 762 "i2\ti4\tL64\tS255\tS32\tS72\n" 763 "Media\tDiskId\n" 764 "1\t12\t\t\tDISK1\t\n"; 765 766 static const CHAR sp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 767 "s72\tS38\ts72\ti2\tS255\tS72\n" 768 "Component\tComponent\n" 769 "augustus\t\tTWODIR\t0\t\taugustus\n"; 770 771 static const CHAR sp_directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n" 772 "s72\tS72\tl255\n" 773 "Directory\tDirectory\n" 774 "TARGETDIR\t\tSourceDir\n" 775 "ProgramFilesFolder\tTARGETDIR\t.\n" 776 "MSITESTDIR\tProgramFilesFolder\tmsitest:.\n" 777 "ONEDIR\tMSITESTDIR\t.:shortone|longone\n" 778 "TWODIR\tONEDIR\t.:shorttwo|longtwo"; 779 780 static const CHAR mcp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 781 "s72\tS38\ts72\ti2\tS255\tS72\n" 782 "Component\tComponent\n" 783 "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t2\t\thydrogen\n" 784 "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t2\t\thelium\n" 785 "lithium\t{4AF28FFC-71C7-4307-BDE4-B77C5338F56F}\tMSITESTDIR\t2\tPROPVAR=42\tlithium\n"; 786 787 static const CHAR mcp_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 788 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 789 "Feature\tFeature\n" 790 "hydroxyl\t\thydroxyl\thydroxyl\t2\t1\tTARGETDIR\t0\n" 791 "heliox\t\theliox\theliox\t2\t5\tTARGETDIR\t0\n" 792 "lithia\t\tlithia\tlithia\t2\t10\tTARGETDIR\t0"; 793 794 static const CHAR mcp_feature_comp_dat[] = "Feature_\tComponent_\n" 795 "s38\ts72\n" 796 "FeatureComponents\tFeature_\tComponent_\n" 797 "hydroxyl\thydrogen\n" 798 "heliox\thelium\n" 799 "lithia\tlithium"; 800 801 static const CHAR mcp_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 802 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 803 "File\tFile\n" 804 "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n" 805 "helium\thelium\thelium\t0\t\t\t8192\t1\n" 806 "lithium\tlithium\tlithium\t0\t\t\t8192\t1\n" 807 "beryllium\tmissingcomp\tberyllium\t0\t\t\t8192\t1"; 808 809 static const CHAR ai_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 810 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 811 "File\tFile\n" 812 "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n" 813 "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n" 814 "one.txt\tOne\tone.txt\t1000\t\t\t16384\t1\n" 815 "three.txt\tThree\tthree.txt\t1000\t\t\t16384\t3\n" 816 "two.txt\tTwo\ttwo.txt\t1000\t\t\t16384\t2\n" 817 "file\tcomponent\tfilename\t100\t\t\t8192\t1\n" 818 "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1"; 819 820 static const CHAR ip_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 821 "s72\tS255\tI2\n" 822 "InstallExecuteSequence\tAction\n" 823 "CostFinalize\t\t1000\n" 824 "ValidateProductID\t\t700\n" 825 "CostInitialize\t\t800\n" 826 "FileCost\t\t900\n" 827 "RemoveFiles\t\t3500\n" 828 "InstallFiles\t\t4000\n" 829 "RegisterUser\t\t6000\n" 830 "RegisterProduct\t\t6100\n" 831 "PublishFeatures\t\t6300\n" 832 "PublishProduct\t\t6400\n" 833 "InstallFinalize\t\t6600\n" 834 "InstallInitialize\t\t1500\n" 835 "ProcessComponents\t\t1600\n" 836 "UnpublishFeatures\t\t1800\n" 837 "InstallValidate\t\t1400\n" 838 "LaunchConditions\t\t100\n" 839 "TestInstalledProp\tInstalled AND NOT REMOVE\t950\n"; 840 841 static const CHAR ip_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" 842 "s72\ti2\tS64\tS0\tS255\n" 843 "CustomAction\tAction\n" 844 "TestInstalledProp\t19\t\tTest failed\t\n"; 845 846 static const CHAR aup_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 847 "s72\tS255\tI2\n" 848 "InstallExecuteSequence\tAction\n" 849 "CostFinalize\t\t1000\n" 850 "ValidateProductID\t\t700\n" 851 "CostInitialize\t\t800\n" 852 "FileCost\t\t900\n" 853 "RemoveFiles\t\t3500\n" 854 "InstallFiles\t\t4000\n" 855 "RegisterUser\t\t6000\n" 856 "RegisterProduct\t\t6100\n" 857 "PublishFeatures\t\t6300\n" 858 "PublishProduct\t\t6400\n" 859 "InstallFinalize\t\t6600\n" 860 "InstallInitialize\t\t1500\n" 861 "ProcessComponents\t\t1600\n" 862 "UnpublishFeatures\t\t1800\n" 863 "InstallValidate\t\t1400\n" 864 "LaunchConditions\t\t100\n" 865 "TestAllUsersProp\tALLUSERS AND NOT REMOVE\t50\n"; 866 867 static const CHAR aup2_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 868 "s72\tS255\tI2\n" 869 "InstallExecuteSequence\tAction\n" 870 "CostFinalize\t\t1000\n" 871 "ValidateProductID\t\t700\n" 872 "CostInitialize\t\t800\n" 873 "FileCost\t\t900\n" 874 "RemoveFiles\t\t3500\n" 875 "InstallFiles\t\t4000\n" 876 "RegisterUser\t\t6000\n" 877 "RegisterProduct\t\t6100\n" 878 "PublishFeatures\t\t6300\n" 879 "PublishProduct\t\t6400\n" 880 "InstallFinalize\t\t6600\n" 881 "InstallInitialize\t\t1500\n" 882 "ProcessComponents\t\t1600\n" 883 "UnpublishFeatures\t\t1800\n" 884 "InstallValidate\t\t1400\n" 885 "LaunchConditions\t\t100\n" 886 "TestAllUsersProp\tALLUSERS=2 AND NOT REMOVE\t50\n"; 887 888 static const CHAR aup3_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 889 "s72\tS255\tI2\n" 890 "InstallExecuteSequence\tAction\n" 891 "CostFinalize\t\t1000\n" 892 "ValidateProductID\t\t700\n" 893 "CostInitialize\t\t800\n" 894 "FileCost\t\t900\n" 895 "RemoveFiles\t\t3500\n" 896 "InstallFiles\t\t4000\n" 897 "RegisterUser\t\t6000\n" 898 "RegisterProduct\t\t6100\n" 899 "PublishFeatures\t\t6300\n" 900 "PublishProduct\t\t6400\n" 901 "InstallFinalize\t\t6600\n" 902 "InstallInitialize\t\t1500\n" 903 "ProcessComponents\t\t1600\n" 904 "UnpublishFeatures\t\t1800\n" 905 "InstallValidate\t\t1400\n" 906 "LaunchConditions\t\t100\n" 907 "TestAllUsersProp\tALLUSERS=1 AND NOT REMOVE\t50\n"; 908 909 static const CHAR aup_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" 910 "s72\ti2\tS64\tS0\tS255\n" 911 "CustomAction\tAction\n" 912 "TestAllUsersProp\t19\t\tTest failed\t\n"; 913 914 static const CHAR fo_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 915 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 916 "File\tFile\n" 917 "override.txt\toverride\toverride.txt\t1000\t\t\t8192\t1\n" 918 "preselected.txt\tpreselected\tpreselected.txt\t1000\t\t\t8192\t2\n" 919 "notpreselected.txt\tnotpreselected\tnotpreselected.txt\t1000\t\t\t8192\t3\n"; 920 921 static const CHAR fo_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 922 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 923 "Feature\tFeature\n" 924 "override\t\t\toverride feature\t1\t1\tMSITESTDIR\t0\n" 925 "preselected\t\t\tpreselected feature\t1\t1\tMSITESTDIR\t0\n" 926 "notpreselected\t\t\tnotpreselected feature\t1\t1\tMSITESTDIR\t0\n"; 927 928 static const CHAR fo_condition_dat[] = "Feature_\tLevel\tCondition\n" 929 "s38\ti2\tS255\n" 930 "Condition\tFeature_\tLevel\n" 931 "preselected\t0\tPreselected\n" 932 "notpreselected\t0\tNOT Preselected\n"; 933 934 static const CHAR fo_feature_comp_dat[] = "Feature_\tComponent_\n" 935 "s38\ts72\n" 936 "FeatureComponents\tFeature_\tComponent_\n" 937 "override\toverride\n" 938 "preselected\tpreselected\n" 939 "notpreselected\tnotpreselected\n"; 940 941 static const CHAR fo_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 942 "s72\tS38\ts72\ti2\tS255\tS72\n" 943 "Component\tComponent\n" 944 "override\t{0A00FB1D-97B0-4B42-ADF0-BB8913416623}\tMSITESTDIR\t0\t\toverride.txt\n" 945 "preselected\t{44E1DB75-605A-43DD-8CF5-CAB17F1BBD60}\tMSITESTDIR\t0\t\tpreselected.txt\n" 946 "notpreselected\t{E1647733-5E75-400A-A92E-5E60B4D4EF9F}\tMSITESTDIR\t0\t\tnotpreselected.txt\n"; 947 948 static const CHAR fo_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" 949 "s72\ti2\tS64\tS0\tS255\n" 950 "CustomAction\tAction\n" 951 "SetPreselected\t51\tPreselected\t1\t\n"; 952 953 static const CHAR fo_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 954 "s72\tS255\tI2\n" 955 "InstallExecuteSequence\tAction\n" 956 "LaunchConditions\t\t100\n" 957 "SetPreselected\tpreselect=1\t200\n" 958 "CostInitialize\t\t800\n" 959 "FileCost\t\t900\n" 960 "CostFinalize\t\t1000\n" 961 "InstallValidate\t\t1400\n" 962 "InstallInitialize\t\t1500\n" 963 "ProcessComponents\t\t1600\n" 964 "RemoveFiles\t\t1700\n" 965 "InstallFiles\t\t2000\n" 966 "RegisterProduct\t\t5000\n" 967 "PublishFeatures\t\t5100\n" 968 "PublishProduct\t\t5200\n" 969 "InstallFinalize\t\t6000\n"; 970 971 static const CHAR uc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 972 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 973 "File\tFile\n" 974 "upgradecode.txt\tupgradecode\tupgradecode.txt\t1000\t\t\t8192\t1\n"; 975 976 static const CHAR uc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 977 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 978 "Feature\tFeature\n" 979 "upgradecode\t\t\tupgradecode feature\t1\t2\tMSITESTDIR\t0\n"; 980 981 static const CHAR uc_feature_comp_dat[] = "Feature_\tComponent_\n" 982 "s38\ts72\n" 983 "FeatureComponents\tFeature_\tComponent_\n" 984 "upgradecode\tupgradecode\n"; 985 986 static const CHAR uc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 987 "s72\tS38\ts72\ti2\tS255\tS72\n" 988 "Component\tComponent\n" 989 "upgradecode\t{6952B732-2FCB-4E47-976F-989FCBD7EDFB}\tMSITESTDIR\t0\t\tupgradecode.txt\n"; 990 991 static const CHAR uc_property_dat[] = "Property\tValue\n" 992 "s72\tl0\n" 993 "Property\tProperty\n" 994 "INSTALLLEVEL\t3\n" 995 "ProductCode\t{E5FB1241-F547-4BA7-A60E-8E75797268D4}\n" 996 "ProductName\tMSITEST\n" 997 "ProductVersion\t1.1.1\n" 998 "UpgradeCode\t#UPGEADECODE#\n" 999 "MSIFASTINSTALL\t1\n"; 1000 1001 static const CHAR uc_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" 1002 "s72\tS255\tI2\n" 1003 "InstallExecuteSequence\tAction\n" 1004 "LaunchConditions\t\t100\n" 1005 "CostInitialize\t\t200\n" 1006 "FileCost\t\t300\n" 1007 "CostFinalize\t\t400\n" 1008 "InstallInitialize\t\t500\n" 1009 "ProcessComponents\t\t600\n" 1010 "InstallValidate\t\t700\n" 1011 "RemoveFiles\t\t800\n" 1012 "InstallFiles\t\t900\n" 1013 "RegisterProduct\t\t1000\n" 1014 "PublishFeatures\t\t1100\n" 1015 "PublishProduct\t\t1200\n" 1016 "InstallFinalize\t\t1300\n"; 1017 1018 static const char mixed_feature_dat[] = 1019 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 1020 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 1021 "Feature\tFeature\n" 1022 "feature1\t\t\t\t1\t2\tMSITESTDIR\t0\n" 1023 "feature2\t\t\t\t1\t2\tMSITESTDIR\t0\n"; 1024 1025 static const char mixed_feature_comp_dat[] = 1026 "Feature_\tComponent_\n" 1027 "s38\ts72\n" 1028 "FeatureComponents\tFeature_\tComponent_\n" 1029 "feature1\tcomp1\n" 1030 "feature2\tcomp2\n"; 1031 1032 static const char mixed_component_dat[] = 1033 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 1034 "s72\tS38\ts72\ti2\tS255\tS72\n" 1035 "Component\tComponent\n" 1036 "comp1\t{DE9F0EF4-0ED3-495A-8105-060C0EA457B8}\tTARGETDIR\t4\t\tregdata1\n" 1037 "comp2\t{4912DBE7-FC3A-4F91-BB5C-88F5C15C19A5}\tTARGETDIR\t260\t\tregdata2\n"; 1038 1039 static const char mixed_registry_dat[] = 1040 "Registry\tRoot\tKey\tName\tValue\tComponent_\n" 1041 "s72\ti2\tl255\tL255\tL0\ts72\n" 1042 "Registry\tRegistry\n" 1043 "regdata1\t2\tSOFTWARE\\Wine\\msitest\ttest1\t\tcomp1\n" 1044 "regdata2\t2\tSOFTWARE\\Wine\\msitest\ttest2\t\tcomp2\n" 1045 "regdata3\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\t\tCLSID_Winetest32\tcomp1\n" 1046 "regdata4\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32\t\twinetest32.dll\tcomp1\n" 1047 "regdata5\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\t\tCLSID_Winetest64\tcomp2\n" 1048 "regdata6\t0\tCLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32\t\twinetest64.dll\tcomp2\n"; 1049 1050 static const char mixed_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\t200\n" 1056 "FileCost\t\t300\n" 1057 "CostFinalize\t\t400\n" 1058 "InstallValidate\t\t500\n" 1059 "InstallInitialize\t\t600\n" 1060 "ProcessComponents\t\t700\n" 1061 "UnpublishFeatures\t\t800\n" 1062 "RemoveRegistryValues\t\t900\n" 1063 "WriteRegistryValues\t\t1000\n" 1064 "RegisterProduct\t\t1100\n" 1065 "PublishFeatures\t\t1200\n" 1066 "PublishProduct\t\t1300\n" 1067 "InstallFinalize\t\t1400\n"; 1068 1069 static const char vp_file_dat[] = 1070 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 1071 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 1072 "File\tFile\n" 1073 "volumeprop\tcomp\tvolumeprop.txt\t1000\t\t\t8192\t1\n"; 1074 1075 static const char vp_feature_dat[] = 1076 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 1077 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 1078 "Feature\tFeature\n" 1079 "feature\t\t\t\t1\t2\tMSITESTDIR\t0\n"; 1080 1081 static const char vp_feature_comp_dat[] = 1082 "Feature_\tComponent_\n" 1083 "s38\ts72\n" 1084 "FeatureComponents\tFeature_\tComponent_\n" 1085 "feature\tcomp\n"; 1086 1087 static const char vp_component_dat[] = 1088 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 1089 "s72\tS38\ts72\ti2\tS255\tS72\n" 1090 "Component\tComponent\n" 1091 "comp\t{24364AE7-5B7F-496C-AF5A-54893639C567}\tMSITESTDIR\t0\t\tvolumeprop\n"; 1092 1093 static const char vp_custom_action_dat[] = 1094 "Action\tType\tSource\tTarget\tISComments\n" 1095 "s72\ti2\tS64\tS0\tS255\n" 1096 "CustomAction\tAction\n" 1097 "TestPrimaryVolumePath0\t19\t\tPrimaryVolumePath set before CostFinalize\t\n" 1098 "TestPrimaryVolumeSpaceAvailable0\t19\t\tPrimaryVolumeSpaceAvailable set before CostFinalize\t\n" 1099 "TestPrimaryVolumeSpaceRequired0\t19\t\tPrimaryVolumeSpaceRequired set before CostFinalize\t\n" 1100 "TestPrimaryVolumeSpaceRemaining0\t19\t\tPrimaryVolumeSpaceRemaining set before CostFinalize\t\n" 1101 "TestPrimaryVolumePath1\t19\t\tPrimaryVolumePath set before InstallValidate\t\n" 1102 "TestPrimaryVolumeSpaceAvailable1\t19\t\tPrimaryVolumeSpaceAvailable not set before InstallValidate\t\n" 1103 "TestPrimaryVolumeSpaceRequired1\t19\t\tPrimaryVolumeSpaceRequired not set before InstallValidate\t\n" 1104 "TestPrimaryVolumeSpaceRemaining1\t19\t\tPrimaryVolumeSpaceRemaining not set before InstallValidate\t\n" 1105 "TestPrimaryVolumePath2\t19\t\tPrimaryVolumePath not set after InstallValidate\t\n" 1106 "TestPrimaryVolumeSpaceAvailable2\t19\t\tPrimaryVolumeSpaceAvailable not set after InstallValidate\t\n" 1107 "TestPrimaryVolumeSpaceRequired2\t19\t\tPrimaryVolumeSpaceRequired not set after InstallValidate\t\n" 1108 "TestPrimaryVolumeSpaceRemaining2\t19\t\tPrimaryVolumeSpaceRemaining not set after InstallValidate\t\n"; 1109 1110 static const char vp_install_exec_seq_dat[] = 1111 "Action\tCondition\tSequence\n" 1112 "s72\tS255\tI2\n" 1113 "InstallExecuteSequence\tAction\n" 1114 "LaunchConditions\t\t100\n" 1115 "CostInitialize\t\t200\n" 1116 "FileCost\t\t300\n" 1117 "TestPrimaryVolumePath0\tPrimaryVolumePath AND NOT REMOVE\t400\n" 1118 "TestPrimaryVolumeSpaceAvailable0\tPrimaryVolumeSpaceAvailable AND NOT REMOVE\t500\n" 1119 "TestPrimaryVolumeSpaceRequired0\tPrimaryVolumeSpaceRequired AND NOT REMOVE\t510\n" 1120 "TestPrimaryVolumeSpaceRemaining0\tPrimaryVolumeSpaceRemaining AND NOT REMOVE\t520\n" 1121 "CostFinalize\t\t600\n" 1122 "TestPrimaryVolumePath1\tPrimaryVolumePath AND NOT REMOVE\t600\n" 1123 "TestPrimaryVolumeSpaceAvailable1\tNOT PrimaryVolumeSpaceAvailable AND NOT REMOVE\t800\n" 1124 "TestPrimaryVolumeSpaceRequired1\tNOT PrimaryVolumeSpaceRequired AND NOT REMOVE\t810\n" 1125 "TestPrimaryVolumeSpaceRemaining1\tNOT PrimaryVolumeSpaceRemaining AND NOT REMOVE\t820\n" 1126 "InstallValidate\t\t900\n" 1127 "TestPrimaryVolumePath2\tNOT PrimaryVolumePath AND NOT REMOVE\t1000\n" 1128 "TestPrimaryVolumeSpaceAvailable2\tNOT PrimaryVolumeSpaceAvailable AND NOT REMOVE\t1100\n" 1129 "TestPrimaryVolumeSpaceRequired2\tNOT PrimaryVolumeSpaceRequired AND NOT REMOVE\t1110\n" 1130 "TestPrimaryVolumeSpaceRemaining2\tNOT PrimaryVolumeSpaceRemaining AND NOT REMOVE\t1120\n" 1131 "InstallInitialize\t\t1200\n" 1132 "ProcessComponents\t\t1300\n" 1133 "RemoveFiles\t\t1400\n" 1134 "InstallFiles\t\t1500\n" 1135 "RegisterProduct\t\t1600\n" 1136 "PublishFeatures\t\t1700\n" 1137 "PublishProduct\t\t1800\n" 1138 "InstallFinalize\t\t1900\n"; 1139 1140 static const char shc_property_dat[] = 1141 "Property\tValue\n" 1142 "s72\tl0\n" 1143 "Property\tProperty\n" 1144 "INSTALLLEVEL\t3\n" 1145 "ProductCode\t{5CD99CD0-69C7-409B-9905-82DD743CC840}\n" 1146 "ProductName\tMSITEST\n" 1147 "ProductVersion\t1.1.1\n" 1148 "MSIFASTINSTALL\t1\n"; 1149 1150 static const char shc2_property_dat[] = 1151 "Property\tValue\n" 1152 "s72\tl0\n" 1153 "Property\tProperty\n" 1154 "INSTALLLEVEL\t3\n" 1155 "ProductCode\t{4CEFADE5-DAFB-4C21-8EF2-4ED4F139F340}\n" 1156 "ProductName\tMSITEST2\n" 1157 "ProductVersion\t1.1.1\n" 1158 "MSIFASTINSTALL\t1\n"; 1159 1160 static const char shc_file_dat[] = 1161 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 1162 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 1163 "File\tFile\n" 1164 "sharedcomponent\tsharedcomponent\tsharedcomponent.txt\t1000\t\t\t8192\t1\n"; 1165 1166 static const char shc_feature_dat[] = 1167 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 1168 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 1169 "Feature\tFeature\n" 1170 "feature\t\t\t\t1\t2\tMSITESTDIR\t0\n"; 1171 1172 static const char shc_feature_comp_dat[] = 1173 "Feature_\tComponent_\n" 1174 "s38\ts72\n" 1175 "FeatureComponents\tFeature_\tComponent_\n" 1176 "feature\tsharedcomponent\n"; 1177 1178 static const char shc_component_dat[] = 1179 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 1180 "s72\tS38\ts72\ti2\tS255\tS72\n" 1181 "Component\tComponent\n" 1182 "sharedcomponent\t{900A4ACB-DC6F-4795-A04B-81B530183D41}\tMSITESTDIR\t0\t\tsharedcomponent\n"; 1183 1184 static const char shc_custom_action_dat[] = 1185 "Action\tType\tSource\tTarget\tISComments\n" 1186 "s72\ti2\tS64\tS0\tS255\n" 1187 "CustomAction\tAction\n" 1188 "TestComponentAction\t19\t\twrong component action on install\t\n"; 1189 1190 static const char shc_install_exec_seq_dat[] = 1191 "Action\tCondition\tSequence\n" 1192 "s72\tS255\tI2\n" 1193 "InstallExecuteSequence\tAction\n" 1194 "LaunchConditions\t\t100\n" 1195 "CostInitialize\t\t200\n" 1196 "FileCost\t\t300\n" 1197 "CostFinalize\t\t600\n" 1198 "InstallValidate\t\t900\n" 1199 "InstallInitialize\t\t1200\n" 1200 "ProcessComponents\t\t1300\n" 1201 "RemoveFiles\t\t1400\n" 1202 "InstallFiles\t\t1500\n" 1203 "TestComponentAction\tNOT REMOVE AND ($sharedcomponent <> 3)\t1600\n" 1204 "RegisterProduct\t\t1700\n" 1205 "PublishFeatures\t\t1800\n" 1206 "PublishProduct\t\t1900\n" 1207 "InstallFinalize\t\t2000\n"; 1208 1209 static const char ft_file_dat[] = 1210 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" 1211 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" 1212 "File\tFile\n" 1213 "featuretree\tcomp\tfeaturetree.txt\t1000\t\t\t8192\t1\n"; 1214 1215 static const char ft_comp_dat[] = 1216 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" 1217 "s72\tS38\ts72\ti2\tS255\tS72\n" 1218 "Component\tComponent\n" 1219 "comp\t{12345678-1234-1234-1234-222222222222}\tTARGETDIR\t0\t\t\n" 1220 "comp2\t{12345678-1234-1234-1234-333333333333}\tTARGETDIR\t0\t\tfeaturetree\n"; 1221 1222 static const char ft_feature_dat[] = 1223 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" 1224 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" 1225 "Feature\tFeature\n" 1226 "A\t\t\t\t2\t1\t\t0\n" 1227 "C\tB\t\t\t2\t1\t\t0\n" 1228 "B\tA\t\t\t4\t1\t\t0\n" 1229 "D\t\t\t\t2\t1\t\t0\n"; 1230 1231 static const char ft_feature_comp_dat[] = 1232 "Feature_\tComponent_\n" 1233 "s38\ts72\n" 1234 "FeatureComponents\tFeature_\tComponent_\n" 1235 "C\tcomp\n" 1236 "D\tcomp2\n"; 1237 1238 static const char ft_condition_dat[] = 1239 "Feature_\tLevel\tCondition\n" 1240 "s38\ti2\tS255\n" 1241 "Condition\tFeature_\tLevel\n" 1242 "A\t0\t\"0\"<>INSTALLTYPE\n"; 1243 1244 static const char ft_custom_action_dat[] = 1245 "Action\tType\tSource\tTarget\tISComments\n" 1246 "s72\ti2\tS64\tS0\tS255\n" 1247 "CustomAction\tAction\n" 1248 "Run A\t19\t\tA\t\n" 1249 "Run B\t19\t\tB\t\n" 1250 "Run C\t19\t\tC\t\n"; 1251 1252 static const char ft_install_exec_seq_dat[] = 1253 "Action\tCondition\tSequence\n" 1254 "s72\tS255\tI2\n" 1255 "InstallExecuteSequence\tAction\n" 1256 "CostInitialize\t\t100\n" 1257 "FileCost\t\t200\n" 1258 "CostFinalize\t\t300\n" 1259 "InstallValidate\t\t400\n" 1260 "InstallInitialize\t\t500\n" 1261 "Run C\t3 = &C AND NOT Installed\t600\n" 1262 "Run B\t3 = &B AND NOT Installed\t700\n" 1263 "Run A\t3 = &A AND NOT Installed\t800\n" 1264 "ProcessComponents\t\t900\n" 1265 "RemoveFiles\t\t1000\n" 1266 "InstallFiles\t\t1100\n" 1267 "RegisterProduct\t\t1200\n" 1268 "PublishFeatures\t\t1300\n" 1269 "PublishProduct\t\t1400\n" 1270 "InstallFinalize\t\t1500\n"; 1271 1272 static const char da_custom_action_dat[] = 1273 "Action\tType\tSource\tTarget\tISComments\n" 1274 "s72\ti2\tS64\tS0\tS255\n" 1275 "CustomAction\tAction\n" 1276 "deferred\t1074\tCMDEXE\t/c if exist msitest (exit 0) else (exit 1)\t\n" 1277 "immediate\t50\tCMDEXE\t/c mkdir msitest\t\n" 1278 "cleanup\t50\tCMDEXE\t/c rmdir msitest\t\n"; 1279 1280 static const char da_install_exec_seq_dat[] = 1281 "Action\tCondition\tSequence\n" 1282 "s72\tS255\tI2\n" 1283 "InstallExecuteSequence\tAction\n" 1284 "CostInitialize\t\t200\n" 1285 "FileCost\t\t300\n" 1286 "CostFinalize\t\t400\n" 1287 "InstallInitialize\t\t500\n" 1288 "deferred\t\t600\n" 1289 "immediate\t\t700\n" 1290 "InstallFinalize\t\t1100\n" 1291 "cleanup\t\t1200\n"; 1292 1293 typedef struct _msi_table 1294 { 1295 const CHAR *filename; 1296 const CHAR *data; 1297 int size; 1298 } msi_table; 1299 1300 #define ADD_TABLE(x) {#x".idt", x##_dat, sizeof(x##_dat)} 1301 1302 static const msi_table tables[] = 1303 { 1304 ADD_TABLE(component), 1305 ADD_TABLE(directory), 1306 ADD_TABLE(feature), 1307 ADD_TABLE(feature_comp), 1308 ADD_TABLE(file), 1309 ADD_TABLE(install_exec_seq), 1310 ADD_TABLE(media), 1311 ADD_TABLE(property), 1312 ADD_TABLE(registry), 1313 ADD_TABLE(service_install), 1314 ADD_TABLE(service_control) 1315 }; 1316 1317 static const msi_table sc_tables[] = 1318 { 1319 ADD_TABLE(component), 1320 ADD_TABLE(directory), 1321 ADD_TABLE(feature), 1322 ADD_TABLE(feature_comp), 1323 ADD_TABLE(file), 1324 ADD_TABLE(install_exec_seq), 1325 ADD_TABLE(media), 1326 ADD_TABLE(property), 1327 ADD_TABLE(shortcut) 1328 }; 1329 1330 static const msi_table ps_tables[] = 1331 { 1332 ADD_TABLE(component), 1333 ADD_TABLE(directory), 1334 ADD_TABLE(feature), 1335 ADD_TABLE(feature_comp), 1336 ADD_TABLE(file), 1337 ADD_TABLE(install_exec_seq), 1338 ADD_TABLE(media), 1339 ADD_TABLE(property), 1340 ADD_TABLE(condition) 1341 }; 1342 1343 static const msi_table up_tables[] = 1344 { 1345 ADD_TABLE(component), 1346 ADD_TABLE(directory), 1347 ADD_TABLE(feature), 1348 ADD_TABLE(feature_comp), 1349 ADD_TABLE(file), 1350 ADD_TABLE(install_exec_seq), 1351 ADD_TABLE(media), 1352 ADD_TABLE(up_property), 1353 ADD_TABLE(registry), 1354 ADD_TABLE(service_install), 1355 ADD_TABLE(service_control) 1356 }; 1357 1358 static const msi_table up2_tables[] = 1359 { 1360 ADD_TABLE(component), 1361 ADD_TABLE(directory), 1362 ADD_TABLE(feature), 1363 ADD_TABLE(feature_comp), 1364 ADD_TABLE(file), 1365 ADD_TABLE(install_exec_seq), 1366 ADD_TABLE(media), 1367 ADD_TABLE(up2_property), 1368 ADD_TABLE(registry), 1369 ADD_TABLE(service_install), 1370 ADD_TABLE(service_control) 1371 }; 1372 1373 static const msi_table up3_tables[] = 1374 { 1375 ADD_TABLE(component), 1376 ADD_TABLE(directory), 1377 ADD_TABLE(feature), 1378 ADD_TABLE(feature_comp), 1379 ADD_TABLE(file), 1380 ADD_TABLE(install_exec_seq), 1381 ADD_TABLE(media), 1382 ADD_TABLE(up3_property), 1383 ADD_TABLE(registry), 1384 ADD_TABLE(service_install), 1385 ADD_TABLE(service_control) 1386 }; 1387 1388 static const msi_table up4_tables[] = 1389 { 1390 ADD_TABLE(component), 1391 ADD_TABLE(directory), 1392 ADD_TABLE(feature), 1393 ADD_TABLE(feature_comp), 1394 ADD_TABLE(file), 1395 ADD_TABLE(pp_install_exec_seq), 1396 ADD_TABLE(media), 1397 ADD_TABLE(property), 1398 ADD_TABLE(registry), 1399 ADD_TABLE(service_install), 1400 ADD_TABLE(service_control) 1401 }; 1402 1403 static const msi_table up5_tables[] = 1404 { 1405 ADD_TABLE(component), 1406 ADD_TABLE(directory), 1407 ADD_TABLE(feature), 1408 ADD_TABLE(feature_comp), 1409 ADD_TABLE(file), 1410 ADD_TABLE(pp_install_exec_seq), 1411 ADD_TABLE(media), 1412 ADD_TABLE(up_property), 1413 ADD_TABLE(registry), 1414 ADD_TABLE(service_install), 1415 ADD_TABLE(service_control) 1416 }; 1417 1418 static const msi_table up6_tables[] = 1419 { 1420 ADD_TABLE(component), 1421 ADD_TABLE(directory), 1422 ADD_TABLE(feature), 1423 ADD_TABLE(feature_comp), 1424 ADD_TABLE(file), 1425 ADD_TABLE(pp_install_exec_seq), 1426 ADD_TABLE(media), 1427 ADD_TABLE(up2_property), 1428 ADD_TABLE(registry), 1429 ADD_TABLE(service_install), 1430 ADD_TABLE(service_control) 1431 }; 1432 1433 static const msi_table up7_tables[] = 1434 { 1435 ADD_TABLE(component), 1436 ADD_TABLE(directory), 1437 ADD_TABLE(feature), 1438 ADD_TABLE(feature_comp), 1439 ADD_TABLE(file), 1440 ADD_TABLE(pp_install_exec_seq), 1441 ADD_TABLE(media), 1442 ADD_TABLE(up3_property), 1443 ADD_TABLE(registry), 1444 ADD_TABLE(service_install), 1445 ADD_TABLE(service_control) 1446 }; 1447 1448 static const msi_table cc_tables[] = 1449 { 1450 ADD_TABLE(cc_component), 1451 ADD_TABLE(directory), 1452 ADD_TABLE(cc_feature), 1453 ADD_TABLE(cc_feature_comp), 1454 ADD_TABLE(cc_file), 1455 ADD_TABLE(install_exec_seq), 1456 ADD_TABLE(cc_media), 1457 ADD_TABLE(property), 1458 }; 1459 1460 static const msi_table cc2_tables[] = 1461 { 1462 ADD_TABLE(cc2_component), 1463 ADD_TABLE(directory), 1464 ADD_TABLE(cc_feature), 1465 ADD_TABLE(cc_feature_comp), 1466 ADD_TABLE(cc2_file), 1467 ADD_TABLE(install_exec_seq), 1468 ADD_TABLE(cc_media), 1469 ADD_TABLE(property), 1470 }; 1471 1472 static const msi_table cc3_tables[] = 1473 { 1474 ADD_TABLE(cc_component), 1475 ADD_TABLE(directory), 1476 ADD_TABLE(cc_feature), 1477 ADD_TABLE(cc_feature_comp), 1478 ADD_TABLE(cc_file), 1479 ADD_TABLE(install_exec_seq), 1480 ADD_TABLE(cc3_media), 1481 ADD_TABLE(property), 1482 }; 1483 1484 static const msi_table co_tables[] = 1485 { 1486 ADD_TABLE(cc_component), 1487 ADD_TABLE(directory), 1488 ADD_TABLE(cc_feature), 1489 ADD_TABLE(cc_feature_comp), 1490 ADD_TABLE(co_file), 1491 ADD_TABLE(install_exec_seq), 1492 ADD_TABLE(co_media), 1493 ADD_TABLE(property), 1494 }; 1495 1496 static const msi_table co2_tables[] = 1497 { 1498 ADD_TABLE(cc_component), 1499 ADD_TABLE(directory), 1500 ADD_TABLE(cc_feature), 1501 ADD_TABLE(cc_feature_comp), 1502 ADD_TABLE(cc_file), 1503 ADD_TABLE(install_exec_seq), 1504 ADD_TABLE(co2_media), 1505 ADD_TABLE(property), 1506 }; 1507 1508 static const msi_table mm_tables[] = 1509 { 1510 ADD_TABLE(cc_component), 1511 ADD_TABLE(directory), 1512 ADD_TABLE(cc_feature), 1513 ADD_TABLE(cc_feature_comp), 1514 ADD_TABLE(mm_file), 1515 ADD_TABLE(install_exec_seq), 1516 ADD_TABLE(mm_media), 1517 ADD_TABLE(property), 1518 }; 1519 1520 static const msi_table ss_tables[] = 1521 { 1522 ADD_TABLE(cc_component), 1523 ADD_TABLE(directory), 1524 ADD_TABLE(cc_feature), 1525 ADD_TABLE(cc_feature_comp), 1526 ADD_TABLE(cc_file), 1527 ADD_TABLE(install_exec_seq), 1528 ADD_TABLE(ss_media), 1529 ADD_TABLE(property), 1530 }; 1531 1532 static const msi_table ui_tables[] = 1533 { 1534 ADD_TABLE(ui_component), 1535 ADD_TABLE(directory), 1536 ADD_TABLE(cc_feature), 1537 ADD_TABLE(cc_feature_comp), 1538 ADD_TABLE(cc_file), 1539 ADD_TABLE(install_exec_seq), 1540 ADD_TABLE(ui_install_ui_seq), 1541 ADD_TABLE(ui_custom_action), 1542 ADD_TABLE(cc_media), 1543 ADD_TABLE(property), 1544 }; 1545 1546 static const msi_table rof_tables[] = 1547 { 1548 ADD_TABLE(rof_component), 1549 ADD_TABLE(directory), 1550 ADD_TABLE(rof_feature), 1551 ADD_TABLE(rof_feature_comp), 1552 ADD_TABLE(rof_file), 1553 ADD_TABLE(install_exec_seq), 1554 ADD_TABLE(rof_media), 1555 ADD_TABLE(property), 1556 }; 1557 1558 static const msi_table rofc_tables[] = 1559 { 1560 ADD_TABLE(rof_component), 1561 ADD_TABLE(directory), 1562 ADD_TABLE(rof_feature), 1563 ADD_TABLE(rof_feature_comp), 1564 ADD_TABLE(rofc_file), 1565 ADD_TABLE(install_exec_seq), 1566 ADD_TABLE(rofc_media), 1567 ADD_TABLE(property), 1568 }; 1569 1570 static const msi_table sdp_tables[] = 1571 { 1572 ADD_TABLE(rof_component), 1573 ADD_TABLE(directory), 1574 ADD_TABLE(rof_feature), 1575 ADD_TABLE(rof_feature_comp), 1576 ADD_TABLE(rof_file), 1577 ADD_TABLE(sdp_install_exec_seq), 1578 ADD_TABLE(sdp_custom_action), 1579 ADD_TABLE(rof_media), 1580 ADD_TABLE(property), 1581 }; 1582 1583 static const msi_table cie_tables[] = 1584 { 1585 ADD_TABLE(cie_component), 1586 ADD_TABLE(directory), 1587 ADD_TABLE(cc_feature), 1588 ADD_TABLE(cie_feature_comp), 1589 ADD_TABLE(cie_file), 1590 ADD_TABLE(install_exec_seq), 1591 ADD_TABLE(cie_media), 1592 ADD_TABLE(property), 1593 }; 1594 1595 static const msi_table tp_tables[] = 1596 { 1597 ADD_TABLE(tp_component), 1598 ADD_TABLE(directory), 1599 ADD_TABLE(rof_feature), 1600 ADD_TABLE(ci2_feature_comp), 1601 ADD_TABLE(ci2_file), 1602 ADD_TABLE(install_exec_seq), 1603 ADD_TABLE(rof_media), 1604 ADD_TABLE(property), 1605 }; 1606 1607 static const msi_table cwd_tables[] = 1608 { 1609 ADD_TABLE(cwd_component), 1610 ADD_TABLE(directory), 1611 ADD_TABLE(rof_feature), 1612 ADD_TABLE(ci2_feature_comp), 1613 ADD_TABLE(ci2_file), 1614 ADD_TABLE(install_exec_seq), 1615 ADD_TABLE(rof_media), 1616 ADD_TABLE(property), 1617 }; 1618 1619 static const msi_table adm_tables[] = 1620 { 1621 ADD_TABLE(adm_component), 1622 ADD_TABLE(directory), 1623 ADD_TABLE(rof_feature), 1624 ADD_TABLE(ci2_feature_comp), 1625 ADD_TABLE(ci2_file), 1626 ADD_TABLE(install_exec_seq), 1627 ADD_TABLE(rof_media), 1628 ADD_TABLE(property), 1629 ADD_TABLE(adm_custom_action), 1630 ADD_TABLE(adm_admin_exec_seq), 1631 }; 1632 1633 static const msi_table amp_tables[] = 1634 { 1635 ADD_TABLE(amp_component), 1636 ADD_TABLE(directory), 1637 ADD_TABLE(rof_feature), 1638 ADD_TABLE(ci2_feature_comp), 1639 ADD_TABLE(ci2_file), 1640 ADD_TABLE(install_exec_seq), 1641 ADD_TABLE(rof_media), 1642 ADD_TABLE(property), 1643 }; 1644 1645 static const msi_table mc_tables[] = 1646 { 1647 ADD_TABLE(mc_component), 1648 ADD_TABLE(directory), 1649 ADD_TABLE(cc_feature), 1650 ADD_TABLE(cie_feature_comp), 1651 ADD_TABLE(mc_file), 1652 ADD_TABLE(install_exec_seq), 1653 ADD_TABLE(mc_media), 1654 ADD_TABLE(property), 1655 ADD_TABLE(mc_file_hash), 1656 }; 1657 1658 static const msi_table sf_tables[] = 1659 { 1660 ADD_TABLE(wrv_component), 1661 ADD_TABLE(directory), 1662 ADD_TABLE(rof_feature), 1663 ADD_TABLE(ci2_feature_comp), 1664 ADD_TABLE(ci2_file), 1665 ADD_TABLE(install_exec_seq), 1666 ADD_TABLE(rof_media), 1667 ADD_TABLE(property), 1668 }; 1669 1670 static const msi_table ca51_tables[] = 1671 { 1672 ADD_TABLE(ca51_component), 1673 ADD_TABLE(directory), 1674 ADD_TABLE(rof_feature), 1675 ADD_TABLE(ci2_feature_comp), 1676 ADD_TABLE(ci2_file), 1677 ADD_TABLE(ca51_install_exec_seq), 1678 ADD_TABLE(rof_media), 1679 ADD_TABLE(property), 1680 ADD_TABLE(ca51_custom_action), 1681 }; 1682 1683 static const msi_table is_tables[] = 1684 { 1685 ADD_TABLE(is_component), 1686 ADD_TABLE(directory), 1687 ADD_TABLE(is_feature), 1688 ADD_TABLE(is_feature_comp), 1689 ADD_TABLE(is_file), 1690 ADD_TABLE(install_exec_seq), 1691 ADD_TABLE(is_media), 1692 ADD_TABLE(property), 1693 }; 1694 1695 static const msi_table sp_tables[] = 1696 { 1697 ADD_TABLE(sp_component), 1698 ADD_TABLE(sp_directory), 1699 ADD_TABLE(rof_feature), 1700 ADD_TABLE(ci2_feature_comp), 1701 ADD_TABLE(ci2_file), 1702 ADD_TABLE(install_exec_seq), 1703 ADD_TABLE(rof_media), 1704 ADD_TABLE(property), 1705 }; 1706 1707 static const msi_table mcp_tables[] = 1708 { 1709 ADD_TABLE(mcp_component), 1710 ADD_TABLE(directory), 1711 ADD_TABLE(mcp_feature), 1712 ADD_TABLE(mcp_feature_comp), 1713 ADD_TABLE(mcp_file), 1714 ADD_TABLE(rem_install_exec_seq), 1715 ADD_TABLE(rof_media), 1716 ADD_TABLE(property), 1717 }; 1718 1719 static const msi_table ai_tables[] = 1720 { 1721 ADD_TABLE(component), 1722 ADD_TABLE(directory), 1723 ADD_TABLE(feature), 1724 ADD_TABLE(feature_comp), 1725 ADD_TABLE(ai_file), 1726 ADD_TABLE(install_exec_seq), 1727 ADD_TABLE(media), 1728 ADD_TABLE(property) 1729 }; 1730 1731 static const msi_table pc_tables[] = 1732 { 1733 ADD_TABLE(ca51_component), 1734 ADD_TABLE(directory), 1735 ADD_TABLE(rof_feature), 1736 ADD_TABLE(ci2_feature_comp), 1737 ADD_TABLE(ci2_file), 1738 ADD_TABLE(install_exec_seq), 1739 ADD_TABLE(rof_media), 1740 ADD_TABLE(property) 1741 }; 1742 1743 static const msi_table ip_tables[] = 1744 { 1745 ADD_TABLE(component), 1746 ADD_TABLE(directory), 1747 ADD_TABLE(feature), 1748 ADD_TABLE(feature_comp), 1749 ADD_TABLE(file), 1750 ADD_TABLE(ip_install_exec_seq), 1751 ADD_TABLE(ip_custom_action), 1752 ADD_TABLE(media), 1753 ADD_TABLE(property) 1754 }; 1755 1756 static const msi_table aup_tables[] = 1757 { 1758 ADD_TABLE(component), 1759 ADD_TABLE(directory), 1760 ADD_TABLE(feature), 1761 ADD_TABLE(feature_comp), 1762 ADD_TABLE(file), 1763 ADD_TABLE(aup_install_exec_seq), 1764 ADD_TABLE(aup_custom_action), 1765 ADD_TABLE(media), 1766 ADD_TABLE(property) 1767 }; 1768 1769 static const msi_table aup2_tables[] = 1770 { 1771 ADD_TABLE(component), 1772 ADD_TABLE(directory), 1773 ADD_TABLE(feature), 1774 ADD_TABLE(feature_comp), 1775 ADD_TABLE(file), 1776 ADD_TABLE(aup2_install_exec_seq), 1777 ADD_TABLE(aup_custom_action), 1778 ADD_TABLE(media), 1779 ADD_TABLE(aup_property) 1780 }; 1781 1782 static const msi_table aup3_tables[] = 1783 { 1784 ADD_TABLE(component), 1785 ADD_TABLE(directory), 1786 ADD_TABLE(feature), 1787 ADD_TABLE(feature_comp), 1788 ADD_TABLE(file), 1789 ADD_TABLE(aup2_install_exec_seq), 1790 ADD_TABLE(aup_custom_action), 1791 ADD_TABLE(media), 1792 ADD_TABLE(aup2_property) 1793 }; 1794 1795 static const msi_table aup4_tables[] = 1796 { 1797 ADD_TABLE(component), 1798 ADD_TABLE(directory), 1799 ADD_TABLE(feature), 1800 ADD_TABLE(feature_comp), 1801 ADD_TABLE(file), 1802 ADD_TABLE(aup3_install_exec_seq), 1803 ADD_TABLE(aup_custom_action), 1804 ADD_TABLE(media), 1805 ADD_TABLE(aup2_property) 1806 }; 1807 1808 static const msi_table fiu_tables[] = 1809 { 1810 ADD_TABLE(rof_component), 1811 ADD_TABLE(directory), 1812 ADD_TABLE(rof_feature), 1813 ADD_TABLE(rof_feature_comp), 1814 ADD_TABLE(rof_file), 1815 ADD_TABLE(pp_install_exec_seq), 1816 ADD_TABLE(rof_media), 1817 ADD_TABLE(property), 1818 }; 1819 1820 static const msi_table fiuc_tables[] = 1821 { 1822 ADD_TABLE(rof_component), 1823 ADD_TABLE(directory), 1824 ADD_TABLE(rof_feature), 1825 ADD_TABLE(rof_feature_comp), 1826 ADD_TABLE(rofc_file), 1827 ADD_TABLE(pp_install_exec_seq), 1828 ADD_TABLE(rofc_media), 1829 ADD_TABLE(property), 1830 }; 1831 1832 static const msi_table fo_tables[] = 1833 { 1834 ADD_TABLE(directory), 1835 ADD_TABLE(fo_file), 1836 ADD_TABLE(fo_component), 1837 ADD_TABLE(fo_feature), 1838 ADD_TABLE(fo_condition), 1839 ADD_TABLE(fo_feature_comp), 1840 ADD_TABLE(fo_custom_action), 1841 ADD_TABLE(fo_install_exec_seq), 1842 ADD_TABLE(media), 1843 ADD_TABLE(property) 1844 }; 1845 1846 static const msi_table icon_base_tables[] = 1847 { 1848 ADD_TABLE(ci_component), 1849 ADD_TABLE(directory), 1850 ADD_TABLE(rof_feature), 1851 ADD_TABLE(rof_feature_comp), 1852 ADD_TABLE(rof_file), 1853 ADD_TABLE(pp_install_exec_seq), 1854 ADD_TABLE(rof_media), 1855 ADD_TABLE(icon_property), 1856 }; 1857 1858 static const msi_table pv_tables[] = 1859 { 1860 ADD_TABLE(rof_component), 1861 ADD_TABLE(directory), 1862 ADD_TABLE(rof_feature), 1863 ADD_TABLE(rof_feature_comp), 1864 ADD_TABLE(rof_file), 1865 ADD_TABLE(pv_install_exec_seq), 1866 ADD_TABLE(rof_media), 1867 ADD_TABLE(property) 1868 }; 1869 1870 static const msi_table uc_tables[] = 1871 { 1872 ADD_TABLE(directory), 1873 ADD_TABLE(uc_component), 1874 ADD_TABLE(uc_feature), 1875 ADD_TABLE(uc_feature_comp), 1876 ADD_TABLE(uc_file), 1877 ADD_TABLE(uc_install_exec_seq), 1878 ADD_TABLE(media), 1879 ADD_TABLE(uc_property) 1880 }; 1881 1882 static const msi_table mixed_tables[] = 1883 { 1884 ADD_TABLE(directory), 1885 ADD_TABLE(mixed_component), 1886 ADD_TABLE(mixed_feature), 1887 ADD_TABLE(mixed_feature_comp), 1888 ADD_TABLE(mixed_install_exec_seq), 1889 ADD_TABLE(mixed_registry), 1890 ADD_TABLE(media), 1891 ADD_TABLE(property) 1892 }; 1893 1894 static const msi_table vp_tables[] = 1895 { 1896 ADD_TABLE(directory), 1897 ADD_TABLE(vp_file), 1898 ADD_TABLE(vp_component), 1899 ADD_TABLE(vp_feature), 1900 ADD_TABLE(vp_feature_comp), 1901 ADD_TABLE(vp_custom_action), 1902 ADD_TABLE(vp_install_exec_seq), 1903 ADD_TABLE(media), 1904 ADD_TABLE(property) 1905 }; 1906 1907 static const msi_table shc_tables[] = 1908 { 1909 ADD_TABLE(media), 1910 ADD_TABLE(directory), 1911 ADD_TABLE(shc_file), 1912 ADD_TABLE(shc_component), 1913 ADD_TABLE(shc_feature), 1914 ADD_TABLE(shc_feature_comp), 1915 ADD_TABLE(shc_custom_action), 1916 ADD_TABLE(shc_install_exec_seq), 1917 ADD_TABLE(shc_property) 1918 }; 1919 1920 static const msi_table shc2_tables[] = 1921 { 1922 ADD_TABLE(media), 1923 ADD_TABLE(directory), 1924 ADD_TABLE(shc_file), 1925 ADD_TABLE(shc_component), 1926 ADD_TABLE(shc_feature), 1927 ADD_TABLE(shc_feature_comp), 1928 ADD_TABLE(shc_custom_action), 1929 ADD_TABLE(shc_install_exec_seq), 1930 ADD_TABLE(shc2_property) 1931 }; 1932 1933 static const msi_table ft_tables[] = 1934 { 1935 ADD_TABLE(media), 1936 ADD_TABLE(directory), 1937 ADD_TABLE(ft_file), 1938 ADD_TABLE(ft_comp), 1939 ADD_TABLE(ft_feature), 1940 ADD_TABLE(ft_feature_comp), 1941 ADD_TABLE(ft_condition), 1942 ADD_TABLE(ft_custom_action), 1943 ADD_TABLE(ft_install_exec_seq), 1944 ADD_TABLE(property) 1945 }; 1946 1947 static const msi_table da_tables[] = 1948 { 1949 ADD_TABLE(media), 1950 ADD_TABLE(directory), 1951 ADD_TABLE(file), 1952 ADD_TABLE(component), 1953 ADD_TABLE(feature), 1954 ADD_TABLE(feature_comp), 1955 ADD_TABLE(property), 1956 ADD_TABLE(da_install_exec_seq), 1957 ADD_TABLE(da_custom_action), 1958 }; 1959 1960 /* cabinet definitions */ 1961 1962 /* make the max size large so there is only one cab file */ 1963 #define MEDIA_SIZE 0x7FFFFFFF 1964 #define FOLDER_THRESHOLD 900000 1965 1966 /* the FCI callbacks */ 1967 1968 static void * CDECL mem_alloc(ULONG cb) 1969 { 1970 return HeapAlloc(GetProcessHeap(), 0, cb); 1971 } 1972 1973 static void CDECL mem_free(void *memory) 1974 { 1975 HeapFree(GetProcessHeap(), 0, memory); 1976 } 1977 1978 static BOOL CDECL get_next_cabinet(PCCAB pccab, ULONG cbPrevCab, void *pv) 1979 { 1980 sprintf(pccab->szCab, pv, pccab->iCab); 1981 return TRUE; 1982 } 1983 1984 static LONG CDECL progress(UINT typeStatus, ULONG cb1, ULONG cb2, void *pv) 1985 { 1986 return 0; 1987 } 1988 1989 static int CDECL file_placed(PCCAB pccab, char *pszFile, LONG cbFile, 1990 BOOL fContinuation, void *pv) 1991 { 1992 return 0; 1993 } 1994 1995 static INT_PTR CDECL fci_open(char *pszFile, int oflag, int pmode, int *err, void *pv) 1996 { 1997 HANDLE handle; 1998 DWORD dwAccess = 0; 1999 DWORD dwShareMode = 0; 2000 DWORD dwCreateDisposition = OPEN_EXISTING; 2001 2002 dwAccess = GENERIC_READ | GENERIC_WRITE; 2003 /* FILE_SHARE_DELETE is not supported by Windows Me/98/95 */ 2004 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; 2005 2006 if (GetFileAttributesA(pszFile) != INVALID_FILE_ATTRIBUTES) 2007 dwCreateDisposition = OPEN_EXISTING; 2008 else 2009 dwCreateDisposition = CREATE_NEW; 2010 2011 handle = CreateFileA(pszFile, dwAccess, dwShareMode, NULL, 2012 dwCreateDisposition, 0, NULL); 2013 2014 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszFile); 2015 2016 return (INT_PTR)handle; 2017 } 2018 2019 static UINT CDECL fci_read(INT_PTR hf, void *memory, UINT cb, int *err, void *pv) 2020 { 2021 HANDLE handle = (HANDLE)hf; 2022 DWORD dwRead; 2023 BOOL res; 2024 2025 res = ReadFile(handle, memory, cb, &dwRead, NULL); 2026 ok(res, "Failed to ReadFile\n"); 2027 2028 return dwRead; 2029 } 2030 2031 static UINT CDECL fci_write(INT_PTR hf, void *memory, UINT cb, int *err, void *pv) 2032 { 2033 HANDLE handle = (HANDLE)hf; 2034 DWORD dwWritten; 2035 BOOL res; 2036 2037 res = WriteFile(handle, memory, cb, &dwWritten, NULL); 2038 ok(res, "Failed to WriteFile\n"); 2039 2040 return dwWritten; 2041 } 2042 2043 static int CDECL fci_close(INT_PTR hf, int *err, void *pv) 2044 { 2045 HANDLE handle = (HANDLE)hf; 2046 ok(CloseHandle(handle), "Failed to CloseHandle\n"); 2047 2048 return 0; 2049 } 2050 2051 static LONG CDECL fci_seek(INT_PTR hf, LONG dist, int seektype, int *err, void *pv) 2052 { 2053 HANDLE handle = (HANDLE)hf; 2054 DWORD ret; 2055 2056 ret = SetFilePointer(handle, dist, NULL, seektype); 2057 ok(ret != INVALID_SET_FILE_POINTER, "Failed to SetFilePointer\n"); 2058 2059 return ret; 2060 } 2061 2062 static int CDECL fci_delete(char *pszFile, int *err, void *pv) 2063 { 2064 BOOL ret = DeleteFileA(pszFile); 2065 ok(ret, "Failed to DeleteFile %s\n", pszFile); 2066 2067 return 0; 2068 } 2069 2070 static void init_functionpointers(void) 2071 { 2072 HMODULE hmsi = GetModuleHandleA("msi.dll"); 2073 HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll"); 2074 HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); 2075 2076 #define GET_PROC(mod, func) \ 2077 p ## func = (void*)GetProcAddress(mod, #func); \ 2078 if(!p ## func) \ 2079 trace("GetProcAddress(%s) failed\n", #func); 2080 2081 GET_PROC(hmsi, MsiQueryComponentStateA); 2082 GET_PROC(hmsi, MsiSourceListEnumSourcesA); 2083 GET_PROC(hmsi, MsiGetComponentPathExA); 2084 2085 GET_PROC(hadvapi32, CheckTokenMembership); 2086 GET_PROC(hadvapi32, ConvertSidToStringSidA); 2087 GET_PROC(hadvapi32, OpenProcessToken); 2088 GET_PROC(hadvapi32, RegDeleteKeyExA) 2089 GET_PROC(hkernel32, IsWow64Process) 2090 2091 hsrclient = LoadLibraryA("srclient.dll"); 2092 GET_PROC(hsrclient, SRRemoveRestorePoint); 2093 GET_PROC(hsrclient, SRSetRestorePointA); 2094 2095 #undef GET_PROC 2096 } 2097 2098 static BOOL is_process_limited(void) 2099 { 2100 SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY}; 2101 PSID Group = NULL; 2102 BOOL IsInGroup; 2103 HANDLE token; 2104 2105 if (!pCheckTokenMembership || !pOpenProcessToken) return FALSE; 2106 2107 if (!AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, 2108 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &Group) || 2109 !pCheckTokenMembership(NULL, Group, &IsInGroup)) 2110 { 2111 trace("Could not check if the current user is an administrator\n"); 2112 FreeSid(Group); 2113 return FALSE; 2114 } 2115 FreeSid(Group); 2116 2117 if (!IsInGroup) 2118 { 2119 /* Only administrators have enough privileges for these tests */ 2120 return TRUE; 2121 } 2122 2123 if (pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) 2124 { 2125 BOOL ret; 2126 TOKEN_ELEVATION_TYPE type = TokenElevationTypeDefault; 2127 DWORD size; 2128 2129 ret = GetTokenInformation(token, TokenElevationType, &type, sizeof(type), &size); 2130 CloseHandle(token); 2131 return (ret && type == TokenElevationTypeLimited); 2132 } 2133 return FALSE; 2134 } 2135 2136 static BOOL check_record(MSIHANDLE rec, UINT field, LPCSTR val) 2137 { 2138 CHAR buffer[0x20]; 2139 UINT r; 2140 DWORD sz; 2141 2142 sz = sizeof buffer; 2143 r = MsiRecordGetStringA(rec, field, buffer, &sz); 2144 return (r == ERROR_SUCCESS ) && !strcmp(val, buffer); 2145 } 2146 2147 static BOOL CDECL get_temp_file(char *pszTempName, int cbTempName, void *pv) 2148 { 2149 LPSTR tempname; 2150 2151 tempname = HeapAlloc(GetProcessHeap(), 0, MAX_PATH); 2152 GetTempFileNameA(".", "xx", 0, tempname); 2153 2154 if (tempname && (strlen(tempname) < (unsigned)cbTempName)) 2155 { 2156 lstrcpyA(pszTempName, tempname); 2157 HeapFree(GetProcessHeap(), 0, tempname); 2158 return TRUE; 2159 } 2160 2161 HeapFree(GetProcessHeap(), 0, tempname); 2162 2163 return FALSE; 2164 } 2165 2166 static INT_PTR CDECL get_open_info(char *pszName, USHORT *pdate, USHORT *ptime, 2167 USHORT *pattribs, int *err, void *pv) 2168 { 2169 BY_HANDLE_FILE_INFORMATION finfo; 2170 FILETIME filetime; 2171 HANDLE handle; 2172 DWORD attrs; 2173 BOOL res; 2174 2175 handle = CreateFileA(pszName, GENERIC_READ, FILE_SHARE_READ, NULL, 2176 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 2177 2178 ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszName); 2179 2180 res = GetFileInformationByHandle(handle, &finfo); 2181 ok(res, "Expected GetFileInformationByHandle to succeed\n"); 2182 2183 FileTimeToLocalFileTime(&finfo.ftLastWriteTime, &filetime); 2184 FileTimeToDosDateTime(&filetime, pdate, ptime); 2185 2186 attrs = GetFileAttributesA(pszName); 2187 ok(attrs != INVALID_FILE_ATTRIBUTES, "Failed to GetFileAttributes\n"); 2188 2189 return (INT_PTR)handle; 2190 } 2191 2192 static BOOL add_file(HFCI hfci, const char *file, TCOMP compress) 2193 { 2194 char path[MAX_PATH]; 2195 char filename[MAX_PATH]; 2196 2197 lstrcpyA(path, CURR_DIR); 2198 lstrcatA(path, "\\"); 2199 lstrcatA(path, file); 2200 2201 lstrcpyA(filename, file); 2202 2203 return FCIAddFile(hfci, path, filename, FALSE, get_next_cabinet, 2204 progress, get_open_info, compress); 2205 } 2206 2207 static void set_cab_parameters(PCCAB pCabParams, const CHAR *name, DWORD max_size) 2208 { 2209 ZeroMemory(pCabParams, sizeof(CCAB)); 2210 2211 pCabParams->cb = max_size; 2212 pCabParams->cbFolderThresh = FOLDER_THRESHOLD; 2213 pCabParams->setID = 0xbeef; 2214 pCabParams->iCab = 1; 2215 lstrcpyA(pCabParams->szCabPath, CURR_DIR); 2216 lstrcatA(pCabParams->szCabPath, "\\"); 2217 lstrcpyA(pCabParams->szCab, name); 2218 } 2219 2220 static void create_cab_file(const CHAR *name, DWORD max_size, const CHAR *files) 2221 { 2222 CCAB cabParams; 2223 LPCSTR ptr; 2224 HFCI hfci; 2225 ERF erf; 2226 BOOL res; 2227 2228 set_cab_parameters(&cabParams, name, max_size); 2229 2230 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open, 2231 fci_read, fci_write, fci_close, fci_seek, fci_delete, 2232 get_temp_file, &cabParams, NULL); 2233 2234 ok(hfci != NULL, "Failed to create an FCI context\n"); 2235 2236 ptr = files; 2237 while (*ptr) 2238 { 2239 res = add_file(hfci, ptr, tcompTYPE_MSZIP); 2240 ok(res, "Failed to add file: %s\n", ptr); 2241 ptr += lstrlenA(ptr) + 1; 2242 } 2243 2244 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress); 2245 ok(res, "Failed to flush the cabinet\n"); 2246 2247 res = FCIDestroy(hfci); 2248 ok(res, "Failed to destroy the cabinet\n"); 2249 } 2250 2251 static BOOL get_user_dirs(void) 2252 { 2253 HKEY hkey; 2254 DWORD type, size; 2255 2256 if (RegOpenKeyA(HKEY_CURRENT_USER, 2257 "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", &hkey)) 2258 return FALSE; 2259 2260 size = MAX_PATH; 2261 if(RegQueryValueExA(hkey, "AppData", 0, &type, (LPBYTE)APP_DATA_DIR, &size)){ 2262 RegCloseKey(hkey); 2263 return FALSE; 2264 } 2265 2266 RegCloseKey(hkey); 2267 return TRUE; 2268 } 2269 2270 static BOOL get_system_dirs(void) 2271 { 2272 HKEY hkey; 2273 DWORD type, size; 2274 2275 if (RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion", &hkey)) 2276 return FALSE; 2277 2278 size = MAX_PATH; 2279 if (RegQueryValueExA(hkey, "ProgramFilesDir (x86)", 0, &type, (LPBYTE)PROG_FILES_DIR, &size) && 2280 RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR, &size)) { 2281 RegCloseKey(hkey); 2282 return FALSE; 2283 } 2284 2285 size = MAX_PATH; 2286 if (RegQueryValueExA(hkey, "CommonFilesDir (x86)", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size) && 2287 RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size)) { 2288 RegCloseKey(hkey); 2289 return FALSE; 2290 } 2291 2292 size = MAX_PATH; 2293 if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR_NATIVE, &size)) { 2294 RegCloseKey(hkey); 2295 return FALSE; 2296 } 2297 2298 RegCloseKey(hkey); 2299 2300 if(!GetWindowsDirectoryA(WINDOWS_DIR, MAX_PATH)) 2301 return FALSE; 2302 2303 return TRUE; 2304 } 2305 2306 static void create_file_data(LPCSTR name, LPCSTR data, DWORD size) 2307 { 2308 HANDLE file; 2309 DWORD written; 2310 2311 file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); 2312 if (file == INVALID_HANDLE_VALUE) 2313 return; 2314 2315 WriteFile(file, data, strlen(data), &written, NULL); 2316 2317 if (size) 2318 { 2319 SetFilePointer(file, size, NULL, FILE_BEGIN); 2320 SetEndOfFile(file); 2321 } 2322 2323 CloseHandle(file); 2324 } 2325 2326 #define create_file(name, size) create_file_data(name, name, size) 2327 2328 static void create_test_files(void) 2329 { 2330 CreateDirectoryA("msitest", NULL); 2331 create_file("msitest\\one.txt", 100); 2332 CreateDirectoryA("msitest\\first", NULL); 2333 create_file("msitest\\first\\two.txt", 100); 2334 CreateDirectoryA("msitest\\second", NULL); 2335 create_file("msitest\\second\\three.txt", 100); 2336 2337 create_file("four.txt", 100); 2338 create_file("five.txt", 100); 2339 create_cab_file("msitest.cab", MEDIA_SIZE, "four.txt\0five.txt\0"); 2340 2341 create_file("msitest\\filename", 100); 2342 create_file("msitest\\service.exe", 100); 2343 2344 DeleteFileA("four.txt"); 2345 DeleteFileA("five.txt"); 2346 } 2347 2348 static BOOL delete_pf(const CHAR *rel_path, BOOL is_file) 2349 { 2350 CHAR path[MAX_PATH]; 2351 2352 lstrcpyA(path, PROG_FILES_DIR); 2353 lstrcatA(path, "\\"); 2354 lstrcatA(path, rel_path); 2355 2356 if (is_file) 2357 return DeleteFileA(path); 2358 else 2359 return RemoveDirectoryA(path); 2360 } 2361 2362 static BOOL delete_pf_native(const CHAR *rel_path, BOOL is_file) 2363 { 2364 CHAR path[MAX_PATH]; 2365 2366 lstrcpyA(path, PROG_FILES_DIR_NATIVE); 2367 lstrcatA(path, "\\"); 2368 lstrcatA(path, rel_path); 2369 2370 if (is_file) 2371 return DeleteFileA(path); 2372 else 2373 return RemoveDirectoryA(path); 2374 } 2375 2376 static BOOL delete_cf(const CHAR *rel_path, BOOL is_file) 2377 { 2378 CHAR path[MAX_PATH]; 2379 2380 lstrcpyA(path, COMMON_FILES_DIR); 2381 lstrcatA(path, "\\"); 2382 lstrcatA(path, rel_path); 2383 2384 if (is_file) 2385 return DeleteFileA(path); 2386 else 2387 return RemoveDirectoryA(path); 2388 } 2389 2390 static BOOL compare_pf_data(const char *filename, const char *data, DWORD size) 2391 { 2392 DWORD read; 2393 HANDLE handle; 2394 BOOL ret = FALSE; 2395 char *buffer, path[MAX_PATH]; 2396 2397 lstrcpyA(path, PROG_FILES_DIR); 2398 lstrcatA(path, "\\"); 2399 lstrcatA(path, filename); 2400 2401 handle = CreateFileA(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 2402 buffer = HeapAlloc(GetProcessHeap(), 0, size); 2403 if (buffer) 2404 { 2405 ReadFile(handle, buffer, size, &read, NULL); 2406 if (read == size && !memcmp(data, buffer, size)) ret = TRUE; 2407 HeapFree(GetProcessHeap(), 0, buffer); 2408 } 2409 CloseHandle(handle); 2410 return ret; 2411 } 2412 2413 static void delete_test_files(void) 2414 { 2415 DeleteFileA("msitest.msi"); 2416 DeleteFileA("msitest.cab"); 2417 DeleteFileA("msitest\\second\\three.txt"); 2418 DeleteFileA("msitest\\first\\two.txt"); 2419 DeleteFileA("msitest\\one.txt"); 2420 DeleteFileA("msitest\\service.exe"); 2421 DeleteFileA("msitest\\filename"); 2422 RemoveDirectoryA("msitest\\second"); 2423 RemoveDirectoryA("msitest\\first"); 2424 RemoveDirectoryA("msitest"); 2425 } 2426 2427 static void delete_pf_files(void) 2428 { 2429 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); 2430 ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); 2431 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); 2432 ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); 2433 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); 2434 ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); 2435 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); 2436 ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); 2437 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); 2438 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); 2439 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); 2440 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 2441 } 2442 2443 static void write_file(const CHAR *filename, const char *data, int data_size) 2444 { 2445 DWORD size; 2446 2447 HANDLE hf = CreateFileA(filename, GENERIC_WRITE, 0, NULL, 2448 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 2449 WriteFile(hf, data, data_size, &size, NULL); 2450 CloseHandle(hf); 2451 } 2452 2453 static void write_msi_summary_info(MSIHANDLE db, INT version, INT wordcount, 2454 const char *template, const char *packagecode) 2455 { 2456 MSIHANDLE summary; 2457 UINT r; 2458 2459 r = MsiGetSummaryInformationA(db, NULL, 5, &summary); 2460 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2461 2462 r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, template); 2463 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2464 2465 r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL, packagecode); 2466 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2467 2468 r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, version, NULL, NULL); 2469 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2470 2471 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, wordcount, NULL, NULL); 2472 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2473 2474 r = MsiSummaryInfoSetPropertyA(summary, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST"); 2475 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2476 2477 /* write the summary changes back to the stream */ 2478 r = MsiSummaryInfoPersist(summary); 2479 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2480 2481 MsiCloseHandle(summary); 2482 } 2483 2484 #define create_database(name, tables, num_tables) \ 2485 create_database_wordcount(name, tables, num_tables, 100, 0, ";1033", \ 2486 "{004757CA-5092-49C2-AD20-28E1CE0DF5F2}"); 2487 2488 #define create_database_template(name, tables, num_tables, version, template) \ 2489 create_database_wordcount(name, tables, num_tables, version, 0, template, \ 2490 "{004757CA-5092-49C2-AD20-28E1CE0DF5F2}"); 2491 2492 static void create_database_wordcount(const CHAR *name, const msi_table *tables, 2493 int num_tables, INT version, INT wordcount, 2494 const char *template, const char *packagecode) 2495 { 2496 MSIHANDLE db; 2497 UINT r; 2498 WCHAR *nameW; 2499 int j, len; 2500 2501 len = MultiByteToWideChar( CP_ACP, 0, name, -1, NULL, 0 ); 2502 if (!(nameW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return; 2503 MultiByteToWideChar( CP_ACP, 0, name, -1, nameW, len ); 2504 2505 r = MsiOpenDatabaseW(nameW, MSIDBOPEN_CREATE, &db); 2506 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2507 2508 /* import the tables into the database */ 2509 for (j = 0; j < num_tables; j++) 2510 { 2511 const msi_table *table = &tables[j]; 2512 2513 write_file(table->filename, table->data, (table->size - 1) * sizeof(char)); 2514 2515 r = MsiDatabaseImportA(db, CURR_DIR, table->filename); 2516 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2517 2518 DeleteFileA(table->filename); 2519 } 2520 2521 write_msi_summary_info(db, version, wordcount, template, packagecode); 2522 2523 r = MsiDatabaseCommit(db); 2524 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2525 2526 MsiCloseHandle(db); 2527 HeapFree( GetProcessHeap(), 0, nameW ); 2528 } 2529 2530 static void check_service_is_installed(void) 2531 { 2532 SC_HANDLE scm, service; 2533 BOOL res; 2534 2535 scm = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS); 2536 ok(scm != NULL, "Failed to open the SC Manager\n"); 2537 2538 service = OpenServiceA(scm, "TestService", SC_MANAGER_ALL_ACCESS); 2539 ok(service != NULL, "Failed to open TestService\n"); 2540 2541 res = DeleteService(service); 2542 ok(res, "Failed to delete TestService\n"); 2543 2544 CloseServiceHandle(service); 2545 CloseServiceHandle(scm); 2546 } 2547 2548 static BOOL notify_system_change(DWORD event_type, STATEMGRSTATUS *status) 2549 { 2550 RESTOREPOINTINFOA spec; 2551 2552 spec.dwEventType = event_type; 2553 spec.dwRestorePtType = APPLICATION_INSTALL; 2554 spec.llSequenceNumber = status->llSequenceNumber; 2555 lstrcpyA(spec.szDescription, "msitest restore point"); 2556 2557 return pSRSetRestorePointA(&spec, status); 2558 } 2559 2560 static void remove_restore_point(DWORD seq_number) 2561 { 2562 DWORD res; 2563 2564 res = pSRRemoveRestorePoint(seq_number); 2565 if (res != ERROR_SUCCESS) 2566 trace("Failed to remove the restore point : %08x\n", res); 2567 } 2568 2569 static LONG delete_key( HKEY key, LPCSTR subkey, REGSAM access ) 2570 { 2571 if (pRegDeleteKeyExA) 2572 return pRegDeleteKeyExA( key, subkey, access, 0 ); 2573 return RegDeleteKeyA( key, subkey ); 2574 } 2575 2576 static void test_MsiInstallProduct(void) 2577 { 2578 UINT r; 2579 CHAR path[MAX_PATH]; 2580 LONG res; 2581 HKEY hkey; 2582 DWORD num, size, type; 2583 REGSAM access = KEY_ALL_ACCESS; 2584 2585 if (is_process_limited()) 2586 { 2587 skip("process is limited\n"); 2588 return; 2589 } 2590 2591 if (is_wow64) 2592 access |= KEY_WOW64_64KEY; 2593 2594 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 2595 2596 /* szPackagePath is NULL */ 2597 r = MsiInstallProductA(NULL, "INSTALL=ALL"); 2598 ok(r == ERROR_INVALID_PARAMETER, 2599 "Expected ERROR_INVALID_PARAMETER, got %d\n", r); 2600 2601 /* both szPackagePath and szCommandLine are NULL */ 2602 r = MsiInstallProductA(NULL, NULL); 2603 ok(r == ERROR_INVALID_PARAMETER, 2604 "Expected ERROR_INVALID_PARAMETER, got %d\n", r); 2605 2606 /* szPackagePath is empty */ 2607 r = MsiInstallProductA("", "INSTALL=ALL"); 2608 ok(r == ERROR_PATH_NOT_FOUND, 2609 "Expected ERROR_PATH_NOT_FOUND, got %d\n", r); 2610 2611 create_test_files(); 2612 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table)); 2613 2614 /* install, don't publish */ 2615 r = MsiInstallProductA(msifile, NULL); 2616 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 2617 { 2618 skip("Not enough rights to perform tests\n"); 2619 goto error; 2620 } 2621 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2622 2623 delete_pf_files(); 2624 2625 res = RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); 2626 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); 2627 2628 size = MAX_PATH; 2629 type = REG_SZ; 2630 res = RegQueryValueExA(hkey, "Name", NULL, &type, (LPBYTE)path, &size); 2631 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); 2632 ok(!lstrcmpA(path, "imaname"), "Expected imaname, got %s\n", path); 2633 2634 size = MAX_PATH; 2635 type = REG_SZ; 2636 res = RegQueryValueExA(hkey, "blah", NULL, &type, (LPBYTE)path, &size); 2637 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); 2638 2639 size = sizeof(num); 2640 type = REG_DWORD; 2641 res = RegQueryValueExA(hkey, "number", NULL, &type, (LPBYTE)&num, &size); 2642 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); 2643 ok(num == 314, "Expected 314, got %d\n", num); 2644 2645 size = MAX_PATH; 2646 type = REG_SZ; 2647 res = RegQueryValueExA(hkey, "OrderTestName", NULL, &type, (LPBYTE)path, &size); 2648 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); 2649 ok(!lstrcmpA(path, "OrderTestValue"), "Expected OrderTestValue, got %s\n", path); 2650 2651 check_service_is_installed(); 2652 2653 delete_key(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", access); 2654 2655 /* not published, reinstall */ 2656 r = MsiInstallProductA(msifile, NULL); 2657 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2658 2659 delete_pf_files(); 2660 2661 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); 2662 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); 2663 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); 2664 2665 create_database(msifile, up_tables, sizeof(up_tables) / sizeof(msi_table)); 2666 2667 /* not published, RemovePreviousVersions set */ 2668 r = MsiInstallProductA(msifile, NULL); 2669 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2670 2671 delete_pf_files(); 2672 2673 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); 2674 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); 2675 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); 2676 2677 create_database(msifile, up2_tables, sizeof(up2_tables) / sizeof(msi_table)); 2678 2679 /* not published, version number bumped */ 2680 r = MsiInstallProductA(msifile, NULL); 2681 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2682 2683 delete_pf_files(); 2684 2685 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); 2686 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); 2687 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); 2688 2689 create_database(msifile, up3_tables, sizeof(up3_tables) / sizeof(msi_table)); 2690 2691 /* not published, RemovePreviousVersions set and version number bumped */ 2692 r = MsiInstallProductA(msifile, NULL); 2693 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2694 2695 delete_pf_files(); 2696 2697 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); 2698 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); 2699 RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); 2700 2701 create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table)); 2702 2703 /* install, publish product */ 2704 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1"); 2705 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2706 2707 delete_pf_files(); 2708 2709 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); 2710 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); 2711 2712 create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table)); 2713 2714 /* published, reinstall */ 2715 r = MsiInstallProductA(msifile, NULL); 2716 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2717 2718 delete_pf_files(); 2719 2720 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); 2721 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); 2722 2723 create_database(msifile, up5_tables, sizeof(up5_tables) / sizeof(msi_table)); 2724 2725 /* published product, RemovePreviousVersions set */ 2726 r = MsiInstallProductA(msifile, NULL); 2727 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2728 2729 delete_pf_files(); 2730 2731 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); 2732 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); 2733 2734 create_database(msifile, up6_tables, sizeof(up6_tables) / sizeof(msi_table)); 2735 2736 /* published product, version number bumped */ 2737 r = MsiInstallProductA(msifile, NULL); 2738 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2739 2740 delete_pf_files(); 2741 2742 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); 2743 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); 2744 2745 create_database(msifile, up7_tables, sizeof(up7_tables) / sizeof(msi_table)); 2746 2747 /* published product, RemovePreviousVersions set and version number bumped */ 2748 r = MsiInstallProductA(msifile, NULL); 2749 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2750 2751 delete_pf_files(); 2752 2753 res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); 2754 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); 2755 2756 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 2757 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2758 2759 error: 2760 delete_test_files(); 2761 DeleteFileA(msifile); 2762 } 2763 2764 static void test_MsiSetComponentState(void) 2765 { 2766 INSTALLSTATE installed, action; 2767 MSIHANDLE package; 2768 char path[MAX_PATH]; 2769 UINT r; 2770 2771 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table)); 2772 2773 CoInitialize(NULL); 2774 2775 lstrcpyA(path, CURR_DIR); 2776 lstrcatA(path, "\\"); 2777 lstrcatA(path, msifile); 2778 2779 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 2780 2781 r = MsiOpenPackageA(path, &package); 2782 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 2783 { 2784 skip("Not enough rights to perform tests\n"); 2785 goto error; 2786 } 2787 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2788 2789 r = MsiDoActionA(package, "CostInitialize"); 2790 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2791 2792 r = MsiDoActionA(package, "FileCost"); 2793 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2794 2795 r = MsiDoActionA(package, "CostFinalize"); 2796 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2797 2798 r = MsiGetComponentStateA(package, "dangler", &installed, &action); 2799 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2800 ok(installed == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", installed); 2801 ok(action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); 2802 2803 r = MsiSetComponentStateA(package, "dangler", INSTALLSTATE_SOURCE); 2804 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2805 2806 MsiCloseHandle(package); 2807 2808 error: 2809 CoUninitialize(); 2810 DeleteFileA(msifile); 2811 } 2812 2813 static void test_packagecoltypes(void) 2814 { 2815 MSIHANDLE hdb, view, rec; 2816 char path[MAX_PATH]; 2817 WCHAR pathW[MAX_PATH]; 2818 LPCSTR query; 2819 UINT r, count; 2820 2821 create_database(msifile, tables, sizeof(tables) / sizeof(msi_table)); 2822 2823 CoInitialize(NULL); 2824 2825 lstrcpyA(path, CURR_DIR); 2826 lstrcatA(path, "\\"); 2827 lstrcatA(path, msifile); 2828 MultiByteToWideChar( CP_ACP, 0, path, -1, pathW, MAX_PATH ); 2829 2830 r = MsiOpenDatabaseW(pathW, MSIDBOPEN_READONLY, &hdb); 2831 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2832 2833 query = "SELECT * FROM `Media`"; 2834 r = MsiDatabaseOpenViewA( hdb, query, &view ); 2835 ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); 2836 2837 r = MsiViewGetColumnInfo( view, MSICOLINFO_NAMES, &rec ); 2838 count = MsiRecordGetFieldCount( rec ); 2839 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n"); 2840 ok(count == 6, "Expected 6, got %d\n", count); 2841 ok(check_record(rec, 1, "DiskId"), "wrong column label\n"); 2842 ok(check_record(rec, 2, "LastSequence"), "wrong column label\n"); 2843 ok(check_record(rec, 3, "DiskPrompt"), "wrong column label\n"); 2844 ok(check_record(rec, 4, "Cabinet"), "wrong column label\n"); 2845 ok(check_record(rec, 5, "VolumeLabel"), "wrong column label\n"); 2846 ok(check_record(rec, 6, "Source"), "wrong column label\n"); 2847 MsiCloseHandle(rec); 2848 2849 r = MsiViewGetColumnInfo( view, MSICOLINFO_TYPES, &rec ); 2850 count = MsiRecordGetFieldCount( rec ); 2851 ok(r == ERROR_SUCCESS, "MsiViewGetColumnInfo failed\n"); 2852 ok(count == 6, "Expected 6, got %d\n", count); 2853 ok(check_record(rec, 1, "i2"), "wrong column label\n"); 2854 ok(check_record(rec, 2, "i4"), "wrong column label\n"); 2855 ok(check_record(rec, 3, "L64"), "wrong column label\n"); 2856 ok(check_record(rec, 4, "S255"), "wrong column label\n"); 2857 ok(check_record(rec, 5, "S32"), "wrong column label\n"); 2858 ok(check_record(rec, 6, "S72"), "wrong column label\n"); 2859 2860 MsiCloseHandle(rec); 2861 MsiCloseHandle(view); 2862 MsiCloseHandle(hdb); 2863 CoUninitialize(); 2864 2865 DeleteFileA(msifile); 2866 } 2867 2868 static void create_cc_test_files(void) 2869 { 2870 CCAB cabParams; 2871 HFCI hfci; 2872 ERF erf; 2873 static CHAR cab_context[] = "test%d.cab"; 2874 BOOL res; 2875 2876 create_file("maximus", 500); 2877 create_file("augustus", 50000); 2878 create_file("tiberius", 500); 2879 create_file("caesar", 500); 2880 2881 set_cab_parameters(&cabParams, "test1.cab", 40000); 2882 2883 hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open, 2884 fci_read, fci_write, fci_close, fci_seek, fci_delete, 2885 get_temp_file, &cabParams, cab_context); 2886 ok(hfci != NULL, "Failed to create an FCI context\n"); 2887 2888 res = add_file(hfci, "maximus", tcompTYPE_NONE); 2889 ok(res, "Failed to add file maximus\n"); 2890 2891 res = add_file(hfci, "augustus", tcompTYPE_NONE); 2892 ok(res, "Failed to add file augustus\n"); 2893 2894 res = add_file(hfci, "tiberius", tcompTYPE_NONE); 2895 ok(res, "Failed to add file tiberius\n"); 2896 2897 res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress); 2898 ok(res, "Failed to flush the cabinet\n"); 2899 2900 res = FCIDestroy(hfci); 2901 ok(res, "Failed to destroy the cabinet\n"); 2902 2903 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0"); 2904 2905 DeleteFileA("maximus"); 2906 DeleteFileA("augustus"); 2907 DeleteFileA("tiberius"); 2908 DeleteFileA("caesar"); 2909 } 2910 2911 static void delete_cab_files(void) 2912 { 2913 SHFILEOPSTRUCTA shfl; 2914 CHAR path[MAX_PATH+10]; 2915 2916 lstrcpyA(path, CURR_DIR); 2917 lstrcatA(path, "\\*.cab"); 2918 path[strlen(path) + 1] = '\0'; 2919 2920 shfl.hwnd = NULL; 2921 shfl.wFunc = FO_DELETE; 2922 shfl.pFrom = path; 2923 shfl.pTo = NULL; 2924 shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT; 2925 2926 SHFileOperationA(&shfl); 2927 } 2928 2929 static void test_continuouscabs(void) 2930 { 2931 UINT r; 2932 2933 if (is_process_limited()) 2934 { 2935 skip("process is limited\n"); 2936 return; 2937 } 2938 2939 create_cc_test_files(); 2940 create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table)); 2941 2942 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 2943 2944 r = MsiInstallProductA(msifile, NULL); 2945 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 2946 { 2947 skip("Not enough rights to perform tests\n"); 2948 goto error; 2949 } 2950 else 2951 { 2952 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2953 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 2954 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); 2955 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); 2956 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 2957 } 2958 2959 delete_cab_files(); 2960 DeleteFileA(msifile); 2961 2962 create_cc_test_files(); 2963 create_database(msifile, cc2_tables, sizeof(cc2_tables) / sizeof(msi_table)); 2964 2965 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 2966 2967 r = MsiInstallProductA(msifile, NULL); 2968 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 2969 { 2970 skip("Not enough rights to perform tests\n"); 2971 } 2972 else 2973 { 2974 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 2975 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); 2976 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); 2977 ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n"); 2978 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); 2979 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 2980 } 2981 2982 delete_cab_files(); 2983 DeleteFileA(msifile); 2984 2985 /* Tests to show that only msi cab filename is taken in case of mismatch with the one given by previous cab */ 2986 2987 /* Filename from cab is right and the one from msi is wrong */ 2988 create_cc_test_files(); 2989 create_database(msifile, cc3_tables, sizeof(cc3_tables) / sizeof(msi_table)); 2990 2991 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 2992 2993 r = MsiInstallProductA(msifile, NULL); 2994 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 2995 { 2996 skip("Not enough rights to perform tests\n"); 2997 } 2998 else 2999 { 3000 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 3001 todo_wine ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); 3002 ok(!delete_pf("msitest\\caesar", TRUE), "File installed\n"); 3003 todo_wine ok(!delete_pf("msitest\\maximus", TRUE), "File installed\n"); 3004 todo_wine ok(!delete_pf("msitest", FALSE), "Directory created\n"); 3005 } 3006 3007 delete_cab_files(); 3008 DeleteFileA(msifile); 3009 3010 /* Filename from msi is right and the one from cab is wrong */ 3011 create_cc_test_files(); 3012 ok(MoveFileA("test2.cab", "test2_.cab"), "Cannot rename test2.cab to test2_.cab\n"); 3013 create_database(msifile, cc3_tables, sizeof(cc3_tables) / sizeof(msi_table)); 3014 3015 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3016 3017 r = MsiInstallProductA(msifile, NULL); 3018 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3019 { 3020 skip("Not enough rights to perform tests\n"); 3021 } 3022 else 3023 { 3024 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3025 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 3026 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); 3027 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); 3028 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3029 } 3030 3031 error: 3032 delete_cab_files(); 3033 DeleteFileA(msifile); 3034 } 3035 3036 static void test_caborder(void) 3037 { 3038 UINT r; 3039 3040 create_file("imperator", 100); 3041 create_file("maximus", 500); 3042 create_file("augustus", 50000); 3043 create_file("caesar", 500); 3044 3045 create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table)); 3046 3047 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3048 3049 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0"); 3050 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0"); 3051 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0"); 3052 3053 r = MsiInstallProductA(msifile, NULL); 3054 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3055 { 3056 skip("Not enough rights to perform tests\n"); 3057 goto error; 3058 } 3059 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 3060 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n"); 3061 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n"); 3062 todo_wine 3063 { 3064 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n"); 3065 ok(!delete_pf("msitest", FALSE), "Directory is created\n"); 3066 } 3067 3068 delete_cab_files(); 3069 3070 create_cab_file("test1.cab", MEDIA_SIZE, "imperator\0"); 3071 create_cab_file("test2.cab", MEDIA_SIZE, "maximus\0augustus\0"); 3072 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0"); 3073 3074 r = MsiInstallProductA(msifile, NULL); 3075 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 3076 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n"); 3077 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n"); 3078 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n"); 3079 ok(!delete_pf("msitest", FALSE), "Directory is created\n"); 3080 3081 delete_cab_files(); 3082 DeleteFileA(msifile); 3083 3084 create_cc_test_files(); 3085 create_database(msifile, co_tables, sizeof(co_tables) / sizeof(msi_table)); 3086 3087 r = MsiInstallProductA(msifile, NULL); 3088 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 3089 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n"); 3090 ok(!delete_pf("msitest", FALSE), "Directory is created\n"); 3091 todo_wine 3092 { 3093 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n"); 3094 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n"); 3095 } 3096 3097 delete_cab_files(); 3098 DeleteFileA(msifile); 3099 3100 create_cc_test_files(); 3101 create_database(msifile, co2_tables, sizeof(co2_tables) / sizeof(msi_table)); 3102 3103 r = MsiInstallProductA(msifile, NULL); 3104 ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n"); 3105 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 3106 todo_wine 3107 { 3108 ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n"); 3109 ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n"); 3110 ok(!delete_pf("msitest", FALSE), "Directory is created\n"); 3111 } 3112 3113 error: 3114 delete_cab_files(); 3115 DeleteFileA("imperator"); 3116 DeleteFileA("maximus"); 3117 DeleteFileA("augustus"); 3118 DeleteFileA("caesar"); 3119 DeleteFileA(msifile); 3120 } 3121 3122 static void test_mixedmedia(void) 3123 { 3124 UINT r; 3125 3126 if (is_process_limited()) 3127 { 3128 skip("process is limited\n"); 3129 return; 3130 } 3131 3132 CreateDirectoryA("msitest", NULL); 3133 create_file("msitest\\maximus", 500); 3134 create_file("msitest\\augustus", 500); 3135 create_file("caesar", 500); 3136 3137 create_database(msifile, mm_tables, sizeof(mm_tables) / sizeof(msi_table)); 3138 3139 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3140 3141 create_cab_file("test1.cab", MEDIA_SIZE, "caesar\0"); 3142 3143 r = MsiInstallProductA(msifile, NULL); 3144 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3145 { 3146 skip("Not enough rights to perform tests\n"); 3147 goto error; 3148 } 3149 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3150 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 3151 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); 3152 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); 3153 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3154 3155 error: 3156 /* Delete the files in the temp (current) folder */ 3157 DeleteFileA("msitest\\maximus"); 3158 DeleteFileA("msitest\\augustus"); 3159 RemoveDirectoryA("msitest"); 3160 DeleteFileA("caesar"); 3161 DeleteFileA("test1.cab"); 3162 DeleteFileA(msifile); 3163 } 3164 3165 static void test_samesequence(void) 3166 { 3167 UINT r; 3168 3169 create_cc_test_files(); 3170 create_database(msifile, ss_tables, sizeof(ss_tables) / sizeof(msi_table)); 3171 3172 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3173 3174 r = MsiInstallProductA(msifile, NULL); 3175 if (r == ERROR_INSTALL_FAILURE) 3176 { 3177 win_skip("unprivileged user?\n"); 3178 goto error; 3179 } 3180 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3181 if (r == ERROR_SUCCESS) 3182 { 3183 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 3184 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); 3185 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); 3186 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3187 } 3188 3189 error: 3190 delete_cab_files(); 3191 DeleteFileA(msifile); 3192 } 3193 3194 static void test_uiLevelFlags(void) 3195 { 3196 UINT r; 3197 3198 create_cc_test_files(); 3199 create_database(msifile, ui_tables, sizeof(ui_tables) / sizeof(msi_table)); 3200 3201 MsiSetInternalUI(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY, NULL); 3202 3203 r = MsiInstallProductA(msifile, NULL); 3204 if (r == ERROR_INSTALL_FAILURE) 3205 { 3206 win_skip("unprivileged user?\n"); 3207 goto error; 3208 } 3209 3210 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3211 if (r == ERROR_SUCCESS) 3212 { 3213 ok(!delete_pf("msitest\\maximus", TRUE), "UI install occurred, but execute-only was requested.\n"); 3214 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); 3215 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 3216 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3217 } 3218 3219 error: 3220 delete_cab_files(); 3221 DeleteFileA(msifile); 3222 } 3223 3224 static BOOL file_matches(LPSTR path) 3225 { 3226 CHAR buf[MAX_PATH]; 3227 HANDLE file; 3228 DWORD size; 3229 3230 file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 3231 NULL, OPEN_EXISTING, 0, NULL); 3232 ZeroMemory(buf, MAX_PATH); 3233 ReadFile(file, buf, 15, &size, NULL); 3234 CloseHandle(file); 3235 3236 return !lstrcmpA(buf, "msitest\\maximus"); 3237 } 3238 3239 static void test_readonlyfile(void) 3240 { 3241 UINT r; 3242 DWORD size; 3243 HANDLE file; 3244 CHAR path[MAX_PATH]; 3245 3246 if (is_process_limited()) 3247 { 3248 skip("process is limited\n"); 3249 return; 3250 } 3251 3252 CreateDirectoryA("msitest", NULL); 3253 create_file("msitest\\maximus", 500); 3254 create_database(msifile, rof_tables, sizeof(rof_tables) / sizeof(msi_table)); 3255 3256 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3257 3258 lstrcpyA(path, PROG_FILES_DIR); 3259 lstrcatA(path, "\\msitest"); 3260 CreateDirectoryA(path, NULL); 3261 3262 lstrcatA(path, "\\maximus"); 3263 file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 3264 NULL, CREATE_NEW, FILE_ATTRIBUTE_READONLY, NULL); 3265 3266 WriteFile(file, "readonlyfile", strlen("readonlyfile"), &size, NULL); 3267 CloseHandle(file); 3268 3269 r = MsiInstallProductA(msifile, NULL); 3270 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3271 { 3272 skip("Not enough rights to perform tests\n"); 3273 goto error; 3274 } 3275 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3276 ok(file_matches(path), "Expected file to be overwritten\n"); 3277 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); 3278 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3279 3280 error: 3281 /* Delete the files in the temp (current) folder */ 3282 DeleteFileA("msitest\\maximus"); 3283 RemoveDirectoryA("msitest"); 3284 DeleteFileA(msifile); 3285 } 3286 3287 static void test_readonlyfile_cab(void) 3288 { 3289 UINT r; 3290 DWORD size; 3291 HANDLE file; 3292 CHAR path[MAX_PATH]; 3293 CHAR buf[16]; 3294 3295 if (is_process_limited()) 3296 { 3297 skip("process is limited\n"); 3298 return; 3299 } 3300 3301 CreateDirectoryA("msitest", NULL); 3302 create_file("maximus", 500); 3303 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0"); 3304 DeleteFileA("maximus"); 3305 3306 create_database(msifile, rofc_tables, sizeof(rofc_tables) / sizeof(msi_table)); 3307 3308 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3309 3310 lstrcpyA(path, PROG_FILES_DIR); 3311 lstrcatA(path, "\\msitest"); 3312 CreateDirectoryA(path, NULL); 3313 3314 lstrcatA(path, "\\maximus"); 3315 file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 3316 NULL, CREATE_NEW, FILE_ATTRIBUTE_READONLY, NULL); 3317 3318 WriteFile(file, "readonlyfile", strlen("readonlyfile"), &size, NULL); 3319 CloseHandle(file); 3320 3321 r = MsiInstallProductA(msifile, NULL); 3322 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3323 { 3324 skip("Not enough rights to perform tests\n"); 3325 goto error; 3326 } 3327 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3328 3329 memset( buf, 0, sizeof(buf) ); 3330 if ((file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 3331 NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE) 3332 { 3333 ReadFile(file, buf, sizeof(buf) - 1, &size, NULL); 3334 CloseHandle(file); 3335 } 3336 ok(!memcmp( buf, "maximus", sizeof("maximus")-1 ), "Expected file to be overwritten, got '%s'\n", buf); 3337 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); 3338 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3339 3340 error: 3341 /* Delete the files in the temp (current) folder */ 3342 delete_cab_files(); 3343 DeleteFileA("msitest\\maximus"); 3344 RemoveDirectoryA("msitest"); 3345 DeleteFileA(msifile); 3346 } 3347 3348 static void test_setdirproperty(void) 3349 { 3350 UINT r; 3351 3352 if (is_process_limited()) 3353 { 3354 skip("process is limited\n"); 3355 return; 3356 } 3357 3358 CreateDirectoryA("msitest", NULL); 3359 create_file("msitest\\maximus", 500); 3360 create_database(msifile, sdp_tables, sizeof(sdp_tables) / sizeof(msi_table)); 3361 3362 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3363 3364 r = MsiInstallProductA(msifile, NULL); 3365 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3366 { 3367 skip("Not enough rights to perform tests\n"); 3368 goto error; 3369 } 3370 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3371 ok(delete_cf("msitest\\maximus", TRUE), "File not installed\n"); 3372 ok(delete_cf("msitest", FALSE), "Directory not created\n"); 3373 3374 error: 3375 /* Delete the files in the temp (current) folder */ 3376 DeleteFileA(msifile); 3377 DeleteFileA("msitest\\maximus"); 3378 RemoveDirectoryA("msitest"); 3379 } 3380 3381 static void test_cabisextracted(void) 3382 { 3383 UINT r; 3384 3385 if (is_process_limited()) 3386 { 3387 skip("process is limited\n"); 3388 return; 3389 } 3390 3391 CreateDirectoryA("msitest", NULL); 3392 create_file("msitest\\gaius", 500); 3393 create_file("maximus", 500); 3394 create_file("augustus", 500); 3395 create_file("caesar", 500); 3396 3397 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0"); 3398 create_cab_file("test2.cab", MEDIA_SIZE, "augustus\0"); 3399 create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0"); 3400 3401 create_database(msifile, cie_tables, sizeof(cie_tables) / sizeof(msi_table)); 3402 3403 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3404 3405 r = MsiInstallProductA(msifile, NULL); 3406 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3407 { 3408 skip("Not enough rights to perform tests\n"); 3409 goto error; 3410 } 3411 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3412 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); 3413 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 3414 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); 3415 ok(delete_pf("msitest\\gaius", TRUE), "File not installed\n"); 3416 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3417 3418 error: 3419 /* Delete the files in the temp (current) folder */ 3420 delete_cab_files(); 3421 DeleteFileA(msifile); 3422 DeleteFileA("maximus"); 3423 DeleteFileA("augustus"); 3424 DeleteFileA("caesar"); 3425 DeleteFileA("msitest\\gaius"); 3426 RemoveDirectoryA("msitest"); 3427 } 3428 3429 static BOOL file_exists(LPCSTR file) 3430 { 3431 return GetFileAttributesA(file) != INVALID_FILE_ATTRIBUTES; 3432 } 3433 3434 static BOOL pf_exists(LPCSTR file) 3435 { 3436 CHAR path[MAX_PATH]; 3437 3438 lstrcpyA(path, PROG_FILES_DIR); 3439 lstrcatA(path, "\\"); 3440 lstrcatA(path, file); 3441 3442 return file_exists(path); 3443 } 3444 3445 static void delete_pfmsitest_files(void) 3446 { 3447 SHFILEOPSTRUCTA shfl; 3448 CHAR path[MAX_PATH+11]; 3449 3450 lstrcpyA(path, PROG_FILES_DIR); 3451 lstrcatA(path, "\\msitest\\*"); 3452 path[strlen(path) + 1] = '\0'; 3453 3454 shfl.hwnd = NULL; 3455 shfl.wFunc = FO_DELETE; 3456 shfl.pFrom = path; 3457 shfl.pTo = NULL; 3458 shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT | FOF_NOERRORUI; 3459 3460 SHFileOperationA(&shfl); 3461 3462 lstrcpyA(path, PROG_FILES_DIR); 3463 lstrcatA(path, "\\msitest"); 3464 RemoveDirectoryA(path); 3465 } 3466 3467 static UINT run_query(MSIHANDLE hdb, MSIHANDLE hrec, const char *query) 3468 { 3469 MSIHANDLE hview = 0; 3470 UINT r; 3471 3472 r = MsiDatabaseOpenViewA(hdb, query, &hview); 3473 if(r != ERROR_SUCCESS) 3474 return r; 3475 3476 r = MsiViewExecute(hview, hrec); 3477 if(r == ERROR_SUCCESS) 3478 r = MsiViewClose(hview); 3479 MsiCloseHandle(hview); 3480 return r; 3481 } 3482 3483 static void set_transform_summary_info(void) 3484 { 3485 UINT r; 3486 MSIHANDLE suminfo = 0; 3487 3488 /* build summary info */ 3489 r = MsiGetSummaryInformationA(0, mstfile, 3, &suminfo); 3490 ok(r == ERROR_SUCCESS , "Failed to open summaryinfo\n"); 3491 3492 r = MsiSummaryInfoSetPropertyA(suminfo, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST"); 3493 ok(r == ERROR_SUCCESS, "Failed to set summary info\n"); 3494 3495 r = MsiSummaryInfoSetPropertyA(suminfo, PID_REVNUMBER, VT_LPSTR, 0, NULL, 3496 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;" 3497 "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}1.1.1;" 3498 "{4C0EAA15-0264-4E5A-8758-609EF142B92D}"); 3499 ok(r == ERROR_SUCCESS , "Failed to set summary info\n"); 3500 3501 r = MsiSummaryInfoSetPropertyA(suminfo, PID_PAGECOUNT, VT_I4, 100, NULL, NULL); 3502 ok(r == ERROR_SUCCESS, "Failed to set summary info\n"); 3503 3504 r = MsiSummaryInfoPersist(suminfo); 3505 ok(r == ERROR_SUCCESS , "Failed to make summary info persist\n"); 3506 3507 r = MsiCloseHandle(suminfo); 3508 ok(r == ERROR_SUCCESS , "Failed to close suminfo\n"); 3509 } 3510 3511 static void generate_transform(void) 3512 { 3513 MSIHANDLE hdb1, hdb2; 3514 LPCSTR query; 3515 UINT r; 3516 3517 /* start with two identical databases */ 3518 CopyFileA(msifile, msifile2, FALSE); 3519 3520 r = MsiOpenDatabaseW(msifile2W, MSIDBOPEN_TRANSACT, &hdb1); 3521 ok(r == ERROR_SUCCESS , "Failed to create database\n"); 3522 3523 r = MsiDatabaseCommit(hdb1); 3524 ok(r == ERROR_SUCCESS , "Failed to commit database\n"); 3525 3526 r = MsiOpenDatabaseW(msifileW, MSIDBOPEN_READONLY, &hdb2); 3527 ok(r == ERROR_SUCCESS , "Failed to create database\n"); 3528 3529 query = "INSERT INTO `Property` ( `Property`, `Value` ) VALUES ( 'prop', 'val' )"; 3530 r = run_query(hdb1, 0, query); 3531 ok(r == ERROR_SUCCESS, "failed to add property\n"); 3532 3533 /* database needs to be committed */ 3534 MsiDatabaseCommit(hdb1); 3535 3536 r = MsiDatabaseGenerateTransformA(hdb1, hdb2, mstfile, 0, 0); 3537 ok(r == ERROR_SUCCESS, "return code %d, should be ERROR_SUCCESS\n", r); 3538 3539 r = MsiCreateTransformSummaryInfoA(hdb2, hdb2, mstfile, 0, 0); 3540 todo_wine ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); 3541 3542 MsiCloseHandle(hdb1); 3543 MsiCloseHandle(hdb2); 3544 } 3545 3546 /* data for generating a transform */ 3547 3548 /* tables transform names - encoded as they would be in an msi database file */ 3549 static const WCHAR name1[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */ 3550 static const WCHAR name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */ 3551 static const WCHAR name3[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */ 3552 3553 /* data in each table */ 3554 static const char data1[] = /* _StringData */ 3555 "propval"; /* all the strings squashed together */ 3556 3557 static const WCHAR data2[] = { /* _StringPool */ 3558 /* len, refs */ 3559 0, 0, /* string 0 '' */ 3560 4, 1, /* string 1 'prop' */ 3561 3, 1, /* string 2 'val' */ 3562 }; 3563 3564 static const WCHAR data3[] = { /* Property */ 3565 0x0201, 0x0001, 0x0002, 3566 }; 3567 3568 static const struct { 3569 LPCWSTR name; 3570 const void *data; 3571 DWORD size; 3572 } table_transform_data[] = 3573 { 3574 { name1, data1, sizeof data1 - 1 }, 3575 { name2, data2, sizeof data2 }, 3576 { name3, data3, sizeof data3 }, 3577 }; 3578 3579 #define NUM_TRANSFORM_TABLES (sizeof table_transform_data/sizeof table_transform_data[0]) 3580 3581 static void generate_transform_manual(void) 3582 { 3583 IStorage *stg = NULL; 3584 IStream *stm; 3585 WCHAR name[0x20]; 3586 HRESULT r; 3587 DWORD i, count; 3588 const DWORD mode = STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE; 3589 3590 const CLSID CLSID_MsiTransform = { 0xc1082,0,0,{0xc0,0,0,0,0,0,0,0x46}}; 3591 3592 MultiByteToWideChar(CP_ACP, 0, mstfile, -1, name, 0x20); 3593 3594 r = StgCreateDocfile(name, mode, 0, &stg); 3595 ok(r == S_OK, "failed to create storage\n"); 3596 if (!stg) 3597 return; 3598 3599 r = IStorage_SetClass(stg, &CLSID_MsiTransform); 3600 ok(r == S_OK, "failed to set storage type\n"); 3601 3602 for (i=0; i<NUM_TRANSFORM_TABLES; i++) 3603 { 3604 r = IStorage_CreateStream(stg, table_transform_data[i].name, 3605 STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm); 3606 if (FAILED(r)) 3607 { 3608 ok(0, "failed to create stream %08x\n", r); 3609 continue; 3610 } 3611 3612 r = IStream_Write(stm, table_transform_data[i].data, 3613 table_transform_data[i].size, &count); 3614 if (FAILED(r) || count != table_transform_data[i].size) 3615 ok(0, "failed to write stream\n"); 3616 IStream_Release(stm); 3617 } 3618 3619 IStorage_Release(stg); 3620 3621 set_transform_summary_info(); 3622 } 3623 3624 static void test_transformprop(void) 3625 { 3626 UINT r; 3627 3628 if (is_process_limited()) 3629 { 3630 skip("process is limited\n"); 3631 return; 3632 } 3633 3634 CreateDirectoryA("msitest", NULL); 3635 create_file("msitest\\augustus", 500); 3636 3637 create_database(msifile, tp_tables, sizeof(tp_tables) / sizeof(msi_table)); 3638 3639 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3640 3641 r = MsiInstallProductA(msifile, NULL); 3642 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3643 { 3644 skip("Not enough rights to perform tests\n"); 3645 goto error; 3646 } 3647 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3648 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); 3649 ok(!delete_pf("msitest", FALSE), "Directory created\n"); 3650 3651 if (0) 3652 generate_transform(); 3653 else 3654 generate_transform_manual(); 3655 3656 r = MsiInstallProductA(msifile, "TRANSFORMS=winetest.mst"); 3657 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3658 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 3659 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3660 3661 error: 3662 /* Delete the files in the temp (current) folder */ 3663 DeleteFileA(msifile); 3664 DeleteFileA(msifile2); 3665 DeleteFileA(mstfile); 3666 DeleteFileA("msitest\\augustus"); 3667 RemoveDirectoryA("msitest"); 3668 } 3669 3670 static void test_currentworkingdir(void) 3671 { 3672 UINT r; 3673 CHAR drive[MAX_PATH], path[MAX_PATH]; 3674 LPSTR ptr; 3675 3676 if (is_process_limited()) 3677 { 3678 skip("process is limited\n"); 3679 return; 3680 } 3681 3682 CreateDirectoryA("msitest", NULL); 3683 create_file("msitest\\augustus", 500); 3684 3685 create_database(msifile, cwd_tables, sizeof(cwd_tables) / sizeof(msi_table)); 3686 3687 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3688 3689 CreateDirectoryA("diffdir", NULL); 3690 SetCurrentDirectoryA("diffdir"); 3691 3692 sprintf(path, "..\\%s", msifile); 3693 r = MsiInstallProductA(path, NULL); 3694 todo_wine 3695 { 3696 ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r); 3697 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); 3698 ok(!delete_pf("msitest", FALSE), "Directory created\n"); 3699 } 3700 3701 sprintf(path, "%s\\%s", CURR_DIR, msifile); 3702 r = MsiInstallProductA(path, NULL); 3703 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3704 { 3705 skip("Not enough rights to perform tests\n"); 3706 goto error; 3707 } 3708 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3709 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 3710 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3711 3712 lstrcpyA(drive, CURR_DIR); 3713 drive[2] = '\\'; 3714 drive[3] = '\0'; 3715 SetCurrentDirectoryA(drive); 3716 3717 lstrcpyA(path, CURR_DIR); 3718 if (path[lstrlenA(path) - 1] != '\\') lstrcatA(path, "\\"); 3719 lstrcatA(path, msifile); 3720 ptr = strchr(path, ':'); 3721 ptr +=2; 3722 3723 r = MsiInstallProductA(ptr, NULL); 3724 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3725 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 3726 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3727 3728 error: 3729 SetCurrentDirectoryA(CURR_DIR); 3730 DeleteFileA(msifile); 3731 DeleteFileA("msitest\\augustus"); 3732 RemoveDirectoryA("msitest"); 3733 RemoveDirectoryA("diffdir"); 3734 } 3735 3736 static void set_admin_summary_info(const WCHAR *name) 3737 { 3738 MSIHANDLE db, summary; 3739 UINT r; 3740 3741 r = MsiOpenDatabaseW(name, MSIDBOPEN_DIRECT, &db); 3742 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3743 3744 r = MsiGetSummaryInformationA(db, NULL, 1, &summary); 3745 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3746 3747 r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, 5, NULL, NULL); 3748 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3749 3750 /* write the summary changes back to the stream */ 3751 r = MsiSummaryInfoPersist(summary); 3752 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3753 3754 MsiCloseHandle(summary); 3755 3756 r = MsiDatabaseCommit(db); 3757 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3758 3759 MsiCloseHandle(db); 3760 } 3761 3762 static void test_admin(void) 3763 { 3764 UINT r; 3765 3766 CreateDirectoryA("msitest", NULL); 3767 create_file("msitest\\augustus", 500); 3768 3769 create_database(msifile, adm_tables, sizeof(adm_tables) / sizeof(msi_table)); 3770 set_admin_summary_info(msifileW); 3771 3772 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3773 3774 r = MsiInstallProductA(msifile, NULL); 3775 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3776 { 3777 skip("Not enough rights to perform tests\n"); 3778 goto error; 3779 } 3780 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3781 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); 3782 ok(!delete_pf("msitest", FALSE), "Directory created\n"); 3783 ok(!DeleteFileA("c:\\msitest\\augustus"), "File installed\n"); 3784 ok(!RemoveDirectoryA("c:\\msitest"), "File installed\n"); 3785 3786 r = MsiInstallProductA(msifile, "ACTION=ADMIN"); 3787 todo_wine 3788 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3789 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); 3790 ok(!delete_pf("msitest", FALSE), "Directory created\n"); 3791 todo_wine 3792 { 3793 ok(DeleteFileA("c:\\msitest\\augustus"), "File not installed\n"); 3794 ok(RemoveDirectoryA("c:\\msitest"), "File not installed\n"); 3795 } 3796 3797 error: 3798 DeleteFileA(msifile); 3799 DeleteFileA("msitest\\augustus"); 3800 RemoveDirectoryA("msitest"); 3801 } 3802 3803 static void set_admin_property_stream(LPCSTR file) 3804 { 3805 IStorage *stg; 3806 IStream *stm; 3807 WCHAR fileW[MAX_PATH]; 3808 HRESULT hr; 3809 DWORD count; 3810 const DWORD mode = STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE; 3811 3812 /* AdminProperties */ 3813 static const WCHAR stmname[] = {0x41ca,0x4330,0x3e71,0x44b5,0x4233,0x45f5,0x422c,0x4836,0}; 3814 static const WCHAR data[] = {'M','Y','P','R','O','P','=','2','7','1','8',' ', 3815 'M','y','P','r','o','p','=','4','2',0}; 3816 3817 MultiByteToWideChar(CP_ACP, 0, file, -1, fileW, MAX_PATH); 3818 3819 hr = StgOpenStorage(fileW, NULL, mode, NULL, 0, &stg); 3820 ok(hr == S_OK, "Expected S_OK, got %d\n", hr); 3821 if (!stg) 3822 return; 3823 3824 hr = IStorage_CreateStream(stg, stmname, STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm); 3825 ok(hr == S_OK, "Expected S_OK, got %d\n", hr); 3826 3827 hr = IStream_Write(stm, data, sizeof(data), &count); 3828 ok(hr == S_OK, "Expected S_OK, got %d\n", hr); 3829 3830 IStream_Release(stm); 3831 IStorage_Release(stg); 3832 } 3833 3834 static void test_adminprops(void) 3835 { 3836 UINT r; 3837 3838 if (is_process_limited()) 3839 { 3840 skip("process is limited\n"); 3841 return; 3842 } 3843 3844 CreateDirectoryA("msitest", NULL); 3845 create_file("msitest\\augustus", 500); 3846 3847 create_database(msifile, amp_tables, sizeof(amp_tables) / sizeof(msi_table)); 3848 set_admin_summary_info(msifileW); 3849 set_admin_property_stream(msifile); 3850 3851 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3852 3853 r = MsiInstallProductA(msifile, NULL); 3854 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3855 { 3856 skip("Not enough rights to perform tests\n"); 3857 goto error; 3858 } 3859 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3860 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); 3861 ok(delete_pf("msitest", FALSE), "Directory created\n"); 3862 3863 error: 3864 DeleteFileA(msifile); 3865 DeleteFileA("msitest\\augustus"); 3866 RemoveDirectoryA("msitest"); 3867 } 3868 3869 static void create_pf_data(LPCSTR file, LPCSTR data, BOOL is_file) 3870 { 3871 CHAR path[MAX_PATH]; 3872 3873 lstrcpyA(path, PROG_FILES_DIR); 3874 lstrcatA(path, "\\"); 3875 lstrcatA(path, file); 3876 3877 if (is_file) 3878 create_file_data(path, data, 500); 3879 else 3880 CreateDirectoryA(path, NULL); 3881 } 3882 3883 #define create_pf(file, is_file) create_pf_data(file, file, is_file) 3884 3885 static void test_missingcab(void) 3886 { 3887 UINT r; 3888 3889 if (is_process_limited()) 3890 { 3891 skip("process is limited\n"); 3892 return; 3893 } 3894 3895 CreateDirectoryA("msitest", NULL); 3896 create_file("msitest\\augustus", 500); 3897 create_file("maximus", 500); 3898 create_file("tiberius", 500); 3899 3900 create_database(msifile, mc_tables, sizeof(mc_tables) / sizeof(msi_table)); 3901 3902 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3903 3904 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0"); 3905 create_cab_file("test4.cab", MEDIA_SIZE, "tiberius\0"); 3906 3907 create_pf("msitest", FALSE); 3908 create_pf_data("msitest\\caesar", "abcdefgh", TRUE); 3909 create_pf_data("msitest\\tiberius", "abcdefgh", TRUE); 3910 3911 r = MsiInstallProductA(msifile, NULL); 3912 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3913 { 3914 skip("Not enough rights to perform tests\n"); 3915 goto error; 3916 } 3917 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 3918 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 3919 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); 3920 ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); 3921 ok(compare_pf_data("msitest\\tiberius", "abcdefgh", sizeof("abcdefgh")), "Wrong file contents\n"); 3922 ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n"); 3923 ok(!delete_pf("msitest\\gaius", TRUE), "File installed\n"); 3924 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3925 3926 create_pf("msitest", FALSE); 3927 create_pf_data("msitest\\caesar", "abcdefgh", TRUE); 3928 create_pf_data("msitest\\tiberius", "abcdefgh", TRUE); 3929 create_pf("msitest\\gaius", TRUE); 3930 3931 r = MsiInstallProductA(msifile, "GAIUS=1"); 3932 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 3933 todo_wine 3934 { 3935 ok(!delete_pf("msitest\\maximus", TRUE), "File installed\n"); 3936 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); 3937 } 3938 ok(delete_pf("msitest\\caesar", TRUE), "File removed\n"); 3939 ok(compare_pf_data("msitest\\tiberius", "abcdefgh", sizeof("abcdefgh")), "Wrong file contents\n"); 3940 ok(delete_pf("msitest\\tiberius", TRUE), "File removed\n"); 3941 ok(delete_pf("msitest\\gaius", TRUE), "File removed\n"); 3942 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 3943 3944 error: 3945 delete_pf("msitest", FALSE); 3946 DeleteFileA("msitest\\augustus"); 3947 RemoveDirectoryA("msitest"); 3948 DeleteFileA("maximus"); 3949 DeleteFileA("tiberius"); 3950 DeleteFileA("test1.cab"); 3951 DeleteFileA("test4.cab"); 3952 DeleteFileA(msifile); 3953 } 3954 3955 static void test_sourcefolder(void) 3956 { 3957 UINT r; 3958 3959 if (is_process_limited()) 3960 { 3961 skip("process is limited\n"); 3962 return; 3963 } 3964 3965 CreateDirectoryA("msitest", NULL); 3966 create_file("augustus", 500); 3967 3968 create_database(msifile, sf_tables, sizeof(sf_tables) / sizeof(msi_table)); 3969 3970 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 3971 3972 r = MsiInstallProductA(msifile, NULL); 3973 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 3974 { 3975 skip("Not enough rights to perform tests\n"); 3976 goto error; 3977 } 3978 ok(r == ERROR_INSTALL_FAILURE, 3979 "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 3980 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); 3981 todo_wine 3982 { 3983 ok(!delete_pf("msitest", FALSE), "Directory created\n"); 3984 } 3985 RemoveDirectoryA("msitest"); 3986 3987 r = MsiInstallProductA(msifile, NULL); 3988 ok(r == ERROR_INSTALL_FAILURE, 3989 "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 3990 ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); 3991 todo_wine 3992 { 3993 ok(!delete_pf("msitest", FALSE), "Directory created\n"); 3994 } 3995 3996 error: 3997 DeleteFileA(msifile); 3998 DeleteFileA("augustus"); 3999 } 4000 4001 static void test_customaction51(void) 4002 { 4003 UINT r; 4004 4005 if (is_process_limited()) 4006 { 4007 skip("process is limited\n"); 4008 return; 4009 } 4010 4011 CreateDirectoryA("msitest", NULL); 4012 create_file("msitest\\augustus", 500); 4013 4014 create_database(msifile, ca51_tables, sizeof(ca51_tables) / sizeof(msi_table)); 4015 4016 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4017 4018 r = MsiInstallProductA(msifile, NULL); 4019 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 4020 { 4021 skip("Not enough rights to perform tests\n"); 4022 goto error; 4023 } 4024 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4025 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); 4026 ok(delete_pf("msitest", FALSE), "Directory created\n"); 4027 4028 error: 4029 DeleteFileA(msifile); 4030 DeleteFileA("msitest\\augustus"); 4031 RemoveDirectoryA("msitest"); 4032 } 4033 4034 static void test_installstate(void) 4035 { 4036 UINT r; 4037 4038 if (is_process_limited()) 4039 { 4040 skip("process is limited\n"); 4041 return; 4042 } 4043 4044 CreateDirectoryA("msitest", NULL); 4045 create_file("msitest\\alpha", 500); 4046 create_file("msitest\\beta", 500); 4047 create_file("msitest\\gamma", 500); 4048 create_file("msitest\\theta", 500); 4049 create_file("msitest\\delta", 500); 4050 create_file("msitest\\epsilon", 500); 4051 create_file("msitest\\zeta", 500); 4052 create_file("msitest\\iota", 500); 4053 create_file("msitest\\eta", 500); 4054 create_file("msitest\\kappa", 500); 4055 create_file("msitest\\lambda", 500); 4056 create_file("msitest\\mu", 500); 4057 4058 create_database(msifile, is_tables, sizeof(is_tables) / sizeof(msi_table)); 4059 4060 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4061 4062 r = MsiInstallProductA(msifile, NULL); 4063 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 4064 { 4065 skip("Not enough rights to perform tests\n"); 4066 goto error; 4067 } 4068 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4069 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n"); 4070 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n"); 4071 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n"); 4072 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n"); 4073 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n"); 4074 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n"); 4075 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n"); 4076 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n"); 4077 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n"); 4078 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n"); 4079 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n"); 4080 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n"); 4081 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 4082 4083 r = MsiInstallProductA(msifile, "ADDLOCAL=\"one,two,three,four\""); 4084 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4085 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n"); 4086 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n"); 4087 ok(delete_pf("msitest\\gamma", TRUE), "File not installed\n"); 4088 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n"); 4089 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n"); 4090 ok(delete_pf("msitest\\epsilon", TRUE), "File not installed\n"); 4091 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n"); 4092 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n"); 4093 ok(delete_pf("msitest\\eta", TRUE), "File not installed\n"); 4094 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n"); 4095 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n"); 4096 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n"); 4097 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 4098 4099 r = MsiInstallProductA(msifile, "ADDSOURCE=\"one,two,three,four\""); 4100 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4101 ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n"); 4102 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n"); 4103 ok(!delete_pf("msitest\\gamma", TRUE), "File installed\n"); 4104 ok(delete_pf("msitest\\theta", TRUE), "File not installed\n"); 4105 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n"); 4106 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n"); 4107 ok(delete_pf("msitest\\zeta", TRUE), "File not installed\n"); 4108 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n"); 4109 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n"); 4110 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n"); 4111 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n"); 4112 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n"); 4113 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 4114 4115 r = MsiInstallProductA(msifile, "REMOVE=\"one,two,three,four\""); 4116 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4117 ok(!delete_pf("msitest\\alpha", TRUE), "File installed\n"); 4118 ok(!delete_pf("msitest\\beta", TRUE), "File installed\n"); 4119 ok(!delete_pf("msitest\\gamma", TRUE), "File installed\n"); 4120 ok(!delete_pf("msitest\\theta", TRUE), "File installed\n"); 4121 ok(!delete_pf("msitest\\delta", TRUE), "File installed\n"); 4122 ok(!delete_pf("msitest\\epsilon", TRUE), "File installed\n"); 4123 ok(!delete_pf("msitest\\zeta", TRUE), "File installed\n"); 4124 ok(!delete_pf("msitest\\iota", TRUE), "File installed\n"); 4125 ok(!delete_pf("msitest\\eta", TRUE), "File installed\n"); 4126 ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n"); 4127 ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n"); 4128 ok(!delete_pf("msitest\\mu", TRUE), "File installed\n"); 4129 ok(!delete_pf("msitest", FALSE), "Directory created\n"); 4130 4131 error: 4132 DeleteFileA(msifile); 4133 DeleteFileA("msitest\\alpha"); 4134 DeleteFileA("msitest\\beta"); 4135 DeleteFileA("msitest\\gamma"); 4136 DeleteFileA("msitest\\theta"); 4137 DeleteFileA("msitest\\delta"); 4138 DeleteFileA("msitest\\epsilon"); 4139 DeleteFileA("msitest\\zeta"); 4140 DeleteFileA("msitest\\iota"); 4141 DeleteFileA("msitest\\eta"); 4142 DeleteFileA("msitest\\kappa"); 4143 DeleteFileA("msitest\\lambda"); 4144 DeleteFileA("msitest\\mu"); 4145 RemoveDirectoryA("msitest"); 4146 } 4147 4148 static const struct sourcepathmap 4149 { 4150 BOOL sost; /* shortone\shorttwo */ 4151 BOOL solt; /* shortone\longtwo */ 4152 BOOL lost; /* longone\shorttwo */ 4153 BOOL lolt; /* longone\longtwo */ 4154 BOOL soste; /* shortone\shorttwo source exists */ 4155 BOOL solte; /* shortone\longtwo source exists */ 4156 BOOL loste; /* longone\shorttwo source exists */ 4157 BOOL lolte; /* longone\longtwo source exists */ 4158 UINT err; 4159 DWORD size; 4160 } spmap[256] = 4161 { 4162 {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4163 {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4164 {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4165 {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4166 {TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4167 {TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4168 {TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4169 {TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4170 {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4171 {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4172 {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4173 {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4174 {TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4175 {TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4176 {TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4177 {TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4178 {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4179 {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4180 {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4181 {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4182 {TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4183 {TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4184 {TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4185 {TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4186 {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4187 {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4188 {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4189 {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4190 {TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4191 {TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4192 {TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4193 {TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4194 {TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4195 {TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4196 {TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4197 {TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4198 {TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4199 {TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4200 {TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4201 {TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4202 {TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4203 {TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4204 {TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4205 {TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4206 {TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4207 {TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4208 {TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4209 {TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4210 {TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4211 {TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4212 {TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4213 {TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4214 {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4215 {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4216 {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4217 {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4218 {TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4219 {TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4220 {TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4221 {TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4222 {TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4223 {TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4224 {TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4225 {TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4226 {TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4227 {TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4228 {TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4229 {TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4230 {TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4231 {TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4232 {TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4233 {TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4234 {TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4235 {TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4236 {TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4237 {TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4238 {TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4239 {TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4240 {TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4241 {TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4242 {TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4243 {TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4244 {TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4245 {TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4246 {TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4247 {TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4248 {TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4249 {TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4250 {TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4251 {TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4252 {TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4253 {TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4254 {TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4255 {TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4256 {TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4257 {TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4258 {TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4259 {TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4260 {TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4261 {TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4262 {TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4263 {TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4264 {TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4265 {TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4266 {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4267 {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4268 {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4269 {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4270 {TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4271 {TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4272 {TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4273 {TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4274 {TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4275 {TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4276 {TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4277 {TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4278 {TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4279 {TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4280 {TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4281 {TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4282 {TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4283 {TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4284 {TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4285 {TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4286 {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4287 {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4288 {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4289 {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4290 {FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4291 {FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4292 {FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4293 {FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4294 {FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4295 {FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4296 {FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4297 {FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4298 {FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4299 {FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4300 {FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4301 {FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4302 {FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4303 {FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4304 {FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4305 {FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4306 {FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4307 {FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4308 {FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4309 {FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4310 {FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4311 {FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4312 {FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4313 {FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4314 {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4315 {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4316 {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4317 {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4318 {FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4319 {FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4320 {FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4321 {FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4322 {FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4323 {FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4324 {FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4325 {FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4326 {FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4327 {FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4328 {FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4329 {FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4330 {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4331 {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4332 {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4333 {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4334 {FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4335 {FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4336 {FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4337 {FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4338 {FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4339 {FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4340 {FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4341 {FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4342 {FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4343 {FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4344 {FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4345 {FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4346 {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4347 {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4348 {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4349 {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4350 {FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4351 {FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4352 {FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4353 {FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4354 {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4355 {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4356 {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4357 {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4358 {FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4359 {FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4360 {FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4361 {FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4362 {FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4363 {FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4364 {FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4365 {FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4366 {FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4367 {FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4368 {FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4369 {FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4370 {FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4371 {FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4372 {FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4373 {FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4374 {FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4375 {FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4376 {FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4377 {FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4378 {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4379 {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4380 {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4381 {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4382 {FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4383 {FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4384 {FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4385 {FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4386 {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4387 {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4388 {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4389 {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4390 {FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4391 {FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4392 {FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4393 {FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4394 {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4395 {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4396 {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4397 {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4398 {FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, ERROR_SUCCESS, 200}, 4399 {FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4400 {FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, ERROR_SUCCESS, 200}, 4401 {FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4402 {FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4403 {FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4404 {FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4405 {FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4406 {FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4407 {FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4408 {FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4409 {FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4410 {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4411 {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4412 {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4413 {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4414 {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4415 {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4416 {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, ERROR_INSTALL_FAILURE, 0}, 4417 {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, ERROR_INSTALL_FAILURE, 0}, 4418 }; 4419 4420 static DWORD get_pf_file_size(LPCSTR file) 4421 { 4422 CHAR path[MAX_PATH]; 4423 HANDLE hfile; 4424 DWORD size; 4425 4426 lstrcpyA(path, PROG_FILES_DIR); 4427 lstrcatA(path, "\\"); 4428 lstrcatA(path, file); 4429 4430 hfile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 4431 if (hfile == INVALID_HANDLE_VALUE) 4432 return INVALID_FILE_SIZE; 4433 4434 size = GetFileSize(hfile, NULL); 4435 CloseHandle(hfile); 4436 return size; 4437 } 4438 4439 static void test_sourcepath(void) 4440 { 4441 UINT r, i; 4442 4443 if (!winetest_interactive) 4444 { 4445 skip("Run in interactive mode to run source path tests.\n"); 4446 return; 4447 } 4448 4449 create_database(msifile, sp_tables, sizeof(sp_tables) / sizeof(msi_table)); 4450 4451 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4452 4453 for (i = 0; i < sizeof(spmap) / sizeof(spmap[0]); i++) 4454 { 4455 if (spmap[i].sost) 4456 { 4457 CreateDirectoryA("shortone", NULL); 4458 CreateDirectoryA("shortone\\shorttwo", NULL); 4459 } 4460 4461 if (spmap[i].solt) 4462 { 4463 CreateDirectoryA("shortone", NULL); 4464 CreateDirectoryA("shortone\\longtwo", NULL); 4465 } 4466 4467 if (spmap[i].lost) 4468 { 4469 CreateDirectoryA("longone", NULL); 4470 CreateDirectoryA("longone\\shorttwo", NULL); 4471 } 4472 4473 if (spmap[i].lolt) 4474 { 4475 CreateDirectoryA("longone", NULL); 4476 CreateDirectoryA("longone\\longtwo", NULL); 4477 } 4478 4479 if (spmap[i].soste) 4480 create_file("shortone\\shorttwo\\augustus", 50); 4481 if (spmap[i].solte) 4482 create_file("shortone\\longtwo\\augustus", 100); 4483 if (spmap[i].loste) 4484 create_file("longone\\shorttwo\\augustus", 150); 4485 if (spmap[i].lolte) 4486 create_file("longone\\longtwo\\augustus", 200); 4487 4488 r = MsiInstallProductA(msifile, NULL); 4489 ok(r == spmap[i].err, "%d: Expected %d, got %d\n", i, spmap[i].err, r); 4490 ok(get_pf_file_size("msitest\\augustus") == spmap[i].size, 4491 "%d: Expected %d, got %d\n", i, spmap[i].size, 4492 get_pf_file_size("msitest\\augustus")); 4493 4494 if (r == ERROR_SUCCESS) 4495 { 4496 ok(delete_pf("msitest\\augustus", TRUE), "%d: File not installed\n", i); 4497 ok(delete_pf("msitest", FALSE), "%d: Directory not created\n", i); 4498 } 4499 else 4500 { 4501 ok(!delete_pf("msitest\\augustus", TRUE), "%d: File installed\n", i); 4502 todo_wine ok(!delete_pf("msitest", FALSE), "%d: Directory installed\n", i); 4503 } 4504 4505 DeleteFileA("shortone\\shorttwo\\augustus"); 4506 DeleteFileA("shortone\\longtwo\\augustus"); 4507 DeleteFileA("longone\\shorttwo\\augustus"); 4508 DeleteFileA("longone\\longtwo\\augustus"); 4509 RemoveDirectoryA("shortone\\shorttwo"); 4510 RemoveDirectoryA("shortone\\longtwo"); 4511 RemoveDirectoryA("longone\\shorttwo"); 4512 RemoveDirectoryA("longone\\longtwo"); 4513 RemoveDirectoryA("shortone"); 4514 RemoveDirectoryA("longone"); 4515 } 4516 4517 DeleteFileA(msifile); 4518 } 4519 4520 static void test_missingcomponent(void) 4521 { 4522 UINT r; 4523 4524 if (is_process_limited()) 4525 { 4526 skip("process is limited\n"); 4527 return; 4528 } 4529 4530 CreateDirectoryA("msitest", NULL); 4531 create_file("msitest\\hydrogen", 500); 4532 create_file("msitest\\helium", 500); 4533 create_file("msitest\\lithium", 500); 4534 create_file("beryllium", 500); 4535 4536 create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table)); 4537 4538 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4539 4540 r = MsiInstallProductA(msifile, "INSTALLLEVEL=10 PROPVAR=42"); 4541 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 4542 { 4543 skip("Not enough rights to perform tests\n"); 4544 goto error; 4545 } 4546 else if (r == ERROR_INSTALL_FAILURE) 4547 { 4548 win_skip("broken result\n"); 4549 goto error; 4550 } 4551 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4552 ok(pf_exists("msitest\\hydrogen"), "File not installed\n"); 4553 ok(pf_exists("msitest\\helium"), "File not installed\n"); 4554 ok(pf_exists("msitest\\lithium"), "File not installed\n"); 4555 ok(!pf_exists("msitest\\beryllium"), "File installed\n"); 4556 ok(pf_exists("msitest"), "File not installed\n"); 4557 4558 r = MsiInstallProductA(msifile, "REMOVE=ALL INSTALLLEVEL=10 PROPVAR=42"); 4559 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4560 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n"); 4561 ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n"); 4562 ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n"); 4563 ok(!pf_exists("msitest\\beryllium"), "File installed\n"); 4564 ok(!delete_pf("msitest", FALSE), "Directory not removed\n"); 4565 4566 error: 4567 DeleteFileA(msifile); 4568 DeleteFileA("msitest\\hydrogen"); 4569 DeleteFileA("msitest\\helium"); 4570 DeleteFileA("msitest\\lithium"); 4571 DeleteFileA("beryllium"); 4572 RemoveDirectoryA("msitest"); 4573 } 4574 4575 static void test_sourcedirprop(void) 4576 { 4577 UINT r; 4578 CHAR props[MAX_PATH]; 4579 4580 if (is_process_limited()) 4581 { 4582 skip("process is limited\n"); 4583 return; 4584 } 4585 4586 CreateDirectoryA("msitest", NULL); 4587 create_file("msitest\\augustus", 500); 4588 4589 create_database(msifile, ca51_tables, sizeof(ca51_tables) / sizeof(msi_table)); 4590 4591 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4592 4593 r = MsiInstallProductA(msifile, NULL); 4594 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 4595 { 4596 skip("Not enough rights to perform tests\n"); 4597 goto error; 4598 } 4599 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4600 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); 4601 ok(delete_pf("msitest", FALSE), "Directory created\n"); 4602 4603 DeleteFileA("msitest\\augustus"); 4604 RemoveDirectoryA("msitest"); 4605 4606 CreateDirectoryA("altsource", NULL); 4607 CreateDirectoryA("altsource\\msitest", NULL); 4608 create_file("altsource\\msitest\\augustus", 500); 4609 4610 sprintf(props, "SRCDIR=%s\\altsource\\", CURR_DIR); 4611 4612 r = MsiInstallProductA(msifile, props); 4613 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4614 ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); 4615 ok(delete_pf("msitest", FALSE), "Directory created\n"); 4616 4617 DeleteFileA("altsource\\msitest\\augustus"); 4618 RemoveDirectoryA("altsource\\msitest"); 4619 RemoveDirectoryA("altsource"); 4620 4621 error: 4622 DeleteFileA("msitest\\augustus"); 4623 RemoveDirectoryA("msitest"); 4624 DeleteFileA(msifile); 4625 } 4626 4627 static void test_adminimage(void) 4628 { 4629 UINT r; 4630 4631 if (is_process_limited()) 4632 { 4633 skip("process is limited\n"); 4634 return; 4635 } 4636 4637 CreateDirectoryA("msitest", NULL); 4638 CreateDirectoryA("msitest\\first", NULL); 4639 CreateDirectoryA("msitest\\second", NULL); 4640 CreateDirectoryA("msitest\\cabout", NULL); 4641 CreateDirectoryA("msitest\\cabout\\new", NULL); 4642 create_file("msitest\\one.txt", 100); 4643 create_file("msitest\\first\\two.txt", 100); 4644 create_file("msitest\\second\\three.txt", 100); 4645 create_file("msitest\\cabout\\four.txt", 100); 4646 create_file("msitest\\cabout\\new\\five.txt", 100); 4647 create_file("msitest\\filename", 100); 4648 create_file("msitest\\service.exe", 100); 4649 4650 create_database_wordcount(msifile, ai_tables, 4651 sizeof(ai_tables) / sizeof(msi_table), 4652 100, msidbSumInfoSourceTypeAdminImage, ";1033", 4653 "{004757CA-5092-49C2-AD20-28E1CE0DF5F2}"); 4654 4655 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4656 4657 r = MsiInstallProductA(msifile, NULL); 4658 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 4659 { 4660 skip("Not enough rights to perform tests\n"); 4661 goto error; 4662 } 4663 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4664 4665 delete_pf_files(); 4666 4667 error: 4668 DeleteFileA("msifile"); 4669 DeleteFileA("msitest\\cabout\\new\\five.txt"); 4670 DeleteFileA("msitest\\cabout\\four.txt"); 4671 DeleteFileA("msitest\\second\\three.txt"); 4672 DeleteFileA("msitest\\first\\two.txt"); 4673 DeleteFileA("msitest\\one.txt"); 4674 DeleteFileA("msitest\\service.exe"); 4675 DeleteFileA("msitest\\filename"); 4676 RemoveDirectoryA("msitest\\cabout\\new"); 4677 RemoveDirectoryA("msitest\\cabout"); 4678 RemoveDirectoryA("msitest\\second"); 4679 RemoveDirectoryA("msitest\\first"); 4680 RemoveDirectoryA("msitest"); 4681 } 4682 4683 static void test_propcase(void) 4684 { 4685 UINT r; 4686 4687 if (is_process_limited()) 4688 { 4689 skip("process is limited\n"); 4690 return; 4691 } 4692 4693 CreateDirectoryA("msitest", NULL); 4694 create_file("msitest\\augustus", 500); 4695 4696 create_database(msifile, pc_tables, sizeof(pc_tables) / sizeof(msi_table)); 4697 4698 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4699 4700 r = MsiInstallProductA(msifile, "MyProp=42"); 4701 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 4702 { 4703 skip("Not enough rights to perform tests\n"); 4704 goto error; 4705 } 4706 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4707 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 4708 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 4709 4710 r = MsiInstallProductA(msifile, "Prop1=\"Copyright \"\"My Company\"\" 2015\" MyProp=42"); 4711 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4712 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 4713 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 4714 4715 r = MsiInstallProductA(msifile, "Prop1=\"\"\"install.exe\"\" /Install\" MyProp=\"42\""); 4716 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4717 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); 4718 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 4719 4720 error: 4721 DeleteFileA(msifile); 4722 DeleteFileA("msitest\\augustus"); 4723 RemoveDirectoryA("msitest"); 4724 } 4725 4726 static void test_int_widths( void ) 4727 { 4728 static const WCHAR msitestW[] = {'m','s','i','t','e','s','t','.','m','s','i',0}; 4729 static const WCHAR msitableW[] = {'m','s','i','t','a','b','l','e','.','i','d','t',0}; 4730 static const WCHAR slashW[] = {'\\',0}; 4731 static const char int0[] = "int0\ni0\nint0\tint0\n1"; 4732 static const char int1[] = "int1\ni1\nint1\tint1\n1"; 4733 static const char int2[] = "int2\ni2\nint2\tint2\n1"; 4734 static const char int3[] = "int3\ni3\nint3\tint3\n1"; 4735 static const char int4[] = "int4\ni4\nint4\tint4\n1"; 4736 static const char int5[] = "int5\ni5\nint5\tint5\n1"; 4737 static const char int8[] = "int8\ni8\nint8\tint8\n1"; 4738 static const struct 4739 { 4740 const char *data; 4741 unsigned int size; 4742 UINT ret; 4743 } 4744 tests[] = 4745 { 4746 { int0, sizeof(int0) - 1, ERROR_SUCCESS }, 4747 { int1, sizeof(int1) - 1, ERROR_SUCCESS }, 4748 { int2, sizeof(int2) - 1, ERROR_SUCCESS }, 4749 { int3, sizeof(int3) - 1, ERROR_FUNCTION_FAILED }, 4750 { int4, sizeof(int4) - 1, ERROR_SUCCESS }, 4751 { int5, sizeof(int5) - 1, ERROR_FUNCTION_FAILED }, 4752 { int8, sizeof(int8) - 1, ERROR_FUNCTION_FAILED } 4753 }; 4754 WCHAR tmpdir[MAX_PATH], msitable[MAX_PATH], msidb[MAX_PATH]; 4755 MSIHANDLE db; 4756 UINT r, i; 4757 4758 GetTempPathW(MAX_PATH, tmpdir); 4759 CreateDirectoryW(tmpdir, NULL); 4760 4761 lstrcpyW(msitable, tmpdir); 4762 lstrcatW(msitable, slashW); 4763 lstrcatW(msitable, msitableW); 4764 4765 lstrcpyW(msidb, tmpdir); 4766 lstrcatW(msidb, slashW); 4767 lstrcatW(msidb, msitestW); 4768 4769 r = MsiOpenDatabaseW(msidb, MSIDBOPEN_CREATE, &db); 4770 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4771 4772 for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) 4773 { 4774 DWORD count; 4775 HANDLE handle = CreateFileW(msitable, GENERIC_WRITE, 0, NULL, 4776 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 4777 WriteFile(handle, tests[i].data, tests[i].size, &count, NULL); 4778 CloseHandle(handle); 4779 4780 r = MsiDatabaseImportW(db, tmpdir, msitableW); 4781 ok(r == tests[i].ret, " %u expected %u, got %u\n", i, tests[i].ret, r); 4782 4783 r = MsiDatabaseCommit(db); 4784 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4785 DeleteFileW(msitable); 4786 } 4787 4788 MsiCloseHandle(db); 4789 DeleteFileW(msidb); 4790 RemoveDirectoryW(tmpdir); 4791 } 4792 4793 static void test_shortcut(void) 4794 { 4795 UINT r; 4796 HRESULT hr; 4797 4798 if (is_process_limited()) 4799 { 4800 skip("process is limited\n"); 4801 return; 4802 } 4803 4804 create_test_files(); 4805 create_database(msifile, sc_tables, sizeof(sc_tables) / sizeof(msi_table)); 4806 4807 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4808 4809 r = MsiInstallProductA(msifile, NULL); 4810 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 4811 { 4812 skip("Not enough rights to perform tests\n"); 4813 goto error; 4814 } 4815 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4816 4817 hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); 4818 ok(SUCCEEDED(hr), "CoInitialize failed 0x%08x\n", hr); 4819 4820 r = MsiInstallProductA(msifile, NULL); 4821 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4822 4823 CoUninitialize(); 4824 4825 hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 4826 ok(SUCCEEDED(hr), "CoInitialize failed 0x%08x\n", hr); 4827 4828 r = MsiInstallProductA(msifile, NULL); 4829 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4830 4831 CoUninitialize(); 4832 4833 while (!delete_pf("msitest\\Shortcut.lnk", TRUE) && GetLastError() == ERROR_SHARING_VIOLATION) Sleep(1000); 4834 delete_pf_files(); 4835 4836 error: 4837 delete_test_files(); 4838 DeleteFileA(msifile); 4839 } 4840 4841 static void test_preselected(void) 4842 { 4843 UINT r; 4844 4845 if (is_process_limited()) 4846 { 4847 skip("process is limited\n"); 4848 return; 4849 } 4850 4851 create_test_files(); 4852 create_database(msifile, ps_tables, sizeof(ps_tables) / sizeof(msi_table)); 4853 4854 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4855 4856 r = MsiInstallProductA(msifile, "ADDLOCAL=One"); 4857 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 4858 { 4859 skip("Not enough rights to perform tests\n"); 4860 goto error; 4861 } 4862 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4863 4864 ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n"); 4865 ok(!delete_pf("msitest\\cabout\\new", FALSE), "Directory created\n"); 4866 ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n"); 4867 ok(!delete_pf("msitest\\cabout", FALSE), "Directory created\n"); 4868 ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n"); 4869 ok(!delete_pf("msitest\\changed", FALSE), "Directory created\n"); 4870 ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); 4871 ok(!delete_pf("msitest\\first", FALSE), "Directory created\n"); 4872 ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); 4873 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); 4874 ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); 4875 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 4876 4877 r = MsiInstallProductA(msifile, NULL); 4878 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4879 4880 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); 4881 ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); 4882 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); 4883 ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); 4884 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); 4885 ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); 4886 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); 4887 ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); 4888 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); 4889 ok(!delete_pf("msitest\\one.txt", TRUE), "File installed\n"); 4890 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); 4891 ok(delete_pf("msitest", FALSE), "Directory not created\n"); 4892 4893 error: 4894 delete_test_files(); 4895 DeleteFileA(msifile); 4896 } 4897 4898 static void test_installed_prop(void) 4899 { 4900 static const char prodcode[] = "{7df88a48-996f-4ec8-a022-bf956f9b2cbb}"; 4901 UINT r; 4902 4903 if (is_process_limited()) 4904 { 4905 skip("process is limited\n"); 4906 return; 4907 } 4908 4909 create_test_files(); 4910 create_database(msifile, ip_tables, sizeof(ip_tables) / sizeof(msi_table)); 4911 4912 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4913 4914 r = MsiInstallProductA(msifile, "FULL=1"); 4915 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 4916 { 4917 skip("Not enough rights to perform tests\n"); 4918 goto error; 4919 } 4920 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4921 4922 r = MsiInstallProductA(msifile, "FULL=1"); 4923 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 4924 4925 r = MsiConfigureProductExA(prodcode, INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT, "FULL=1"); 4926 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 4927 4928 delete_pf_files(); 4929 4930 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 4931 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4932 4933 error: 4934 delete_test_files(); 4935 DeleteFileA(msifile); 4936 } 4937 4938 static void test_allusers_prop(void) 4939 { 4940 UINT r; 4941 4942 if (is_process_limited()) 4943 { 4944 skip("process is limited\n"); 4945 return; 4946 } 4947 4948 create_test_files(); 4949 create_database(msifile, aup_tables, sizeof(aup_tables) / sizeof(msi_table)); 4950 4951 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 4952 4953 /* ALLUSERS property unset */ 4954 r = MsiInstallProductA(msifile, "FULL=1"); 4955 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 4956 { 4957 skip("Not enough rights to perform tests\n"); 4958 goto error; 4959 } 4960 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4961 4962 delete_pf_files(); 4963 4964 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 4965 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4966 4967 delete_test_files(); 4968 4969 create_test_files(); 4970 create_database(msifile, aup2_tables, sizeof(aup2_tables) / sizeof(msi_table)); 4971 4972 /* ALLUSERS property set to 1 */ 4973 r = MsiInstallProductA(msifile, "FULL=1"); 4974 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4975 4976 delete_pf_files(); 4977 4978 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 4979 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4980 4981 delete_test_files(); 4982 4983 create_test_files(); 4984 create_database(msifile, aup3_tables, sizeof(aup3_tables) / sizeof(msi_table)); 4985 4986 /* ALLUSERS property set to 2 */ 4987 r = MsiInstallProductA(msifile, "FULL=1"); 4988 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4989 4990 delete_pf_files(); 4991 4992 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 4993 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 4994 4995 delete_test_files(); 4996 4997 create_test_files(); 4998 create_database(msifile, aup4_tables, sizeof(aup4_tables) / sizeof(msi_table)); 4999 5000 /* ALLUSERS property set to 2, conditioned on ALLUSERS = 1 */ 5001 r = MsiInstallProductA(msifile, "FULL=1"); 5002 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); 5003 5004 error: 5005 delete_test_files(); 5006 DeleteFileA(msifile); 5007 } 5008 5009 static const char session_manager[] = "System\\CurrentControlSet\\Control\\Session Manager"; 5010 static const char rename_ops[] = "PendingFileRenameOperations"; 5011 5012 static void process_pending_renames(HKEY hkey) 5013 { 5014 char *buf, *src, *dst, *buf2, *buf2ptr; 5015 DWORD size; 5016 LONG ret; 5017 BOOL found = FALSE; 5018 5019 ret = RegQueryValueExA(hkey, rename_ops, NULL, NULL, NULL, &size); 5020 ok(!ret, "RegQueryValueExA failed %d\n", ret); 5021 5022 buf = HeapAlloc(GetProcessHeap(), 0, size + 1); 5023 buf2ptr = buf2 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size + 1); 5024 5025 ret = RegQueryValueExA(hkey, rename_ops, NULL, NULL, (LPBYTE)buf, &size); 5026 buf[size] = 0; 5027 ok(!ret, "RegQueryValueExA failed %d\n", ret); 5028 if (ret) return; 5029 5030 for (src = buf; *src; src = dst + strlen(dst) + 1) 5031 { 5032 DWORD flags = MOVEFILE_COPY_ALLOWED; 5033 BOOL fileret; 5034 5035 dst = src + strlen(src) + 1; 5036 5037 if (!strstr(src, "msitest")) 5038 { 5039 lstrcpyA(buf2ptr, src); 5040 buf2ptr += strlen(src) + 1; 5041 lstrcpyA(buf2ptr, dst); 5042 buf2ptr += strlen(dst) + 1; 5043 continue; 5044 } 5045 5046 found = TRUE; 5047 5048 if (*dst == '!') 5049 { 5050 flags |= MOVEFILE_REPLACE_EXISTING; 5051 dst++; 5052 } 5053 if (src[0] == '\\' && src[1] == '?' && src[2] == '?' && src[3] == '\\') src += 4; 5054 if (*dst) 5055 { 5056 if (dst[0] == '\\' && dst[1] == '?' && dst[2] == '?' && dst[3] == '\\') dst += 4; 5057 fileret = MoveFileExA(src, dst, flags); 5058 ok(fileret, "Failed to move file %s -> %s (%u)\n", src, dst, GetLastError()); 5059 } 5060 else 5061 { 5062 fileret = DeleteFileA(src); 5063 ok(fileret || broken(!fileret) /* win2k3 */, "Failed to delete file %s (%u)\n", src, GetLastError()); 5064 } 5065 } 5066 5067 ok(found, "Expected a 'msitest' entry\n"); 5068 5069 if (*buf2) 5070 RegSetValueExA(hkey, rename_ops, 0, REG_MULTI_SZ, (LPBYTE)buf2, buf2ptr + 1 - buf2); 5071 else 5072 RegDeleteValueA(hkey, rename_ops); 5073 5074 HeapFree(GetProcessHeap(), 0, buf); 5075 HeapFree(GetProcessHeap(), 0, buf2); 5076 } 5077 5078 static BOOL file_matches_data(LPCSTR file, LPCSTR data) 5079 { 5080 DWORD len, data_len = strlen(data); 5081 HANDLE handle; 5082 char buf[128]; 5083 5084 handle = CreateFileA(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 5085 ok(handle != INVALID_HANDLE_VALUE, "failed to open %s (%u)\n", file, GetLastError()); 5086 5087 if (ReadFile(handle, buf, sizeof(buf), &len, NULL) && len >= data_len) 5088 { 5089 CloseHandle(handle); 5090 return !memcmp(buf, data, data_len); 5091 } 5092 CloseHandle(handle); 5093 return FALSE; 5094 } 5095 5096 static void test_file_in_use(void) 5097 { 5098 UINT r; 5099 HANDLE file; 5100 HKEY hkey; 5101 char path[MAX_PATH]; 5102 5103 if (is_process_limited()) 5104 { 5105 skip("process is limited\n"); 5106 return; 5107 } 5108 5109 RegOpenKeyExA(HKEY_LOCAL_MACHINE, session_manager, 0, KEY_ALL_ACCESS, &hkey); 5110 5111 CreateDirectoryA("msitest", NULL); 5112 create_file("msitest\\maximus", 500); 5113 create_database(msifile, fiu_tables, sizeof(fiu_tables) / sizeof(msi_table)); 5114 5115 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 5116 5117 lstrcpyA(path, PROG_FILES_DIR); 5118 lstrcatA(path, "\\msitest"); 5119 CreateDirectoryA(path, NULL); 5120 5121 lstrcatA(path, "\\maximus"); 5122 file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); 5123 5124 r = MsiInstallProductA(msifile, "REBOOT=ReallySuppress FULL=1"); 5125 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 5126 { 5127 skip("Not enough rights to perform tests\n"); 5128 goto error; 5129 } 5130 ok(r == ERROR_SUCCESS_REBOOT_REQUIRED, "Expected ERROR_SUCCESS_REBOOT_REQUIRED got %u\n", r); 5131 ok(!file_matches_data(path, "msitest\\maximus"), "Expected file not to match\n"); 5132 CloseHandle(file); 5133 ok(!file_matches_data(path, "msitest\\maximus"), "Expected file not to match\n"); 5134 5135 process_pending_renames(hkey); 5136 RegCloseKey(hkey); 5137 5138 ok(file_matches_data(path, "msitest\\maximus"), "Expected file to match\n"); 5139 ok(delete_pf("msitest\\maximus", TRUE), "File not present\n"); 5140 ok(delete_pf("msitest", FALSE), "Directory not present or not empty\n"); 5141 5142 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 5143 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5144 5145 error: 5146 RegCloseKey(hkey); 5147 5148 delete_pf("msitest\\maximus", TRUE); 5149 delete_pf("msitest", FALSE); 5150 DeleteFileA("msitest\\maximus"); 5151 delete_test_files(); 5152 DeleteFileA(msifile); 5153 } 5154 5155 static void test_file_in_use_cab(void) 5156 { 5157 UINT r; 5158 HANDLE file; 5159 HKEY hkey; 5160 char path[MAX_PATH]; 5161 5162 if (is_process_limited()) 5163 { 5164 skip("process is limited\n"); 5165 return; 5166 } 5167 5168 RegOpenKeyExA(HKEY_LOCAL_MACHINE, session_manager, 0, KEY_ALL_ACCESS, &hkey); 5169 5170 CreateDirectoryA("msitest", NULL); 5171 create_file("maximus", 500); 5172 create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0"); 5173 DeleteFileA("maximus"); 5174 5175 create_database(msifile, fiuc_tables, sizeof(fiuc_tables) / sizeof(msi_table)); 5176 5177 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 5178 5179 lstrcpyA(path, PROG_FILES_DIR); 5180 lstrcatA(path, "\\msitest"); 5181 CreateDirectoryA(path, NULL); 5182 5183 lstrcatA(path, "\\maximus"); 5184 file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); 5185 5186 r = MsiInstallProductA(msifile, "REBOOT=ReallySuppress FULL=1"); 5187 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 5188 { 5189 skip("Not enough rights to perform tests\n"); 5190 goto error; 5191 } 5192 ok(r == ERROR_SUCCESS_REBOOT_REQUIRED, "Expected ERROR_SUCCESS_REBOOT_REQUIRED got %u\n", r); 5193 ok(!file_matches_data(path, "maximus"), "Expected file not to match\n"); 5194 CloseHandle(file); 5195 ok(!file_matches_data(path, "maximus"), "Expected file not to match\n"); 5196 5197 process_pending_renames(hkey); 5198 RegCloseKey(hkey); 5199 5200 ok(file_matches_data(path, "maximus"), "Expected file to match\n"); 5201 ok(delete_pf("msitest\\maximus", TRUE), "File not present\n"); 5202 ok(delete_pf("msitest", FALSE), "Directory not present or not empty\n"); 5203 5204 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 5205 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5206 5207 error: 5208 RegCloseKey(hkey); 5209 5210 delete_pf("msitest\\maximus", TRUE); 5211 delete_pf("msitest", FALSE); 5212 DeleteFileA("msitest\\maximus"); 5213 delete_cab_files(); 5214 delete_test_files(); 5215 DeleteFileA(msifile); 5216 } 5217 5218 static void test_feature_override(void) 5219 { 5220 UINT r; 5221 REGSAM access = KEY_ALL_ACCESS; 5222 5223 if (is_process_limited()) 5224 { 5225 skip("process is limited\n"); 5226 return; 5227 } 5228 5229 create_test_files(); 5230 create_file("msitest\\override.txt", 1000); 5231 create_file("msitest\\preselected.txt", 1000); 5232 create_file("msitest\\notpreselected.txt", 1000); 5233 create_database(msifile, fo_tables, sizeof(fo_tables) / sizeof(msi_table)); 5234 5235 if (is_wow64) 5236 access |= KEY_WOW64_64KEY; 5237 5238 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 5239 5240 r = MsiInstallProductA(msifile, "ADDLOCAL=override"); 5241 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 5242 { 5243 skip("Not enough rights to perform tests\n"); 5244 goto error; 5245 } 5246 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5247 5248 ok(pf_exists("msitest\\override.txt"), "file not installed\n"); 5249 ok(!pf_exists("msitest\\preselected.txt"), "file installed\n"); 5250 ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n"); 5251 5252 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 5253 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5254 5255 ok(!delete_pf("msitest\\override.txt", TRUE), "file not removed\n"); 5256 5257 r = MsiInstallProductA(msifile, "preselect=1"); 5258 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5259 5260 ok(pf_exists("msitest\\override.txt"), "file not installed\n"); 5261 ok(pf_exists("msitest\\preselected.txt"), "file not installed\n"); 5262 ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n"); 5263 5264 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 5265 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5266 5267 ok(!delete_pf("msitest\\override.txt", TRUE), "file not removed\n"); 5268 todo_wine { 5269 ok(delete_pf("msitest\\preselected.txt", TRUE), "file removed\n"); 5270 ok(delete_pf("msitest", FALSE), "directory removed\n"); 5271 } 5272 5273 r = MsiInstallProductA(msifile, NULL); 5274 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5275 5276 ok(pf_exists("msitest\\override.txt"), "file not installed\n"); 5277 ok(pf_exists("msitest\\preselected.txt"), "file not installed\n"); 5278 ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n"); 5279 5280 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 5281 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5282 5283 ok(!delete_pf("msitest\\override.txt", TRUE), "file not removed\n"); 5284 todo_wine { 5285 ok(delete_pf("msitest\\preselected.txt", TRUE), "file removed\n"); 5286 ok(delete_pf("msitest", FALSE), "directory removed\n"); 5287 } 5288 5289 delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", access); 5290 5291 error: 5292 DeleteFileA("msitest\\override.txt"); 5293 DeleteFileA("msitest\\preselected.txt"); 5294 DeleteFileA("msitest\\notpreselected.txt"); 5295 delete_test_files(); 5296 DeleteFileA(msifile); 5297 } 5298 5299 static void test_icon_table(void) 5300 { 5301 MSIHANDLE hdb = 0, record; 5302 LPCSTR query; 5303 UINT res; 5304 CHAR path[MAX_PATH]; 5305 static const char prodcode[] = "{7DF88A49-996F-4EC8-A022-BF956F9B2CBB}"; 5306 5307 if (is_process_limited()) 5308 { 5309 skip("process is limited\n"); 5310 return; 5311 } 5312 5313 create_database(msifile, icon_base_tables, sizeof(icon_base_tables) / sizeof(msi_table)); 5314 5315 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 5316 5317 res = MsiOpenDatabaseW(msifileW, MSIDBOPEN_TRANSACT, &hdb); 5318 ok(res == ERROR_SUCCESS, "failed to open db: %d\n", res); 5319 5320 query = "CREATE TABLE `Icon` (`Name` CHAR(72) NOT NULL, `Data` OBJECT NOT NULL PRIMARY KEY `Name`)"; 5321 res = run_query( hdb, 0, query ); 5322 ok(res == ERROR_SUCCESS, "Can't create Icon table: %d\n", res); 5323 5324 create_file("icon.ico", 100); 5325 record = MsiCreateRecord(1); 5326 res = MsiRecordSetStreamA(record, 1, "icon.ico"); 5327 ok(res == ERROR_SUCCESS, "Failed to add stream data to record: %d\n", res); 5328 5329 query = "INSERT INTO `Icon` (`Name`, `Data`) VALUES ('testicon', ?)"; 5330 res = run_query(hdb, record, query); 5331 ok(res == ERROR_SUCCESS, "Insert into Icon table failed: %d\n", res); 5332 5333 res = MsiCloseHandle(record); 5334 ok(res == ERROR_SUCCESS, "Failed to close record handle: %d\n", res); 5335 DeleteFileA("icon.ico"); 5336 res = MsiDatabaseCommit(hdb); 5337 ok(res == ERROR_SUCCESS, "Failed to commit database: %d\n", res); 5338 res = MsiCloseHandle(hdb); 5339 ok(res == ERROR_SUCCESS, "Failed to close database: %d\n", res); 5340 5341 /* per-user */ 5342 res = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1"); 5343 if (res == ERROR_INSTALL_PACKAGE_REJECTED) 5344 { 5345 skip("Not enough rights to perform tests\n"); 5346 DeleteFileA(msifile); 5347 return; 5348 } 5349 ok(res == ERROR_SUCCESS, "Failed to do per-user install: %d\n", res); 5350 5351 lstrcpyA(path, APP_DATA_DIR); 5352 lstrcatA(path, "\\"); 5353 lstrcatA(path, "Microsoft\\Installer\\"); 5354 lstrcatA(path, prodcode); 5355 lstrcatA(path, "\\testicon"); 5356 ok(file_exists(path), "Per-user icon file isn't where it's expected (%s)\n", path); 5357 5358 res = MsiInstallProductA(msifile, "REMOVE=ALL"); 5359 ok(res == ERROR_SUCCESS, "Failed to uninstall per-user\n"); 5360 ok(!file_exists(path), "Per-user icon file not removed (%s)\n", path); 5361 5362 /* system-wide */ 5363 res = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 ALLUSERS=1"); 5364 ok(res == ERROR_SUCCESS, "Failed to system-wide install: %d\n", res); 5365 5366 lstrcpyA(path, WINDOWS_DIR); 5367 lstrcatA(path, "\\"); 5368 lstrcatA(path, "Installer\\"); 5369 lstrcatA(path, prodcode); 5370 lstrcatA(path, "\\testicon"); 5371 ok(file_exists(path), "System-wide icon file isn't where it's expected (%s)\n", path); 5372 5373 res = MsiInstallProductA(msifile, "REMOVE=ALL"); 5374 ok(res == ERROR_SUCCESS, "Failed to uninstall system-wide\n"); 5375 ok(!file_exists(path), "System-wide icon file not removed (%s)\n", path); 5376 5377 delete_pfmsitest_files(); 5378 DeleteFileA(msifile); 5379 } 5380 5381 static void test_package_validation(void) 5382 { 5383 UINT r; 5384 5385 if (is_process_limited()) 5386 { 5387 skip("process is limited\n"); 5388 return; 5389 } 5390 5391 CreateDirectoryA("msitest", NULL); 5392 create_file("msitest\\maximus", 500); 5393 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;1033"); 5394 5395 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 5396 5397 r = MsiInstallProductA(msifile, NULL); 5398 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 5399 { 5400 skip("Not enough rights to perform tests\n"); 5401 goto error; 5402 } 5403 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5404 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); 5405 ok(delete_pf("msitest", FALSE), "directory does not exist\n"); 5406 5407 DeleteFileA(msifile); 5408 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel,9999;9999"); 5409 5410 r = MsiInstallProductA(msifile, NULL); 5411 ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r); 5412 5413 DeleteFileA(msifile); 5414 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel,1033;9999"); 5415 5416 r = MsiInstallProductA(msifile, NULL); 5417 ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r); 5418 5419 DeleteFileA(msifile); 5420 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel,9999;1033"); 5421 5422 r = MsiInstallProductA(msifile, NULL); 5423 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5424 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); 5425 ok(delete_pf("msitest", FALSE), "directory does not exist\n"); 5426 5427 DeleteFileA(msifile); 5428 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel64,9999;1033"); 5429 5430 r = MsiInstallProductA(msifile, NULL); 5431 ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); 5432 5433 DeleteFileA(msifile); 5434 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel32,1033;1033"); 5435 5436 r = MsiInstallProductA(msifile, NULL); 5437 ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); 5438 5439 DeleteFileA(msifile); 5440 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel32,9999;1033"); 5441 5442 r = MsiInstallProductA(msifile, NULL); 5443 ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); 5444 5445 DeleteFileA(msifile); 5446 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;9999"); 5447 5448 r = MsiInstallProductA(msifile, NULL); 5449 ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r); 5450 ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n"); 5451 ok(!delete_pf("msitest", FALSE), "directory exists\n"); 5452 5453 if (GetSystemDefaultLangID() == MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US )) 5454 { 5455 DeleteFileA(msifile); 5456 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;9"); 5457 r = MsiInstallProductA(msifile, NULL); 5458 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5459 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); 5460 ok(delete_pf("msitest", FALSE), "directory does not exist\n"); 5461 5462 DeleteFileA(msifile); 5463 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;1024"); 5464 r = MsiInstallProductA(msifile, NULL); 5465 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5466 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); 5467 ok(delete_pf("msitest", FALSE), "directory does not exist\n"); 5468 } 5469 5470 DeleteFileA(msifile); 5471 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel32;0"); 5472 5473 r = MsiInstallProductA(msifile, NULL); 5474 ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); 5475 ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n"); 5476 ok(!delete_pf("msitest", FALSE), "directory exists\n"); 5477 5478 if (is_64bit && !is_wow64) 5479 { 5480 DeleteFileA(msifile); 5481 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0"); 5482 5483 r = MsiInstallProductA(msifile, NULL); 5484 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5485 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); 5486 ok(delete_pf("msitest", FALSE), "directory does not exist\n"); 5487 5488 DeleteFileA(msifile); 5489 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0"); 5490 5491 r = MsiInstallProductA(msifile, NULL); 5492 ok(r == ERROR_INSTALL_PACKAGE_INVALID, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r); 5493 ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n"); 5494 ok(!delete_pf("msitest", FALSE), "directory exists\n"); 5495 5496 DeleteFileA(msifile); 5497 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0"); 5498 5499 r = MsiInstallProductA(msifile, NULL); 5500 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5501 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); 5502 ok(delete_pf("msitest", FALSE), "directory does not exist\n"); 5503 } 5504 else if (is_wow64) 5505 { 5506 DeleteFileA(msifile); 5507 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0"); 5508 5509 r = MsiInstallProductA(msifile, NULL); 5510 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5511 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); 5512 ok(delete_pf("msitest", FALSE), "directory does not exist\n"); 5513 5514 DeleteFileA(msifile); 5515 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0"); 5516 5517 r = MsiInstallProductA(msifile, NULL); 5518 ok(r == ERROR_INSTALL_PACKAGE_INVALID, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r); 5519 ok(!delete_pf_native("msitest\\maximus", TRUE), "file exists\n"); 5520 ok(!delete_pf_native("msitest", FALSE), "directory exists\n"); 5521 5522 DeleteFileA(msifile); 5523 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0"); 5524 5525 r = MsiInstallProductA(msifile, NULL); 5526 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5527 ok(delete_pf_native("msitest\\maximus", TRUE), "file exists\n"); 5528 ok(delete_pf_native("msitest", FALSE), "directory exists\n"); 5529 } 5530 else 5531 { 5532 DeleteFileA(msifile); 5533 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0"); 5534 5535 r = MsiInstallProductA(msifile, NULL); 5536 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5537 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); 5538 ok(delete_pf("msitest", FALSE), "directory does not exist\n"); 5539 5540 DeleteFileA(msifile); 5541 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Alpha,Beta,Intel;0"); 5542 5543 r = MsiInstallProductA(msifile, NULL); 5544 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5545 ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); 5546 ok(delete_pf("msitest", FALSE), "directory does not exist\n"); 5547 5548 DeleteFileA(msifile); 5549 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0"); 5550 5551 r = MsiInstallProductA(msifile, NULL); 5552 ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); 5553 ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n"); 5554 ok(!delete_pf("msitest", FALSE), "directory exists\n"); 5555 5556 DeleteFileA(msifile); 5557 create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0"); 5558 5559 r = MsiInstallProductA(msifile, NULL); 5560 ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); 5561 ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n"); 5562 ok(!delete_pf("msitest", FALSE), "directory exists\n"); 5563 } 5564 5565 error: 5566 /* Delete the files in the temp (current) folder */ 5567 DeleteFileA(msifile); 5568 DeleteFileA("msitest\\maximus"); 5569 RemoveDirectoryA("msitest"); 5570 } 5571 5572 static void test_upgrade_code(void) 5573 { 5574 UINT r; 5575 5576 if (is_process_limited()) 5577 { 5578 skip("process is limited\n"); 5579 return; 5580 } 5581 5582 CreateDirectoryA("msitest", NULL); 5583 create_file("msitest\\upgradecode.txt", 1000); 5584 create_database(msifile, uc_tables, sizeof(uc_tables) / sizeof(msi_table)); 5585 5586 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 5587 5588 r = MsiInstallProductA(msifile, NULL); 5589 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5590 5591 ok(pf_exists("msitest\\upgradecode.txt"), "file not installed\n"); 5592 5593 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 5594 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5595 5596 ok(!delete_pf("msitest\\upgradecode.txt", TRUE), "file not removed\n"); 5597 ok(!delete_pf("msitest", FALSE), "directory not removed\n"); 5598 5599 DeleteFileA("msitest\\upgradecode.txt"); 5600 RemoveDirectoryA("msitest"); 5601 DeleteFileA(msifile); 5602 } 5603 5604 static void test_mixed_package(void) 5605 { 5606 UINT r; 5607 LONG res; 5608 HKEY hkey; 5609 char value[MAX_PATH]; 5610 DWORD size; 5611 5612 if (is_process_limited()) 5613 { 5614 skip("process is limited\n"); 5615 return; 5616 } 5617 if (!is_wow64 && !is_64bit) 5618 { 5619 skip("this test must be run on 64-bit\n"); 5620 return; 5621 } 5622 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 5623 create_database_template(msifile, mixed_tables, sizeof(mixed_tables)/sizeof(msi_table), 200, "x64;1033"); 5624 5625 r = MsiInstallProductA(msifile, NULL); 5626 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 5627 { 5628 skip("Not enough rights to perform tests\n"); 5629 goto error; 5630 } 5631 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5632 5633 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey); 5634 ok(!res, "can't open 32-bit component key, got %d\n", res); 5635 res = RegQueryValueExA(hkey, "test1", NULL, NULL, NULL, NULL); 5636 ok(!res, "expected RegQueryValueEx to succeed, got %d\n", res); 5637 res = RegQueryValueExA(hkey, "test2", NULL, NULL, NULL, NULL); 5638 ok(res, "expected RegQueryValueEx to fail, got %d\n", res); 5639 RegCloseKey(hkey); 5640 5641 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hkey); 5642 ok(!res, "can't open 64-bit component key, got %d\n", res); 5643 res = RegQueryValueExA(hkey, "test1", NULL, NULL, NULL, NULL); 5644 ok(res, "expected RegQueryValueEx to fail, got %d\n", res); 5645 res = RegQueryValueExA(hkey, "test2", NULL, NULL, NULL, NULL); 5646 ok(!res, "expected RegQueryValueEx to succeed, got %d\n", res); 5647 RegCloseKey(hkey); 5648 5649 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, 5650 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32", 5651 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey); 5652 ok(res == ERROR_SUCCESS, "can't open 32-bit CLSID key, got %d\n", res); 5653 if (res == ERROR_SUCCESS) { 5654 size = sizeof(value); 5655 res = RegQueryValueExA(hkey, "", NULL, NULL, (LPBYTE)value, &size); 5656 ok(!strcmp(value, "winetest32.dll"), "got %s\n", value); 5657 RegCloseKey(hkey); 5658 } 5659 5660 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, 5661 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32", 5662 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hkey); 5663 ok(res == ERROR_SUCCESS, "can't open 64-bit CLSID key, got %d\n", res); 5664 if (res == ERROR_SUCCESS) { 5665 size = sizeof(value); 5666 res = RegQueryValueExA(hkey, "", NULL, NULL, (LPBYTE)value, &size); 5667 ok(!strcmp(value, "winetest64.dll"), "got %s\n", value); 5668 RegCloseKey(hkey); 5669 } 5670 5671 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 5672 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5673 5674 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey); 5675 ok(res == ERROR_FILE_NOT_FOUND || broken(!res), "32-bit component key not removed\n"); 5676 5677 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hkey); 5678 ok(res == ERROR_FILE_NOT_FOUND, "64-bit component key not removed\n"); 5679 5680 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, 5681 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}", 5682 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey); 5683 ok(res == ERROR_FILE_NOT_FOUND, "32-bit CLSID key not removed\n"); 5684 5685 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, 5686 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}", 5687 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hkey); 5688 ok(res == ERROR_FILE_NOT_FOUND, "64-bit CLSID key not removed\n"); 5689 5690 DeleteFileA( msifile ); 5691 create_database_template(msifile, mixed_tables, sizeof(mixed_tables)/sizeof(msi_table), 200, "Intel;1033"); 5692 5693 r = MsiInstallProductA(msifile, NULL); 5694 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5695 5696 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey); 5697 ok(!res, "can't open 32-bit component key, got %d\n", res); 5698 res = RegQueryValueExA(hkey, "test1", NULL, NULL, NULL, NULL); 5699 ok(!res, "expected RegQueryValueEx to succeed, got %d\n", res); 5700 res = RegQueryValueExA(hkey, "test2", NULL, NULL, NULL, NULL); 5701 ok(res, "expected RegQueryValueEx to fail, got %d\n", res); 5702 RegCloseKey(hkey); 5703 5704 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hkey); 5705 ok(!res, "can't open 64-bit component key, got %d\n", res); 5706 res = RegQueryValueExA(hkey, "test1", NULL, NULL, NULL, NULL); 5707 ok(res, "expected RegQueryValueEx to fail, got %d\n", res); 5708 res = RegQueryValueExA(hkey, "test2", NULL, NULL, NULL, NULL); 5709 ok(!res, "expected RegQueryValueEx to succeed, got %d\n", res); 5710 RegCloseKey(hkey); 5711 5712 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, 5713 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32", 5714 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey); 5715 ok(res == ERROR_SUCCESS, "can't open 32-bit CLSID key, got %d\n", res); 5716 if (res == ERROR_SUCCESS) { 5717 size = sizeof(value); 5718 res = RegQueryValueExA(hkey, "", NULL, NULL, (LPBYTE)value, &size); 5719 ok(!strcmp(value, "winetest32.dll"), "got %s\n", value); 5720 RegCloseKey(hkey); 5721 } 5722 5723 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, 5724 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32", 5725 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hkey); 5726 ok(res == ERROR_SUCCESS, "can't open 64-bit CLSID key, got %d\n", res); 5727 if (res == ERROR_SUCCESS) { 5728 size = sizeof(value); 5729 res = RegQueryValueExA(hkey, "", NULL, NULL, (LPBYTE)value, &size); 5730 ok(!strcmp(value, "winetest64.dll"), "got %s\n", value); 5731 RegCloseKey(hkey); 5732 } 5733 5734 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 5735 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5736 5737 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey); 5738 ok(res == ERROR_FILE_NOT_FOUND || broken(!res), "32-bit component key not removed\n"); 5739 5740 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hkey); 5741 ok(res == ERROR_FILE_NOT_FOUND, "64-bit component key not removed\n"); 5742 5743 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, 5744 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}", 5745 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey); 5746 ok(res == ERROR_FILE_NOT_FOUND, "32-bit CLSID key not removed\n"); 5747 5748 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, 5749 "CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}", 5750 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hkey); 5751 ok(res == ERROR_FILE_NOT_FOUND, "64-bit CLSID key not removed\n"); 5752 5753 error: 5754 DeleteFileA( msifile ); 5755 } 5756 5757 static void test_volume_props(void) 5758 { 5759 UINT r; 5760 5761 if (is_process_limited()) 5762 { 5763 skip("process is limited\n"); 5764 return; 5765 } 5766 CreateDirectoryA("msitest", NULL); 5767 create_file("msitest\\volumeprop.txt", 1000); 5768 create_database(msifile, vp_tables, sizeof(vp_tables)/sizeof(msi_table)); 5769 5770 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 5771 5772 r = MsiInstallProductA(msifile, NULL); 5773 ok(r == ERROR_SUCCESS, "got %u\n", r); 5774 5775 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 5776 ok(r == ERROR_SUCCESS, "got %u\n", r); 5777 5778 DeleteFileA("msitest\\volumeprop.txt"); 5779 RemoveDirectoryA("msitest"); 5780 DeleteFileA(msifile); 5781 } 5782 5783 static void test_shared_component(void) 5784 { 5785 UINT r; 5786 5787 if (is_process_limited()) 5788 { 5789 skip("process is limited\n"); 5790 return; 5791 } 5792 CreateDirectoryA("msitest", NULL); 5793 create_file("msitest\\sharedcomponent.txt", 1000); 5794 create_database_wordcount(msifile, shc_tables, sizeof(shc_tables)/sizeof(shc_tables[0]), 5795 100, 0, ";", "{A8826420-FD72-4E61-9E15-C1944CF4CBE1}"); 5796 create_database_wordcount(msifile2, shc2_tables, sizeof(shc2_tables)/sizeof(shc2_tables[0]), 5797 100, 0, ";", "{A8B50B30-0E8A-4ACD-B3CF-1A5DC58B2739}"); 5798 5799 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 5800 5801 r = MsiInstallProductA(msifile, NULL); 5802 ok(r == ERROR_SUCCESS, "got %u\n", r); 5803 5804 ok(pf_exists("msitest\\sharedcomponent.txt"), "file not installed\n"); 5805 5806 r = MsiInstallProductA(msifile2, NULL); 5807 ok(r == ERROR_SUCCESS, "got %u\n", r); 5808 5809 ok(pf_exists("msitest\\sharedcomponent.txt"), "file not installed\n"); 5810 5811 r = MsiInstallProductA(msifile, "REMOVE=ALL"); 5812 ok(r == ERROR_SUCCESS, "got %u\n", r); 5813 5814 ok(pf_exists("msitest\\sharedcomponent.txt"), "file removed\n"); 5815 5816 r = MsiInstallProductA(msifile2, "REMOVE=ALL"); 5817 ok(r == ERROR_SUCCESS, "got %u\n", r); 5818 5819 ok(!pf_exists("msitest\\sharedcomponent.txt"), "file not removed\n"); 5820 5821 DeleteFileA("msitest\\sharedcomponent.txt"); 5822 RemoveDirectoryA("msitest"); 5823 DeleteFileA(msifile); 5824 DeleteFileA(msifile2); 5825 } 5826 5827 static void test_remove_upgrade_code(void) 5828 { 5829 UINT r; 5830 LONG res; 5831 HKEY hkey; 5832 REGSAM access = KEY_ALL_ACCESS; 5833 DWORD type, size; 5834 char buf[1]; 5835 5836 if (is_process_limited()) 5837 { 5838 skip( "process is limited\n" ); 5839 return; 5840 } 5841 if (is_wow64) access |= KEY_WOW64_64KEY; 5842 5843 create_test_files(); 5844 create_database( msifile, icon_base_tables, sizeof(icon_base_tables)/sizeof(icon_base_tables[0]) ); 5845 5846 MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); 5847 5848 r = MsiInstallProductA( msifile, "FULL=1" ); 5849 ok(r == ERROR_SUCCESS, "got %u\n", r); 5850 5851 res = RegOpenKeyExA( HKEY_LOCAL_MACHINE, 5852 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2", 5853 0, access, &hkey ); 5854 ok( res == ERROR_SUCCESS, "got %d\n", res ); 5855 5856 type = 0xdeadbeef; 5857 buf[0] = 0x55; 5858 size = sizeof(buf); 5859 res = RegQueryValueExA( hkey, "94A88FD7F6998CE40A22FB59F6B9C2BB", NULL, &type, (BYTE *)buf, &size ); 5860 ok( res == ERROR_SUCCESS, "got %d\n", res ); 5861 ok( type == REG_SZ, "got %u\n", type ); 5862 ok( size == 1, "got %u\n", size ); 5863 ok( !buf[0], "wrong data\n" ); 5864 RegCloseKey( hkey ); 5865 5866 r = MsiInstallProductA( msifile, "REMOVE=ALL" ); 5867 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5868 5869 res = RegOpenKeyExA( HKEY_LOCAL_MACHINE, 5870 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2", 5871 0, access, &hkey ); 5872 ok( res == ERROR_FILE_NOT_FOUND, "got %d\n", res ); 5873 5874 RemoveDirectoryA( "msitest" ); 5875 DeleteFileA( msifile ); 5876 } 5877 5878 static void test_feature_tree(void) 5879 { 5880 UINT r; 5881 5882 if (is_process_limited()) 5883 { 5884 skip( "process is limited\n" ); 5885 return; 5886 } 5887 5888 create_file( "msitest\\featuretree.txt", 1000 ); 5889 create_database( msifile, ft_tables, sizeof(ft_tables)/sizeof(ft_tables[0]) ); 5890 5891 MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); 5892 5893 r = MsiInstallProductA( msifile, "INSTALLTYPE=\"0\"" ); 5894 ok( r == ERROR_INSTALL_FAILURE, "got %u\n", r ); 5895 5896 r = MsiInstallProductA( msifile, "INSTALLTYPE=\"1\"" ); 5897 ok( r == ERROR_SUCCESS, "got %u\n", r ); 5898 5899 r = MsiInstallProductA( msifile, "REMOVE=ALL" ); 5900 ok( r == ERROR_SUCCESS, "got %u\n", r ); 5901 5902 DeleteFileA( "msitest\\featuretree.txt" ); 5903 RemoveDirectoryA( "msitest" ); 5904 DeleteFileA( msifile ); 5905 } 5906 5907 static void test_deferred_action(void) 5908 { 5909 UINT r; 5910 5911 create_database(msifile, da_tables, sizeof(da_tables) / sizeof(da_tables[0])); 5912 5913 MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); 5914 5915 r = MsiInstallProductA(msifile, "CMDEXE=\"cmd.exe\""); 5916 if (r == ERROR_INSTALL_PACKAGE_REJECTED) 5917 { 5918 skip("Not enough rights to perform tests\n"); 5919 goto error; 5920 } 5921 todo_wine 5922 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); 5923 5924 error: 5925 DeleteFileA(msifile); 5926 } 5927 5928 START_TEST(install) 5929 { 5930 DWORD len; 5931 char temp_path[MAX_PATH], prev_path[MAX_PATH], log_file[MAX_PATH]; 5932 STATEMGRSTATUS status; 5933 BOOL ret = FALSE; 5934 5935 init_functionpointers(); 5936 5937 if (pIsWow64Process) 5938 pIsWow64Process(GetCurrentProcess(), &is_wow64); 5939 5940 GetCurrentDirectoryA(MAX_PATH, prev_path); 5941 GetTempPathA(MAX_PATH, temp_path); 5942 SetCurrentDirectoryA(temp_path); 5943 5944 lstrcpyA(CURR_DIR, temp_path); 5945 len = lstrlenA(CURR_DIR); 5946 5947 if(len && (CURR_DIR[len - 1] == '\\')) 5948 CURR_DIR[len - 1] = 0; 5949 5950 ok(get_system_dirs(), "failed to retrieve system dirs\n"); 5951 ok(get_user_dirs(), "failed to retrieve user dirs\n"); 5952 5953 /* Create a restore point ourselves so we circumvent the multitude of restore points 5954 * that would have been created by all the installation and removal tests. 5955 * 5956 * This is not needed on version 5.0 where setting MSIFASTINSTALL prevents the 5957 * creation of restore points. 5958 */ 5959 if (pSRSetRestorePointA && !pMsiGetComponentPathExA) 5960 { 5961 memset(&status, 0, sizeof(status)); 5962 ret = notify_system_change(BEGIN_NESTED_SYSTEM_CHANGE, &status); 5963 } 5964 5965 /* Create only one log file and don't append. We have to pass something 5966 * for the log mode for this to work. The logfile needs to have an absolute 5967 * path otherwise we still end up with some extra logfiles as some tests 5968 * change the current directory. 5969 */ 5970 lstrcpyA(log_file, temp_path); 5971 lstrcatA(log_file, "\\msitest.log"); 5972 MsiEnableLogA(INSTALLLOGMODE_FATALEXIT, log_file, 0); 5973 5974 if (pSRSetRestorePointA) /* test has side-effects on win2k3 that cause failures in following tests */ 5975 test_MsiInstallProduct(); 5976 test_MsiSetComponentState(); 5977 test_packagecoltypes(); 5978 test_continuouscabs(); 5979 test_caborder(); 5980 test_mixedmedia(); 5981 test_samesequence(); 5982 test_uiLevelFlags(); 5983 test_readonlyfile(); 5984 test_readonlyfile_cab(); 5985 test_setdirproperty(); 5986 test_cabisextracted(); 5987 test_transformprop(); 5988 test_currentworkingdir(); 5989 test_admin(); 5990 test_adminprops(); 5991 test_missingcab(); 5992 test_sourcefolder(); 5993 test_customaction51(); 5994 test_installstate(); 5995 test_sourcepath(); 5996 test_missingcomponent(); 5997 test_sourcedirprop(); 5998 test_adminimage(); 5999 test_propcase(); 6000 test_int_widths(); 6001 test_shortcut(); 6002 test_preselected(); 6003 test_installed_prop(); 6004 test_file_in_use(); 6005 test_file_in_use_cab(); 6006 test_allusers_prop(); 6007 test_feature_override(); 6008 test_icon_table(); 6009 test_package_validation(); 6010 test_upgrade_code(); 6011 test_mixed_package(); 6012 test_volume_props(); 6013 test_shared_component(); 6014 test_remove_upgrade_code(); 6015 test_feature_tree(); 6016 test_deferred_action(); 6017 6018 DeleteFileA(log_file); 6019 6020 if (pSRSetRestorePointA && !pMsiGetComponentPathExA && ret) 6021 { 6022 ret = notify_system_change(END_NESTED_SYSTEM_CHANGE, &status); 6023 if (ret) 6024 remove_restore_point(status.llSequenceNumber); 6025 } 6026 FreeLibrary(hsrclient); 6027 6028 SetCurrentDirectoryA(prev_path); 6029 } 6030