40static const char *
msifile =
"winetest-patch.msi";
41static const char *
mspfile =
"winetest-patch.msp";
54 "Property\tProperty\n"
55 "Manufacturer\tWineHQ\n"
56 "ProductCode\t{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}\n"
57 "UpgradeCode\t{A2E3D643-4E2C-477F-A309-F76F552D5F43}\n"
58 "ProductLanguage\t1033\n"
59 "ProductName\tmsitest\n"
60 "ProductVersion\t1.1.1\n"
61 "PATCHNEWSUMMARYSUBJECT\tInstaller Database\n"
62 "MSIFASTINSTALL\t1\n";
65 "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
66 "i2\ti4\tL64\tS255\tS32\tS72\n"
68 "1\t1\t\t\tDISK1\t\n";
71 "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
72 "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
74 "patch.txt\tpatch\tpatch.txt\t1000\t\t\t0\t1\n"
75 "disable.txt\tdisable\tdisable.txt\t1000\t\t\t0\t1\n";
78 "Directory\tDirectory_Parent\tDefaultDir\n"
80 "Directory\tDirectory\n"
81 "MSITESTDIR\tProgramFilesFolder\tmsitest\n"
82 "ProgramFilesFolder\tTARGETDIR\t.\n"
83 "TARGETDIR\t\tSourceDir";
86 "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
87 "s72\tS38\ts72\ti2\tS255\tS72\n"
88 "Component\tComponent\n"
89 "patch\t{4B79D87E-6D28-4FD3-92D6-CD9B26AF64F1}\tMSITESTDIR\t0\t\tpatch.txt\n"
90 "disable\t{BDDBA0EE-0031-4591-ADC0-33308175AC19}\tMSITESTDIR\t0\t\tdisable.txt\n";
93 "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
94 "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
96 "patch\t\t\tpatch feature\t1\t1\tMSITESTDIR\t0\n"
97 "disable\t\t\tdisabled feature\t1\t1\tMSITESTDIR\t0\n";
100 "Feature_\tComponent_\n"
102 "FeatureComponents\tFeature_\tComponent_\n"
104 "disable\tdisable\n";
107 "Action\tCondition\tSequence\n"
109 "InstallExecuteSequence\tAction\n"
110 "LaunchConditions\t\t100\n"
111 "CostInitialize\t\t800\n"
113 "CostFinalize\t\t1000\n"
114 "InstallValidate\t\t1400\n"
115 "InstallInitialize\t\t1500\n"
116 "ProcessComponents\t\t1600\n"
117 "RemoveFiles\t\t1700\n"
118 "InstallFiles\t\t2000\n"
119 "RegisterUser\t\t3000\n"
120 "RegisterProduct\t\t3100\n"
121 "PublishFeatures\t\t5100\n"
122 "PublishProduct\t\t5200\n"
123 "UnpublishFeatures\t\t5300\n"
124 "InstallFinalize\t\t6000\n";
127 "Feature_\tLevel\tCondition\n"
129 "Condition\tFeature_\tLevel\n"
130 "disable\t0\tDISABLE_FEATURE\n";
139#define ADD_TABLE( x ) { #x".idt", x##_dat, sizeof(x##_dat) }
158#define GET_PROC( mod, func ) \
159 p ## func = (void *)GetProcAddress( mod, #func ); \
161 trace( "GetProcAddress(%s) failed\n", #func );
230#define create_file( name, size ) create_file_data( name, name, size )
331 for (
i = 0;
i < num_tables;
i++)
354static const WCHAR p_name0[] = { 0x4840, 0x3b3f, 0x43f2, 0x4438, 0x45b1, 0 };
355static const WCHAR p_name1[] = { 0x4840, 0x3f7f, 0x4164, 0x422f, 0x4836, 0 };
356static const WCHAR p_name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 };
357static const WCHAR p_name3[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 };
358static const WCHAR p_name4[] = { 0x3a8c, 0x47cb, 0x45b0, 0x45ec, 0x45a8, 0x4837, 0};
359static const WCHAR p_name5[] = { 0x4840, 0x4596, 0x3e6c, 0x45e4, 0x42e6, 0x421c, 0x4634, 0x4468, 0x4226, 0 };
360static const WCHAR p_name6[] = { 0x0005, 0x0053, 0x0075, 0x006d, 0x006d, 0x0061, 0x0072,
361 0x0079, 0x0049, 0x006e, 0x0066, 0x006f, 0x0072, 0x006d,
362 0x0061, 0x0074, 0x0069, 0x006f, 0x006e, 0 };
364static const WCHAR p_name7[] = { 0x0074, 0x0061, 0x0072, 0x0067, 0x0065, 0x0074, 0x0054, 0x006f, 0x0075, 0x0070,
365 0x0067, 0x0072, 0x0061, 0x0064, 0x0065, 0x0064, 0 };
366static const WCHAR p_name8[] = { 0x0023, 0x0074, 0x0061, 0x0072, 0x0067, 0x0065, 0x0074, 0x0054, 0x006f, 0x0075,
367 0x0070, 0x0067, 0x0072, 0x0061, 0x0064, 0x0065, 0x0064, 0 };
371 0x0001, 0x0001, 0x0001, 0x0001, 0x8001, 0x8002, 0x8003, 0x8004,
372 0x0002, 0x0003, 0x0004, 0x0005, 0xad00, 0xbd26, 0x8d00, 0x9502
378 "MsiPatchSequencePatchFamilyProductCodeSequenceAttributes1.1.19388.37230913B8D18FBB64CACA239C74C11E3FA74"
392 0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
396 0xea, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87,
397 0x3c, 0xd4, 0xb8, 0x20, 0x00, 0x70, 0x61, 0x74, 0x63, 0x68, 0x2e,
398 0x74, 0x78, 0x74, 0x00, 0xe8, 0x03, 0x00, 0x00, 0xea, 0x03, 0x00,
399 0x00, 0x00, 0x00, 0xcb, 0x50, 0x17, 0x7e, 0x20, 0x00, 0x66, 0x69,
400 0x6c, 0x65, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xb0, 0xb2, 0xb2, 0x25,
401 0x2d, 0x00, 0xd2, 0x07, 0x43, 0x4b, 0xcb, 0x2d, 0xce, 0x2c, 0x49,
402 0x2d, 0x2e, 0x89, 0x29, 0x48, 0x2c, 0x49, 0xce, 0x48, 0x4d, 0xd1,
403 0x2b, 0xa9, 0x28, 0x51, 0x18, 0x05, 0xa3, 0x60, 0x14, 0x0c, 0x37,
404 0x90, 0x8b, 0x9c, 0xd3, 0x41, 0xf9, 0x9c, 0x61, 0x14, 0x8c, 0x82,
405 0x51, 0x30, 0xdc, 0x00, 0x00
408 0x0007, 0x0000, 0x0006, 0x8000
411 0xfe, 0xff, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x9f, 0xf2, 0xf9,
414 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9,
415 0x30, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
416 0x00, 0x09, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x07, 0x00,
417 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x90,
418 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
419 0x0f, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
420 0x00, 0x27, 0x00, 0x00, 0x00, 0x7b, 0x30, 0x46, 0x39, 0x36, 0x43,
421 0x44, 0x43, 0x30, 0x2d, 0x34, 0x43, 0x44, 0x46, 0x2d, 0x34, 0x33,
422 0x30, 0x34, 0x2d, 0x42, 0x32, 0x38, 0x33, 0x2d, 0x37, 0x42, 0x39,
423 0x32, 0x36, 0x34, 0x38, 0x38, 0x39, 0x45, 0x46, 0x37, 0x7d, 0x00,
424 0x00, 0x1e, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x7b, 0x39,
425 0x31, 0x33, 0x42, 0x38, 0x44, 0x31, 0x38, 0x2d, 0x46, 0x42, 0x42,
426 0x36, 0x2d, 0x34, 0x43, 0x41, 0x43, 0x2d, 0x41, 0x32, 0x33, 0x39,
427 0x2d, 0x43, 0x37, 0x34, 0x43, 0x31, 0x31, 0x45, 0x33, 0x46, 0x41,
428 0x37, 0x34, 0x7d, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x25, 0x00,
429 0x00, 0x00, 0x3a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x6f,
430 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x3b, 0x3a, 0x23,
431 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x70, 0x67,
432 0x72, 0x61, 0x64, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
433 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x50, 0x61, 0x74, 0x63, 0x68,
434 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x00,
435 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
455static const WCHAR t1_name1[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 };
456static const WCHAR t1_name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 };
457static const WCHAR t1_name3[] = { 0x0005, 0x0053, 0x0075, 0x006d, 0x006d, 0x0061, 0x0072,
458 0x0079, 0x0049, 0x006e, 0x0066, 0x006f, 0x0072, 0x006d,
459 0x0061, 0x0074, 0x0069, 0x006f, 0x006e, 0 };
462 0x0008, 0x0001, 0x03ea, 0x8000
473 0xfe, 0xff, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
474 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
475 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x9f, 0xf2, 0xf9,
476 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9,
477 0x30, 0x00, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x00,
478 0x00, 0x02, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x03, 0x00,
479 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xa8,
480 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00,
481 0x06, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
482 0x00, 0xd0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xdc, 0x00,
483 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x08,
484 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
485 0x07, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x8f, 0x01, 0x00,
486 0x00, 0x10, 0x00, 0x00, 0x00, 0x97, 0x01, 0x00, 0x00, 0x1e, 0x00,
487 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x73, 0x74, 0x61,
488 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x61, 0x74,
489 0x61, 0x62, 0x61, 0x73, 0x65, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
490 0x00, 0x16, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c,
491 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x61, 0x74, 0x61,
492 0x62, 0x61, 0x73, 0x65, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
493 0x07, 0x00, 0x00, 0x00, 0x57, 0x69, 0x6e, 0x65, 0x48, 0x51, 0x00,
494 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
495 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
496 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
497 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
498 0x00, 0x1e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x78, 0x38,
499 0x36, 0x3b, 0x31, 0x30, 0x33, 0x33, 0x00, 0x00, 0x00, 0x1e, 0x00,
500 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3b, 0x31, 0x30, 0x33, 0x33,
501 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00,
502 0x7b, 0x39, 0x31, 0x33, 0x42, 0x38, 0x44, 0x31, 0x38, 0x2d, 0x46,
503 0x42, 0x42, 0x36, 0x2d, 0x34, 0x43, 0x41, 0x43, 0x2d, 0x41, 0x32,
504 0x33, 0x39, 0x2d, 0x43, 0x37, 0x34, 0x43, 0x31, 0x31, 0x45, 0x33,
505 0x46, 0x41, 0x37, 0x34, 0x7d, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x3b,
506 0x7b, 0x39, 0x31, 0x33, 0x42, 0x38, 0x44, 0x31, 0x38, 0x2d, 0x46,
507 0x42, 0x42, 0x36, 0x2d, 0x34, 0x43, 0x41, 0x43, 0x2d, 0x41, 0x32,
508 0x33, 0x39, 0x2d, 0x43, 0x37, 0x34, 0x43, 0x31, 0x31, 0x45, 0x33,
509 0x46, 0x41, 0x37, 0x34, 0x7d, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x3b,
510 0x7b, 0x41, 0x32, 0x45, 0x33, 0x44, 0x36, 0x34, 0x33, 0x2d, 0x34,
511 0x45, 0x32, 0x43, 0x2d, 0x34, 0x37, 0x37, 0x46, 0x2d, 0x41, 0x33,
512 0x30, 0x39, 0x2d, 0x46, 0x37, 0x36, 0x46, 0x35, 0x35, 0x32, 0x44,
513 0x35, 0x46, 0x34, 0x33, 0x7d, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
514 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x22,
527static const WCHAR t2_name2[] = { 0x4840, 0x3b3f, 0x43f2, 0x4438, 0x45b1, 0 };
528static const WCHAR t2_name3[] = { 0x4840, 0x3f7f, 0x4164, 0x422f, 0x4836, 0 };
529static const WCHAR t2_name4[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 };
530static const WCHAR t2_name5[] = { 0x4840, 0x4119, 0x41b7, 0x3e6b, 0x41a4, 0x412e, 0x422a, 0 };
531static const WCHAR t2_name6[] = { 0x4840, 0x4452, 0x45f6, 0x43e4, 0x3baf, 0x423b, 0x4626,
532 0x4237, 0x421c, 0x4634, 0x4468, 0x4226, 0 };
533static const WCHAR t2_name7[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 };
534static const WCHAR t2_name8[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 };
535static const WCHAR t2_name9[] = { 0x0005, 0x0053, 0x0075, 0x006d, 0x006d, 0x0061, 0x0072,
536 0x0079, 0x0049, 0x006e, 0x0066, 0x006f, 0x0072, 0x006d,
537 0x0061, 0x0074, 0x0069, 0x006f, 0x006e, 0 };
538static const WCHAR t2_name10[] = { 0x4840, 0x420f, 0x45e4, 0x4578, 0x3b28, 0x4432, 0x44b3,
539 0x4231, 0x45f1, 0x4836, 0 };
540static const WCHAR t2_name11[] = { 0x4840, 0x448c, 0x44f0, 0x4472, 0x4468, 0x4837, 0 };
544 0x00c0, 0x0001, 0x9000, 0x83e8, 0x0801, 0x0002, 0x0003, 0x0002,
545 0x03e8, 0x8000, 0x0000, 0x0000, 0x9000, 0x83e9
548 0x0601, 0x8002, 0x03e9, 0x8000, 0x0000, 0x000d, 0x0000, 0x000e
551 0x0401, 0x000f, 0x0000, 0x0010, 0xad48, 0x0401, 0x000f, 0x0000,
552 0x0011, 0xa502, 0x0401, 0x000f, 0x0000, 0x0012, 0x8104, 0x0401,
553 0x000f, 0x0000, 0x0013, 0x8502, 0x0401, 0x000f, 0x0000, 0x0014,
554 0x9900, 0x0401, 0x000f, 0x0000, 0x0015, 0x9d48, 0x0401, 0x0016,
555 0x0000, 0x0017, 0xad26, 0x0401, 0x0016, 0x0000, 0x0018, 0x8502,
556 0x0401, 0x001a, 0x0000, 0x001b, 0xad26, 0x0401, 0x001a, 0x0000,
560 0x0101, 0x000f, 0x0101, 0x0016, 0x0101, 0x001a
563 0x0002, 0x0008, 0x0009, 0x0201, 0x000a, 0x000b
566 0x0201, 0x0019, 0x8002
569 0x0301, 0x000c, 0x0000, 0x87d1
572 "patch.txtfile.txtfile{327d9640-674f-4b9f-8b8a-547a0f6f8518}MSITESTDIRnewnew featurePATCHNEWSUMMARYSUBJECT"
573 "Installation DatabasePATCHNEWPACKAGECODE{42A14A82-12F8-4E6D-970E-1B4EE7BE28B0}PatchFiles#CAB_msitestprop"
574 "PatchFile_SequencePatchSizeAttributesHeaderStreamRef_PatchPackagePatchIdMedia_"
575 "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}MsiPatchHeadersStreamRef"
609 0xfe, 0xff, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
610 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
611 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x9f, 0xf2, 0xf9,
612 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9,
613 0x30, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x00,
614 0x00, 0x02, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00,
615 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x78,
616 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00,
617 0x06, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
618 0x00, 0x9c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xa8, 0x00,
619 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x09,
620 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
621 0x4c, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x54, 0x01, 0x00,
622 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
623 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
624 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
625 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
626 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00,
627 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01,
628 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
629 0x06, 0x00, 0x00, 0x00, 0x3b, 0x31, 0x30, 0x33, 0x33, 0x00, 0x00,
630 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
631 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7b,
632 0x39, 0x31, 0x33, 0x42, 0x38, 0x44, 0x31, 0x38, 0x2d, 0x46, 0x42,
633 0x42, 0x36, 0x2d, 0x34, 0x43, 0x41, 0x43, 0x2d, 0x41, 0x32, 0x33,
634 0x39, 0x2d, 0x43, 0x37, 0x34, 0x43, 0x31, 0x31, 0x45, 0x33, 0x46,
635 0x41, 0x37, 0x34, 0x7d, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x3b, 0x7b,
636 0x39, 0x31, 0x33, 0x42, 0x38, 0x44, 0x31, 0x38, 0x2d, 0x46, 0x42,
637 0x42, 0x36, 0x2d, 0x34, 0x43, 0x41, 0x43, 0x2d, 0x41, 0x32, 0x33,
638 0x39, 0x2d, 0x43, 0x37, 0x34, 0x43, 0x31, 0x31, 0x45, 0x33, 0x46,
639 0x41, 0x37, 0x34, 0x7d, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x3b, 0x7b,
640 0x41, 0x32, 0x45, 0x33, 0x44, 0x36, 0x34, 0x33, 0x2d, 0x34, 0x45,
641 0x32, 0x43, 0x2d, 0x34, 0x37, 0x37, 0x46, 0x2d, 0x41, 0x33, 0x30,
642 0x39, 0x2d, 0x46, 0x37, 0x36, 0x46, 0x35, 0x35, 0x32, 0x44, 0x35,
643 0x46, 0x34, 0x33, 0x7d, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2d,
644 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x27, 0x09
647 0x0201, 0x0006, 0x0003
650 0x0601, 0x0003, 0x0004, 0x0005, 0x8000, 0x0000, 0x0002
653 0x0801, 0x0006, 0x0000, 0x0000, 0x0007, 0x8001, 0x8001, 0x0005,
679 for (
i = 0;
i < num_tables;
i++)
684 ok( 0,
"failed to create stream %#lx\n",
r );
690 ok( 0,
"failed to write stream\n" );
691 IStream_Release( stm );
703 const CLSID CLSID_MsiPatch = {0xc1086, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}};
704 const CLSID CLSID_MsiTransform = {0xc1082, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}};
712 ok(
r ==
S_OK,
"failed to create storage %#lx\n",
r );
716 r = IStorage_SetClass( stg, &CLSID_MsiPatch );
717 ok(
r ==
S_OK,
"failed to set storage type %#lx\n",
r );
721 r = IStorage_CreateStorage( stg,
p_name7,
mode, 0, 0, &stg1 );
722 ok(
r ==
S_OK,
"failed to create substorage %#lx\n",
r );
724 r = IStorage_SetClass( stg1, &CLSID_MsiTransform );
725 ok(
r ==
S_OK,
"failed to set storage type %#lx\n",
r );
728 IStorage_Release( stg1 );
730 r = IStorage_CreateStorage( stg,
p_name8,
mode, 0, 0, &stg2 );
731 ok(
r ==
S_OK,
"failed to create substorage %#lx\n",
r );
733 r = IStorage_SetClass( stg2, &CLSID_MsiTransform );
734 ok(
r ==
S_OK,
"failed to set storage type %#lx\n",
r );
737 IStorage_Release( stg2 );
738 IStorage_Release( stg );
750 if (!pMsiApplyPatchA)
752 win_skip(
"MsiApplyPatchA is not available\n");
757 skip(
"process is limited\n");
772 skip(
"Product installation failed with error code %u\n",
r);
777 ok(
size == 1000,
"expected 1000, got %lu\n",
size );
779 size =
sizeof(install_source);
781 "InstallSource", install_source, &
size );
792 ok( hdb,
"failed to get database handle\n" );
794 query =
"SELECT * FROM `Property` where `Property` = 'PATCHNEWPACKAGECODE'";
808 query =
"SELECT * FROM `Property` WHERE `Property` = 'PATCHNEWSUMMARYSUBJECT' "
809 "AND `Value` = 'Installer Database'";
827 ok( !
strcmp(
buffer,
"Installer Database" ),
"expected \'Installer Database\', got \'%s\'\n",
buffer );
834 "expected ERROR_SUCCESS, got %u\n",
r );
838 win_skip(
"Windows Installer < 3.0 detected\n");
843 ok(
size == 1002,
"expected 1002, got %lu\n",
size );
845 ok(
size == 1000,
"expected 1000, got %lu\n",
size );
852 ok( hdb,
"failed to get database handle\n" );
854 query =
"SELECT * FROM `Property` where `Property` = 'PATCHNEWPACKAGECODE'";
868 query =
"SELECT * FROM `Property` WHERE `Property` = 'PATCHNEWSUMMARYSUBJECT' "
869 "AND `Value` = 'Installation Database'";
887 ok( !
strcmp(
buffer,
"Installation Database" ),
"expected \'Installation Database\', got \'%s\'\n",
buffer );
981 static const char fmt[] =
"SELECT * FROM `%s` WHERE `Name` = '%s'";
1083 static const char patchsource[] =
"MSPSRC0F96CDC04CDF4304B2837B9264889EF7";
1089 if (!pMsiApplyPatchA)
1091 win_skip(
"MsiApplyPatchA is not available\n");
1096 skip(
"process is limited\n");
1111 skip(
"Product installation failed with error code %d\n",
r);
1115 r =
MsiOpenProductA(
"{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", &hproduct );
1119 ok( hdb,
"failed to get database handle\n" );
1121 r =
find_entry( hdb,
"_Streams",
"\5SummaryInformation" );
1124 query =
"SELECT * FROM `_Storages`";
1146 r =
find_entry( hdb,
"_Tables",
"FeatureComponents" );
1152 r =
find_entry( hdb,
"_Tables",
"InstallExecuteSequence" );
1158 r =
get_integer( hdb, 1,
"SELECT * FROM `Media` WHERE `VolumeLabel`=\'DISK1\'");
1159 ok(
r == 1,
"Got %u\n",
r );
1172 "expected ERROR_SUCCESS, got %u\n",
r );
1176 win_skip(
"Windows Installer < 3.0 detected\n");
1180 r =
MsiOpenProductA(
"{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", &hproduct );
1184 ok( hdb,
"failed to get database handle\n" );
1186 r =
find_entry( hdb,
"_Streams",
"\5SummaryInformation" );
1189 r =
find_entryW( hdb,
L"_Streams",
L"\x3a8c\x47cb\x45b0\x45ec\x45a8\x4837" );
1192 query =
"SELECT * FROM `_Storages`";
1214 r =
find_entry( hdb,
"_Tables",
"FeatureComponents" );
1220 r =
find_entry( hdb,
"_Tables",
"InstallExecuteSequence" );
1229 r =
find_entry( hdb,
"_Tables",
"MsiPatchHeaders" );
1238 cr =
get_string( hdb, 6,
"SELECT * FROM `Media` WHERE `Source` IS NOT NULL");
1239 todo_wine ok( !
strcmp(cr, patchsource),
"Expected \"%s\", got \"%s\"\n", patchsource, cr );
1241 r =
get_integer( hdb, 1,
"SELECT * FROM `Media` WHERE `Source` IS NOT NULL");
1244 r =
get_integer( hdb, 2,
"SELECT * FROM `Media` WHERE `Source` IS NOT NULL");
1247 r =
get_integer( hdb, 1,
"SELECT * FROM `Media` WHERE `VolumeLabel`=\'DISK1\'");
1248 ok(
r == 1,
"Got %u\n",
r );
1250 cr =
get_string( hdb, 4,
"SELECT * FROM `Media` WHERE `Source` IS NOT NULL");
1251 ok( !
strcmp(cr,
"#CAB_msitest"),
"Expected \"#CAB_msitest\", got \"%s\"\n", cr );
1253 r =
get_integer( hdb, 8,
"SELECT * FROM `File` WHERE `File` = 'patch.txt'");
1254 ok(
r == 10000,
"Got %u\n",
r );
1279 if (!pMsiApplyPatchA || !pMsiGetPatchInfoExA || !pMsiEnumPatchesExA)
1281 win_skip(
"required functions not available\n");
1286 skip(
"process is limited\n");
1301 skip(
"Product installation failed with error code %d\n",
r);
1307 "expected ERROR_SUCCESS, got %u\n",
r );
1311 win_skip(
"Windows Installer < 3.0 detected\n");
1317 r = pMsiGetPatchInfoExA(
"{0F96CDC0-4CDF-4304-B283-7B9264889EF7}",
1318 "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}",
1326 r = pMsiGetPatchInfoExA(
"{0F96CDC0-4CDF-4304-B283-7B9264889EF7}",
1327 "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}",
1334 r = pMsiGetPatchInfoExA(
"{0F96CDC0-4CDF-4304-B283-7B9264889EF7}",
1335 "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}",
1341 r = pMsiEnumPatchesExA(
"{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}",
1345 ok( !
strcmp( patch_code,
"{0F96CDC0-4CDF-4304-B283-7B9264889EF7}" ),
"wrong patch code\n" );
1347 r = pMsiEnumPatchesExA(
"{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}",
1352 r = pMsiEnumPatchesExA(
"{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}",
1363 r = pMsiGetPatchInfoExA(
"{0F96CDC0-4CDF-4304-B283-7B9264889EF7}",
1364 "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}",
char * strcat(char *DstString, const char *SrcString)
int strcmp(const char *String1, const char *String2)
ACPI_SIZE strlen(const char *String)
char * strcpy(char *DstString, const char *SrcString)
#define RegCloseKey(hKey)
LONG WINAPI RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
BOOL WINAPI GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength)
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
#define INVALID_HANDLE_VALUE
#define CreateFileA(a, b, c, d, e, f, g)
#define GetCurrentProcess()
#define ERROR_NO_MORE_ITEMS
#define FILE_ATTRIBUTE_NORMAL
#define MultiByteToWideChar
static void cleanup(void)
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
BOOL WINAPI RemoveDirectoryA(IN LPCSTR lpPathName)
BOOL WINAPI CreateDirectoryA(IN LPCSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
BOOL WINAPI SetEndOfFile(HANDLE hFile)
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
DWORD WINAPI GetCurrentDirectoryA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
BOOL WINAPI SetCurrentDirectoryA(IN LPCSTR lpPathName)
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
UINT WINAPI MsiDatabaseImportA(MSIHANDLE handle, const char *szFolder, const char *szFilename)
UINT WINAPI MsiOpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIHANDLE *phDB)
UINT WINAPI MsiCloseHandle(MSIHANDLE handle)
UINT WINAPI MsiOpenProductA(LPCSTR szProduct, MSIHANDLE *phProduct)
UINT WINAPI MsiGetPatchInfoExA(LPCSTR szPatchCode, LPCSTR szProductCode, LPCSTR szUserSid, MSIINSTALLCONTEXT dwContext, LPCSTR szProperty, LPSTR lpValue, DWORD *pcchValue)
UINT WINAPI MsiInstallProductA(LPCSTR szPackagePath, LPCSTR szCommandLine)
UINT WINAPI MsiGetProductInfoA(LPCSTR szProduct, LPCSTR szAttribute, LPSTR szBuffer, LPDWORD pcchValueBuf)
INSTALLUILEVEL WINAPI MsiSetInternalUI(INSTALLUILEVEL dwUILevel, HWND *phWnd)
UINT WINAPI MsiApplyPatchA(LPCSTR szPatchPackage, LPCSTR szInstallPackage, INSTALLTYPE eInstallType, LPCSTR szCommandLine)
UINT WINAPI MsiOpenPackageA(LPCSTR szPackage, MSIHANDLE *phPackage)
MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall)
UINT WINAPI MsiGetPropertyA(MSIHANDLE hinst, const char *name, char *buf, DWORD *sz)
int WINAPI MsiRecordGetInteger(MSIHANDLE handle, UINT iField)
UINT WINAPI MsiRecordGetStringA(MSIHANDLE handle, UINT iField, char *szValue, DWORD *pcchValue)
UINT WINAPI MsiEnumPatchesExA(const char *szProductCode, const char *szUserSid, DWORD dwContext, DWORD dwFilter, DWORD dwIndex, char *szPatchCode, char *szTargetProductCode, MSIINSTALLCONTEXT *pdwTargetProductContext, char *szTargetUserSid, DWORD *pcchTargetUserSid)
UINT WINAPI MsiSummaryInfoSetPropertyA(MSIHANDLE handle, UINT uiProperty, UINT uiDataType, INT iValue, FILETIME *pftValue, const char *szValue)
UINT WINAPI MsiGetSummaryInformationA(MSIHANDLE hDatabase, const char *szDatabase, UINT uiUpdateCount, MSIHANDLE *pHandle)
UINT WINAPI MsiSummaryInfoPersist(MSIHANDLE handle)
HRESULT WINAPI StgCreateDocfile(LPCOLESTR pwcsName, DWORD grfMode, DWORD reserved, IStorage **ppstgOpen)
GLuint GLuint GLsizei GLenum type
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat token
static void write_tables(void)
#define sprintf(buf, format,...)
static const WCHAR filenameW[]
static const WCHAR t1_data0[]
static DWORD get_pf_file_size(const char *filename)
static const WCHAR t2_name12[]
static const char file_dat[]
static const WCHAR p_name6[]
static const WCHAR t2_data10[]
static void test_system_tables(void)
static const WCHAR t2_data4[]
static void set_suminfo(const WCHAR *filename)
static const WCHAR msifileW[]
static const WCHAR t2_data8[]
static void create_file_data(const char *filename, const char *data, DWORD size)
static const struct table_data table_transform1_data[]
static BOOL delete_pf(const char *rel_path, BOOL is_file)
static const WCHAR t2_data2[]
static const char media_dat[]
static const char p_data6[]
static const WCHAR p_data3[]
static const char p_data4[]
static const WCHAR t2_data11[]
static const WCHAR t1_name2[]
static void create_patch(const char *filename)
static const WCHAR p_data0[]
static BOOL get_program_files_dir(char *buf, char *buf2)
static const WCHAR t2_name11[]
static const char t2_data7[]
static const WCHAR t2_name7[]
static void init_function_pointers(void)
static const WCHAR t2_name3[]
static const char property_dat[]
static DWORD *static DWORD
static const WCHAR p_data1[]
static const struct table_data table_transform2_data[]
static INT get_integer(MSIHANDLE hdb, UINT field, const char *query)
static const struct table_data table_patch_data[]
static const WCHAR t1_name3[]
static void write_file(const char *filename, const char *data, DWORD data_size)
static const char * mspfile
static const WCHAR p_name4[]
static const char p_data2[]
static const char condition_dat[]
static const WCHAR t2_name1[]
static const WCHAR t2_data3[]
static const WCHAR p_name5[]
static const WCHAR t2_name9[]
static const WCHAR mspfileW[]
static char * get_string(MSIHANDLE hdb, UINT field, const char *query)
static char PROG_FILES_DIR[MAX_PATH]
static const WCHAR p_name8[]
static char COMMON_FILES_DIR[MAX_PATH]
static const WCHAR p_data5[]
static const WCHAR t2_data6[]
static char CURR_DIR[MAX_PATH]
static const WCHAR t2_name10[]
#define create_file(name, size)
static const char * msifile
static BOOL is_process_limited(void)
static const WCHAR t2_data5[]
static const char feature_dat[]
static const WCHAR p_name7[]
static void test_simple_patch(void)
static UINT find_entry(MSIHANDLE hdb, const char *table, const char *entry)
static const WCHAR t2_name4[]
static const char t1_data1[]
static const WCHAR p_name1[]
static const WCHAR p_name0[]
static const char install_exec_seq_dat[]
static const WCHAR t1_name1[]
static const WCHAR t2_name8[]
static const WCHAR t1_data2[]
static const char directory_dat[]
static DWORD *static MSIINSTALLCONTEXT LPDWORD
static void test_MsiOpenDatabase(void)
static const WCHAR t2_name6[]
static const WCHAR t2_name2[]
static const struct msi_table tables[]
static const WCHAR t2_name5[]
static const WCHAR t2_name0[]
static const char component_dat[]
static const char t1_data3[]
#define GET_PROC(mod, func)
static const char feature_comp_dat[]
static const WCHAR t2_data1[]
static const WCHAR p_name2[]
static void test_patch_registration(void)
static const char t2_data9[]
static const WCHAR p_name3[]
static const WCHAR t1_name0[]
static const WCHAR t2_data0[]
static UINT find_entryW(MSIHANDLE hdb, const WCHAR *table, const WCHAR *entry)
static const WCHAR t2_data12[]
#define create_database(name, tables, num_tables)
INTERNETFEATURELIST feature
enum tagMSIINSTALLCONTEXT MSIINSTALLCONTEXT
#define INSTALLPROPERTY_LOCALPACKAGEA
@ MSIINSTALLCONTEXT_MACHINE
@ MSIINSTALLCONTEXT_USERUNMANAGED
@ MSIINSTALLCONTEXT_USERMANAGED
UINT WINAPI MsiViewClose(MSIHANDLE hView)
UINT WINAPI MsiViewExecute(MSIHANDLE hView, MSIHANDLE hRec)
UINT WINAPI MsiDatabaseOpenViewW(MSIHANDLE hdb, LPCWSTR szQuery, MSIHANDLE *phView)
UINT WINAPI MsiDatabaseCommit(MSIHANDLE hdb)
UINT WINAPI MsiDatabaseOpenViewA(MSIHANDLE hdb, const char *szQuery, MSIHANDLE *phView)
UINT WINAPI MsiViewFetch(MSIHANDLE hView, MSIHANDLE *record)
#define MSIDBOPEN_PATCHFILE
#define MSIDBOPEN_READONLY
#define STGM_SHARE_EXCLUSIVE
#define INVALID_FILE_SIZE
#define ERROR_UNKNOWN_PRODUCT
#define ERROR_OPEN_FAILED
#define ERROR_PATCH_PACKAGE_INVALID
enum _TOKEN_ELEVATION_TYPE TOKEN_ELEVATION_TYPE
@ TokenElevationTypeLimited
@ TokenElevationTypeDefault
#define HKEY_LOCAL_MACHINE
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)