aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/package.h
blob: d596d7c0da05a5f5f423353930fdf565158ca636 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
#pragma once
// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.


#if defined(__cplusplus)
extern "C" {
#endif

struct _BURN_RELATED_BUNDLES;
typedef _BURN_RELATED_BUNDLES BURN_RELATED_BUNDLES;

struct _BURN_PACKAGE;
typedef _BURN_PACKAGE BURN_PACKAGE;

// constants

const DWORD BURN_PACKAGE_INVALID_PATCH_INDEX = 0x80000000;

enum BURN_CACHE_PACKAGE_TYPE
{
    BURN_CACHE_PACKAGE_TYPE_NONE,
    BURN_CACHE_PACKAGE_TYPE_OPTIONAL,
    BURN_CACHE_PACKAGE_TYPE_REQUIRED,
};

enum BURN_EXE_DETECTION_TYPE
{
    BURN_EXE_DETECTION_TYPE_NONE,
    BURN_EXE_DETECTION_TYPE_CONDITION,
    BURN_EXE_DETECTION_TYPE_ARP,
};

enum BURN_EXE_EXIT_CODE_TYPE
{
    BURN_EXE_EXIT_CODE_TYPE_NONE,
    BURN_EXE_EXIT_CODE_TYPE_SUCCESS,
    BURN_EXE_EXIT_CODE_TYPE_ERROR,
    BURN_EXE_EXIT_CODE_TYPE_SCHEDULE_REBOOT,
    BURN_EXE_EXIT_CODE_TYPE_FORCE_REBOOT,
    BURN_EXE_EXIT_CODE_TYPE_ERROR_SCHEDULE_REBOOT,
    BURN_EXE_EXIT_CODE_TYPE_ERROR_FORCE_REBOOT,
};

enum BURN_EXE_PROTOCOL_TYPE
{
    BURN_EXE_PROTOCOL_TYPE_NONE,
    BURN_EXE_PROTOCOL_TYPE_BURN,
    BURN_EXE_PROTOCOL_TYPE_NETFX4,
};

enum BURN_PACKAGE_TYPE
{
    BURN_PACKAGE_TYPE_NONE,
    BURN_PACKAGE_TYPE_BUNDLE,
    BURN_PACKAGE_TYPE_EXE,
    BURN_PACKAGE_TYPE_MSI,
    BURN_PACKAGE_TYPE_MSP,
    BURN_PACKAGE_TYPE_MSU,
};

enum BURN_DEPENDENCY_ACTION
{
    BURN_DEPENDENCY_ACTION_NONE,
    BURN_DEPENDENCY_ACTION_UNREGISTER,
    BURN_DEPENDENCY_ACTION_REGISTER,
};

enum BURN_PATCH_TARGETCODE_TYPE
{
    BURN_PATCH_TARGETCODE_TYPE_UNKNOWN,
    BURN_PATCH_TARGETCODE_TYPE_PRODUCT,
    BURN_PATCH_TARGETCODE_TYPE_UPGRADE,
};

enum BOOTSTRAPPER_FEATURE_ACTION
{
    BOOTSTRAPPER_FEATURE_ACTION_NONE,
    BOOTSTRAPPER_FEATURE_ACTION_ADDLOCAL,
    BOOTSTRAPPER_FEATURE_ACTION_ADDSOURCE,
    BOOTSTRAPPER_FEATURE_ACTION_ADDDEFAULT,
    BOOTSTRAPPER_FEATURE_ACTION_REINSTALL,
    BOOTSTRAPPER_FEATURE_ACTION_ADVERTISE,
    BOOTSTRAPPER_FEATURE_ACTION_REMOVE,
};

enum BURN_PACKAGE_REGISTRATION_STATE
{
    BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN,
    BURN_PACKAGE_REGISTRATION_STATE_ABSENT,
    BURN_PACKAGE_REGISTRATION_STATE_IGNORED,
    BURN_PACKAGE_REGISTRATION_STATE_PRESENT,
};

enum BURN_PATCH_SKIP_STATE
{
    BURN_PATCH_SKIP_STATE_NONE,
    BURN_PATCH_SKIP_STATE_TARGET_UNINSTALL,
    BURN_PATCH_SKIP_STATE_SLIPSTREAM,
};

// structs

typedef struct _BURN_EXE_EXIT_CODE
{
    BURN_EXE_EXIT_CODE_TYPE type;
    DWORD dwCode;
    BOOL fWildcard;
} BURN_EXE_EXIT_CODE;

typedef struct _BURN_EXE_COMMAND_LINE_ARGUMENT
{
    LPWSTR sczInstallArgument;
    LPWSTR sczUninstallArgument;
    LPWSTR sczRepairArgument;
    LPWSTR sczCondition;
} BURN_EXE_COMMAND_LINE_ARGUMENT;

typedef struct _BURN_MSPTARGETPRODUCT
{
    MSIINSTALLCONTEXT context;
    DWORD dwOrder;
    WCHAR wzTargetProductCode[39];
    BURN_PACKAGE* pChainedTargetPackage;
    BOOL fInstalled;
    BOOL fSlipstream;
    BOOL fSlipstreamRequired; // this means the target product is not present on the machine, but is available in the chain as a slipstream target.

    BOOTSTRAPPER_PACKAGE_STATE patchPackageState; // only valid after Detect.
    BOOTSTRAPPER_REQUEST_STATE defaultRequested;  // only valid during Plan.
    BOOTSTRAPPER_REQUEST_STATE requested;         // only valid during Plan.
    BOOTSTRAPPER_ACTION_STATE execute;            // only valid during Plan.
    BOOTSTRAPPER_ACTION_STATE rollback;           // only valid during Plan.
    BURN_PATCH_SKIP_STATE executeSkip;            // only valid during Plan.
    BURN_PATCH_SKIP_STATE rollbackSkip;           // only valid during Plan.

    BURN_PACKAGE_REGISTRATION_STATE registrationState;           // initialized during Detect, updated during Apply.
    BURN_PACKAGE_REGISTRATION_STATE transactionRegistrationState;// only valid during Apply inside an MSI transaction.
} BURN_MSPTARGETPRODUCT;

typedef struct _BURN_MSIPROPERTY
{
    LPWSTR sczId;
    LPWSTR sczValue; // used during forward execution
    LPWSTR sczRollbackValue;  // used during rollback
    LPWSTR sczCondition;
} BURN_MSIPROPERTY;

typedef struct _BURN_MSIFEATURE
{
    LPWSTR sczId;
    LPWSTR sczAddLocalCondition;
    LPWSTR sczAddSourceCondition;
    LPWSTR sczAdvertiseCondition;
    LPWSTR sczRollbackAddLocalCondition;
    LPWSTR sczRollbackAddSourceCondition;
    LPWSTR sczRollbackAdvertiseCondition;

    BOOTSTRAPPER_FEATURE_STATE currentState;       // only valid after Detect.
    BOOTSTRAPPER_FEATURE_STATE expectedState;      // only valid during Plan.
    BOOTSTRAPPER_FEATURE_STATE defaultRequested;   // only valid during Plan.
    BOOTSTRAPPER_FEATURE_STATE requested;          // only valid during Plan.
    BOOTSTRAPPER_FEATURE_ACTION execute;           // only valid during Plan.
    BOOTSTRAPPER_FEATURE_ACTION rollback;          // only valid during Plan.
} BURN_MSIFEATURE;

typedef struct _BURN_COMPATIBLE_PROVIDER_ENTRY
{
    LPWSTR sczProviderKey;
    LPWSTR sczId;
    LPWSTR sczName;
    LPWSTR sczVersion;
} BURN_COMPATIBLE_PROVIDER_ENTRY;

typedef struct _BURN_RELATED_MSI
{
    LPWSTR sczUpgradeCode;
    VERUTIL_VERSION* pMinVersion;
    VERUTIL_VERSION* pMaxVersion;
    BOOL fMinProvided;
    BOOL fMaxProvided;
    BOOL fMinInclusive;
    BOOL fMaxInclusive;
    BOOL fOnlyDetect;
    BOOL fLangInclusive;

    DWORD* rgdwLanguages;
    DWORD cLanguages;
} BURN_RELATED_MSI;

typedef struct _BURN_CHAINED_PATCH
{
    BURN_PACKAGE* pMspPackage;
    DWORD dwMspTargetProductIndex; // index into the Msp.rgTargetProducts
} BURN_CHAINED_PATCH;

typedef struct _BURN_SLIPSTREAM_MSP
{
    BURN_PACKAGE* pMspPackage;
    DWORD dwMsiChainedPatchIndex; // index into the Msi.rgChainedPatches

    BOOTSTRAPPER_ACTION_STATE execute;    // only valid during Plan.
    BOOTSTRAPPER_ACTION_STATE rollback;   // only valid during Plan.
} BURN_SLIPSTREAM_MSP;

typedef struct _BURN_DEPENDENCY_PROVIDER
{
    LPWSTR sczKey;
    LPWSTR sczVersion;
    LPWSTR sczDisplayName;
    BOOL fImported;

    BOOL fExists;                              // only valid after Detect.
    BOOL fBundleRegisteredAsDependent;         // only valid after Detect.
    DEPENDENCY* rgDependents;                  // only valid after Detect.
    UINT cDependents;                          // only valid after Detect.

    BURN_DEPENDENCY_ACTION dependentExecute;   // only valid during Plan.
    BURN_DEPENDENCY_ACTION dependentRollback;  // only valid during Plan.
    BURN_DEPENDENCY_ACTION providerExecute;    // only valid during Plan.
    BURN_DEPENDENCY_ACTION providerRollback;   // only valid during Plan.
} BURN_DEPENDENCY_PROVIDER;

typedef struct _BURN_ROLLBACK_BOUNDARY
{
    LPWSTR sczId;
    BOOL fVital;
    BOOL fTransactionAuthored;
    BOOL fTransaction;
    BOOL fActiveTransaction; // only valid during Apply.
    LPWSTR sczLogPathVariable;
    LPWSTR sczLogPath;
} BURN_ROLLBACK_BOUNDARY;

typedef struct _BURN_PATCH_TARGETCODE
{
    LPWSTR sczTargetCode;
    BURN_PATCH_TARGETCODE_TYPE type;
} BURN_PATCH_TARGETCODE;

typedef struct _BURN_COMPATIBLE_PACKAGE
{
    BOOL fDetected;
    BOOL fPlannable;
    BOOL fDefaultRequested;
    BOOL fRequested;
    BOOL fRemove;
    LPWSTR sczCacheId;
    BURN_COMPATIBLE_PROVIDER_ENTRY compatibleEntry;

    BURN_PACKAGE_TYPE type;
    union
    {
        struct
        {
            LPWSTR sczVersion;
            VERUTIL_VERSION* pVersion;
        } Msi;
    };
} BURN_COMPATIBLE_PACKAGE;

typedef struct _BURN_PACKAGE
{
    LPWSTR sczId;

    LPWSTR sczLogPathVariable;          // name of the variable that will be set to the log path.
    LPWSTR sczRollbackLogPathVariable;  // name of the variable that will be set to the rollback path.
    LPWSTR sczCompatibleLogPathVariable;

    LPWSTR sczInstallCondition;
    LPWSTR sczRepairCondition;
    BOOL fPerMachine;
    BOOL fPermanent;
    BOOL fVital;
    BOOL fCanAffectRegistration;

    BOOTSTRAPPER_CACHE_TYPE authoredCacheType;
    LPWSTR sczCacheId;

    DWORD64 qwInstallSize;
    DWORD64 qwSize;

    BURN_ROLLBACK_BOUNDARY* pRollbackBoundaryForward;  // used during install and repair.
    BURN_ROLLBACK_BOUNDARY* pRollbackBoundaryBackward; // used during uninstall.

    BOOTSTRAPPER_PACKAGE_STATE currentState;    // only valid after Detect.
    BOOL fCached;                               // only valid after Detect.
    BOOTSTRAPPER_CACHE_TYPE cacheType;          // only valid during Plan.
    BOOTSTRAPPER_REQUEST_STATE defaultRequested;// only valid during Plan.
    BOOTSTRAPPER_REQUEST_STATE requested;       // only valid during Plan.
    BOOL fCacheVital;                           // only valid during Plan.
    BOOL fPlannedUncache;                       // only valid during Plan.
    BOOTSTRAPPER_ACTION_STATE execute;          // only valid during Plan.
    BOOTSTRAPPER_ACTION_STATE rollback;         // only valid during Plan.
    BOOL fProviderExecute;                      // only valid during Plan.
    BOOL fProviderRollback;                     // only valid during Plan.
    BURN_DEPENDENCY_ACTION dependencyExecute;   // only valid during Plan.
    BURN_DEPENDENCY_ACTION dependencyRollback;  // only valid during Plan.
    BOOL fDependencyManagerWasHere;             // only valid during Plan.
    BURN_CACHE_PACKAGE_TYPE executeCacheType;   // only valid during Plan.
    BURN_CACHE_PACKAGE_TYPE rollbackCacheType;  // only valid during Plan.
    HANDLE hCacheEvent;                         // only valid during Plan.
    LPWSTR sczCacheFolder;                      // only valid during Apply.
    HRESULT hrCacheResult;                      // only valid during Apply.
    BOOL fAcquireOptionalSource;                // only valid during Apply.
    BOOL fReachedExecution;                     // only valid during Apply.
    BOOL fAbandonedProcess;                     // only valid during Apply.

    BURN_PACKAGE_REGISTRATION_STATE cacheRegistrationState;          // initialized during Detect, updated during Apply.
    BURN_PACKAGE_REGISTRATION_STATE installRegistrationState;        // initialized during Detect, updated during Apply.
    BURN_PACKAGE_REGISTRATION_STATE expectedCacheRegistrationState;  // only valid after Plan.
    BURN_PACKAGE_REGISTRATION_STATE expectedInstallRegistrationState;// only valid after Plan.
    BURN_PACKAGE_REGISTRATION_STATE transactionRegistrationState;    // only valid during Apply inside an MSI transaction.

    BURN_PAYLOAD_GROUP payloads;

    BURN_DEPENDENCY_PROVIDER* rgDependencyProviders;
    DWORD cDependencyProviders;

    BURN_COMPATIBLE_PACKAGE compatiblePackage;

    BURN_PACKAGE_TYPE type;
    union
    {
        struct
        {
            LPWSTR sczBundleCode;
            LPWSTR sczArpKeyPath;
            VERUTIL_VERSION* pVersion;
            LPWSTR sczRegistrationKey;
            LPWSTR sczInstallArguments;
            LPWSTR sczRepairArguments;
            LPWSTR sczUninstallArguments;

            LPWSTR* rgsczDetectCodes;
            DWORD cDetectCodes;

            LPWSTR* rgsczUpgradeCodes;
            DWORD cUpgradeCodes;

            LPWSTR* rgsczAddonCodes;
            DWORD cAddonCodes;

            LPWSTR* rgsczPatchCodes;
            DWORD cPatchCodes;

            BOOL fHideARP;
            BOOL fWin64;
            BOOL fSupportsBurnProtocol;

            BURN_EXE_EXIT_CODE* rgExitCodes;
            DWORD cExitCodes;

            BURN_EXE_COMMAND_LINE_ARGUMENT* rgCommandLineArguments;
            DWORD cCommandLineArguments;

            LPWSTR sczIgnoreDependencies;
            LPCWSTR wzAncestors; // points directly into engine state.
            LPCWSTR wzEngineWorkingDirectory; // points directly into engine state.
        } Bundle;
        struct
        {
            BURN_EXE_DETECTION_TYPE detectionType;

            BOOL fArpWin64;
            BOOL fArpUseUninstallString;
            LPWSTR sczArpKeyPath;
            VERUTIL_VERSION* pArpDisplayVersion;

            LPWSTR sczDetectCondition;
            LPWSTR sczInstallArguments;
            LPWSTR sczRepairArguments;
            LPWSTR sczUninstallArguments;
            LPCWSTR wzAncestors; // points directly into engine state.
            LPCWSTR wzEngineWorkingDirectory; // points directly into engine state.

            BOOL fBundle;
            BOOL fPseudoPackage;
            BOOL fFireAndForget;
            BOOL fRepairable;
            BOOL fUninstallable;
            BURN_EXE_PROTOCOL_TYPE protocol;

            BURN_EXE_EXIT_CODE* rgExitCodes;
            DWORD cExitCodes;

            BURN_EXE_COMMAND_LINE_ARGUMENT* rgCommandLineArguments;
            DWORD cCommandLineArguments;
        } Exe;
        struct
        {
            LPWSTR sczProductCode;
            DWORD dwLanguage;
            VERUTIL_VERSION* pVersion;
            LPWSTR sczUpgradeCode;

            BOOTSTRAPPER_RELATED_OPERATION operation;

            BURN_MSIPROPERTY* rgProperties;
            DWORD cProperties;

            BURN_MSIFEATURE* rgFeatures;
            DWORD cFeatures;

            BURN_RELATED_MSI* rgRelatedMsis;
            DWORD cRelatedMsis;

            BURN_SLIPSTREAM_MSP* rgSlipstreamMsps;
            LPWSTR* rgsczSlipstreamMspPackageIds;
            DWORD cSlipstreamMspPackages;

            BURN_CHAINED_PATCH* rgChainedPatches;
            DWORD cChainedPatches;
        } Msi;
        struct
        {
            LPWSTR sczPatchCode;
            LPWSTR sczApplicabilityXml;

            BURN_MSIPROPERTY* rgProperties;
            DWORD cProperties;

            BURN_MSPTARGETPRODUCT* rgTargetProducts;
            DWORD cTargetProductCodes;
        } Msp;
        struct
        {
            LPWSTR sczDetectCondition;
        } Msu;
    };
} BURN_PACKAGE;

typedef struct _BURN_PACKAGES
{
    BURN_ROLLBACK_BOUNDARY* rgRollbackBoundaries;
    DWORD cRollbackBoundaries;

    BURN_PACKAGE* rgPackages;
    DWORD cPackages;

    BURN_PATCH_TARGETCODE* rgPatchTargetCodes;
    DWORD cPatchTargetCodes;

    MSIPATCHSEQUENCEINFOW* rgPatchInfo;
    BURN_PACKAGE** rgPatchInfoToPackage; // direct lookup from patch information to the (MSP) package it describes.
                                         // Thus this array is the exact same size as rgPatchInfo.
    DWORD cPatchInfo;
} BURN_PACKAGES;


// function declarations

HRESULT PackagesParseFromXml(
    __in BURN_PACKAGES* pPackages,
    __in BURN_PAYLOADS* pPayloads,
    __in IXMLDOMNode* pixnBundle
    );
void PackageUninitialize(
    __in BURN_PACKAGE* pPackage
    );
void PackageUninitializeCompatible(
    __in BURN_COMPATIBLE_PACKAGE* pCompatiblePackage
    );
void PackagesUninitialize(
    __in BURN_PACKAGES* pPackages
    );
HRESULT PackageFindById(
    __in BURN_PACKAGES* pPackages,
    __in_z LPCWSTR wzId,
    __out BURN_PACKAGE** ppPackage
    );
HRESULT PackageFindRelatedById(
    __in BURN_RELATED_BUNDLES* pRelatedBundles,
    __in_z LPCWSTR wzId,
    __out BURN_PACKAGE** ppPackage
    );
HRESULT PackageGetProperty(
    __in const BURN_PACKAGE* pPackage,
    __in_z LPCWSTR wzProperty,
    __out_z_opt LPWSTR* psczValue
    );
HRESULT PackageFindRollbackBoundaryById(
    __in BURN_PACKAGES* pPackages,
    __in_z LPCWSTR wzId,
    __out BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary
    );


#if defined(__cplusplus)
}
#endif