blob: a890b85fd5e9834b529197ba1dead0580608819f [file] [log] [blame]
Zachary Turnerf6302522017-03-15 16:07:35 +00001// <copyright file="Program.cpp" company="Microsoft Corporation">
2// Copyright (C) Microsoft Corporation. All rights reserved.
3// Licensed under the MIT license.
4// </copyright>
5// <license>
6// The MIT License (MIT)
7//
8// Copyright (C) Microsoft Corporation. All rights reserved.
9//
10// Permission is hereby granted, free of charge, to any person obtaining
11// a copy of this software and associated documentation files (the "Software"),
12// to deal in the Software without restriction, including without limitation the
13// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
14// sell copies of the Software, and to permit persons to whom the Software is
15// furnished to do so, subject to the following conditions:
16//
17// The above copyright notice and this permission notice shall be included in
18// all copies or substantial portions of the Software.
19//
20// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26// SOFTWARE.
27// </license>
28
29#pragma once
30
31// Constants
32//
33#ifndef E_NOTFOUND
34#define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND)
35#endif
36
37#ifndef E_FILENOTFOUND
38#define E_FILENOTFOUND HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)
39#endif
40
41// Enumerations
42//
43/// <summary>
44/// The state of an instance.
45/// </summary>
46enum InstanceState : unsigned {
47 /// <summary>
48 /// The instance state has not been determined.
49 /// </summary>
50 eNone = 0,
51
52 /// <summary>
53 /// The instance installation path exists.
54 /// </summary>
55 eLocal = 1,
56
57 /// <summary>
58 /// A product is registered to the instance.
59 /// </summary>
60 eRegistered = 2,
61
62 /// <summary>
63 /// No reboot is required for the instance.
64 /// </summary>
65 eNoRebootRequired = 4,
66
67 /// <summary>
68 /// The instance represents a complete install.
69 /// </summary>
70 eComplete = MAXUINT,
71};
72
73// Forward interface declarations
74//
75#ifndef __ISetupInstance_FWD_DEFINED__
76#define __ISetupInstance_FWD_DEFINED__
77typedef struct ISetupInstance ISetupInstance;
78#endif
79
80#ifndef __ISetupInstance2_FWD_DEFINED__
81#define __ISetupInstance2_FWD_DEFINED__
82typedef struct ISetupInstance2 ISetupInstance2;
83#endif
84
85#ifndef __IEnumSetupInstances_FWD_DEFINED__
86#define __IEnumSetupInstances_FWD_DEFINED__
87typedef struct IEnumSetupInstances IEnumSetupInstances;
88#endif
89
90#ifndef __ISetupConfiguration_FWD_DEFINED__
91#define __ISetupConfiguration_FWD_DEFINED__
92typedef struct ISetupConfiguration ISetupConfiguration;
93#endif
94
95#ifndef __ISetupConfiguration2_FWD_DEFINED__
96#define __ISetupConfiguration2_FWD_DEFINED__
97typedef struct ISetupConfiguration2 ISetupConfiguration2;
98#endif
99
100#ifndef __ISetupPackageReference_FWD_DEFINED__
101#define __ISetupPackageReference_FWD_DEFINED__
102typedef struct ISetupPackageReference ISetupPackageReference;
103#endif
104
105#ifndef __ISetupHelper_FWD_DEFINED__
106#define __ISetupHelper_FWD_DEFINED__
107typedef struct ISetupHelper ISetupHelper;
108#endif
109
110// Forward class declarations
111//
112#ifndef __SetupConfiguration_FWD_DEFINED__
113#define __SetupConfiguration_FWD_DEFINED__
114
115#ifdef __cplusplus
116typedef class SetupConfiguration SetupConfiguration;
117#endif
118
119#endif
120
121#ifdef __cplusplus
122extern "C" {
123#endif
124
125// Interface definitions
126//
127EXTERN_C const IID IID_ISetupInstance;
128
129#if defined(__cplusplus) && !defined(CINTERFACE)
130/// <summary>
131/// Information about an instance of a product.
132/// </summary>
133struct DECLSPEC_UUID("B41463C3-8866-43B5-BC33-2B0676F7F42E")
134 DECLSPEC_NOVTABLE ISetupInstance : public IUnknown {
135 /// <summary>
136 /// Gets the instance identifier (should match the name of the parent instance
137 /// directory).
138 /// </summary>
139 /// <param name="pbstrInstanceId">The instance identifier.</param>
140 /// <returns>Standard HRESULT indicating success or failure, including
141 /// E_FILENOTFOUND if the instance state does not exist.</returns>
142 STDMETHOD(GetInstanceId)(_Out_ BSTR *pbstrInstanceId) = 0;
143
144 /// <summary>
145 /// Gets the local date and time when the installation was originally
146 /// installed.
147 /// </summary>
148 /// <param name="pInstallDate">The local date and time when the installation
149 /// was originally installed.</param>
150 /// <returns>Standard HRESULT indicating success or failure, including
151 /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
152 /// property is not defined.</returns>
153 STDMETHOD(GetInstallDate)(_Out_ LPFILETIME pInstallDate) = 0;
154
155 /// <summary>
156 /// Gets the unique name of the installation, often indicating the branch and
157 /// other information used for telemetry.
158 /// </summary>
159 /// <param name="pbstrInstallationName">The unique name of the installation,
160 /// often indicating the branch and other information used for
161 /// telemetry.</param>
162 /// <returns>Standard HRESULT indicating success or failure, including
163 /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
164 /// property is not defined.</returns>
165 STDMETHOD(GetInstallationName)(_Out_ BSTR *pbstrInstallationName) = 0;
166
167 /// <summary>
168 /// Gets the path to the installation root of the product.
169 /// </summary>
170 /// <param name="pbstrInstallationPath">The path to the installation root of
171 /// the product.</param>
172 /// <returns>Standard HRESULT indicating success or failure, including
173 /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
174 /// property is not defined.</returns>
175 STDMETHOD(GetInstallationPath)(_Out_ BSTR *pbstrInstallationPath) = 0;
176
177 /// <summary>
178 /// Gets the version of the product installed in this instance.
179 /// </summary>
180 /// <param name="pbstrInstallationVersion">The version of the product
181 /// installed in this instance.</param>
182 /// <returns>Standard HRESULT indicating success or failure, including
183 /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
184 /// property is not defined.</returns>
185 STDMETHOD(GetInstallationVersion)(_Out_ BSTR *pbstrInstallationVersion) = 0;
186
187 /// <summary>
188 /// Gets the display name (title) of the product installed in this instance.
189 /// </summary>
190 /// <param name="lcid">The LCID for the display name.</param>
191 /// <param name="pbstrDisplayName">The display name (title) of the product
192 /// installed in this instance.</param>
193 /// <returns>Standard HRESULT indicating success or failure, including
194 /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
195 /// property is not defined.</returns>
196 STDMETHOD(GetDisplayName)(_In_ LCID lcid, _Out_ BSTR *pbstrDisplayName) = 0;
197
198 /// <summary>
199 /// Gets the description of the product installed in this instance.
200 /// </summary>
201 /// <param name="lcid">The LCID for the description.</param>
202 /// <param name="pbstrDescription">The description of the product installed in
203 /// this instance.</param>
204 /// <returns>Standard HRESULT indicating success or failure, including
205 /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
206 /// property is not defined.</returns>
207 STDMETHOD(GetDescription)(_In_ LCID lcid, _Out_ BSTR *pbstrDescription) = 0;
208
209 /// <summary>
210 /// Resolves the optional relative path to the root path of the instance.
211 /// </summary>
212 /// <param name="pwszRelativePath">A relative path within the instance to
213 /// resolve, or NULL to get the root path.</param>
214 /// <param name="pbstrAbsolutePath">The full path to the optional relative
215 /// path within the instance. If the relative path is NULL, the root path will
216 /// always terminate in a backslash.</param>
217 /// <returns>Standard HRESULT indicating success or failure, including
218 /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
219 /// property is not defined.</returns>
220 STDMETHOD(ResolvePath)
221 (_In_opt_z_ LPCOLESTR pwszRelativePath, _Out_ BSTR *pbstrAbsolutePath) = 0;
222};
223#endif
224
225EXTERN_C const IID IID_ISetupInstance2;
226
227#if defined(__cplusplus) && !defined(CINTERFACE)
228/// <summary>
229/// Information about an instance of a product.
230/// </summary>
231struct DECLSPEC_UUID("89143C9A-05AF-49B0-B717-72E218A2185C")
232 DECLSPEC_NOVTABLE ISetupInstance2 : public ISetupInstance {
233 /// <summary>
234 /// Gets the state of the instance.
235 /// </summary>
236 /// <param name="pState">The state of the instance.</param>
237 /// <returns>Standard HRESULT indicating success or failure, including
238 /// E_FILENOTFOUND if the instance state does not exist.</returns>
239 STDMETHOD(GetState)(_Out_ InstanceState *pState) = 0;
240
241 /// <summary>
242 /// Gets an array of package references registered to the instance.
243 /// </summary>
244 /// <param name="ppsaPackages">Pointer to an array of <see
245 /// cref="ISetupPackageReference"/>.</param>
246 /// <returns>Standard HRESULT indicating success or failure, including
247 /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
248 /// packages property is not defined.</returns>
249 STDMETHOD(GetPackages)(_Out_ LPSAFEARRAY *ppsaPackages) = 0;
250
251 /// <summary>
252 /// Gets a pointer to the <see cref="ISetupPackageReference"/> that represents
253 /// the registered product.
254 /// </summary>
255 /// <param name="ppPackage">Pointer to an instance of <see
256 /// cref="ISetupPackageReference"/>. This may be NULL if <see
257 /// cref="GetState"/> does not return <see cref="eComplete"/>.</param>
258 /// <returns>Standard HRESULT indicating success or failure, including
259 /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
260 /// packages property is not defined.</returns>
261 STDMETHOD(GetProduct)
262 (_Outptr_result_maybenull_ ISetupPackageReference **ppPackage) = 0;
263
264 /// <summary>
265 /// Gets the relative path to the product application, if available.
266 /// </summary>
267 /// <param name="pbstrProductPath">The relative path to the product
268 /// application, if available.</param>
269 /// <returns>Standard HRESULT indicating success or failure, including
270 /// E_FILENOTFOUND if the instance state does not exist.</returns>
271 STDMETHOD(GetProductPath)
272 (_Outptr_result_maybenull_ BSTR *pbstrProductPath) = 0;
273};
274#endif
275
276EXTERN_C const IID IID_IEnumSetupInstances;
277
278#if defined(__cplusplus) && !defined(CINTERFACE)
279/// <summary>
280/// A enumerator of installed <see cref="ISetupInstance"/> objects.
281/// </summary>
282struct DECLSPEC_UUID("6380BCFF-41D3-4B2E-8B2E-BF8A6810C848")
283 DECLSPEC_NOVTABLE IEnumSetupInstances : public IUnknown {
284 /// <summary>
285 /// Retrieves the next set of product instances in the enumeration sequence.
286 /// </summary>
287 /// <param name="celt">The number of product instances to retrieve.</param>
288 /// <param name="rgelt">A pointer to an array of <see
289 /// cref="ISetupInstance"/>.</param>
290 /// <param name="pceltFetched">A pointer to the number of product instances
291 /// retrieved. If celt is 1 this parameter may be NULL.</param>
292 /// <returns>S_OK if the number of elements were fetched, S_FALSE if nothing
293 /// was fetched (at end of enumeration), E_INVALIDARG if celt is greater than
294 /// 1 and pceltFetched is NULL, or E_OUTOFMEMORY if an <see
295 /// cref="ISetupInstance"/> could not be allocated.</returns>
296 STDMETHOD(Next)
297 (_In_ ULONG celt, _Out_writes_to_(celt, *pceltFetched) ISetupInstance **rgelt,
298 _Out_opt_ _Deref_out_range_(0, celt) ULONG *pceltFetched) = 0;
299
300 /// <summary>
301 /// Skips the next set of product instances in the enumeration sequence.
302 /// </summary>
303 /// <param name="celt">The number of product instances to skip.</param>
304 /// <returns>S_OK if the number of elements could be skipped; otherwise,
305 /// S_FALSE;</returns>
306 STDMETHOD(Skip)(_In_ ULONG celt) = 0;
307
308 /// <summary>
309 /// Resets the enumeration sequence to the beginning.
310 /// </summary>
311 /// <returns>Always returns S_OK;</returns>
312 STDMETHOD(Reset)(void) = 0;
313
314 /// <summary>
315 /// Creates a new enumeration object in the same state as the current
316 /// enumeration object: the new object points to the same place in the
317 /// enumeration sequence.
318 /// </summary>
319 /// <param name="ppenum">A pointer to a pointer to a new <see
320 /// cref="IEnumSetupInstances"/> interface. If the method fails, this
321 /// parameter is undefined.</param>
322 /// <returns>S_OK if a clone was returned; otherwise, E_OUTOFMEMORY.</returns>
323 STDMETHOD(Clone)(_Deref_out_opt_ IEnumSetupInstances **ppenum) = 0;
324};
325#endif
326
327EXTERN_C const IID IID_ISetupConfiguration;
328
329#if defined(__cplusplus) && !defined(CINTERFACE)
330/// <summary>
331/// Gets information about product instances set up on the machine.
332/// </summary>
333struct DECLSPEC_UUID("42843719-DB4C-46C2-8E7C-64F1816EFD5B")
334 DECLSPEC_NOVTABLE ISetupConfiguration : public IUnknown {
335 /// <summary>
336 /// Enumerates all completed product instances installed.
337 /// </summary>
338 /// <param name="ppEnumInstances">An enumeration of completed, installed
339 /// product instances.</param>
340 /// <returns>Standard HRESULT indicating success or failure.</returns>
341 STDMETHOD(EnumInstances)(_Out_ IEnumSetupInstances **ppEnumInstances) = 0;
342
343 /// <summary>
344 /// Gets the instance for the current process path.
345 /// </summary>
346 /// <param name="ppInstance">The instance for the current process
347 /// path.</param>
348 /// <returns>The instance for the current process path, or E_NOTFOUND if not
349 /// found.</returns>
350 STDMETHOD(GetInstanceForCurrentProcess)
351 (_Out_ ISetupInstance **ppInstance) = 0;
352
353 /// <summary>
354 /// Gets the instance for the given path.
355 /// </summary>
356 /// <param name="ppInstance">The instance for the given path.</param>
357 /// <returns>The instance for the given path, or E_NOTFOUND if not
358 /// found.</returns>
359 STDMETHOD(GetInstanceForPath)
360 (_In_z_ LPCWSTR wzPath, _Out_ ISetupInstance **ppInstance) = 0;
361};
362#endif
363
364EXTERN_C const IID IID_ISetupConfiguration2;
365
366#if defined(__cplusplus) && !defined(CINTERFACE)
367/// <summary>
368/// Gets information about product instances.
369/// </summary>
370struct DECLSPEC_UUID("26AAB78C-4A60-49D6-AF3B-3C35BC93365D")
371 DECLSPEC_NOVTABLE ISetupConfiguration2 : public ISetupConfiguration {
372 /// <summary>
373 /// Enumerates all product instances.
374 /// </summary>
375 /// <param name="ppEnumInstances">An enumeration of all product
376 /// instances.</param>
377 /// <returns>Standard HRESULT indicating success or failure.</returns>
378 STDMETHOD(EnumAllInstances)(_Out_ IEnumSetupInstances **ppEnumInstances) = 0;
379};
380#endif
381
382EXTERN_C const IID IID_ISetupPackageReference;
383
384#if defined(__cplusplus) && !defined(CINTERFACE)
385/// <summary>
386/// A reference to a package.
387/// </summary>
388struct DECLSPEC_UUID("da8d8a16-b2b6-4487-a2f1-594ccccd6bf5")
389 DECLSPEC_NOVTABLE ISetupPackageReference : public IUnknown {
390 /// <summary>
391 /// Gets the general package identifier.
392 /// </summary>
393 /// <param name="pbstrId">The general package identifier.</param>
394 /// <returns>Standard HRESULT indicating success or failure.</returns>
395 STDMETHOD(GetId)(_Out_ BSTR *pbstrId) = 0;
396
397 /// <summary>
398 /// Gets the version of the package.
399 /// </summary>
400 /// <param name="pbstrVersion">The version of the package.</param>
401 /// <returns>Standard HRESULT indicating success or failure.</returns>
402 STDMETHOD(GetVersion)(_Out_ BSTR *pbstrVersion) = 0;
403
404 /// <summary>
405 /// Gets the target process architecture of the package.
406 /// </summary>
407 /// <param name="pbstrChip">The target process architecture of the
408 /// package.</param>
409 /// <returns>Standard HRESULT indicating success or failure.</returns>
410 STDMETHOD(GetChip)(_Out_ BSTR *pbstrChip) = 0;
411
412 /// <summary>
413 /// Gets the language and optional region identifier.
414 /// </summary>
415 /// <param name="pbstrLanguage">The language and optional region
416 /// identifier.</param>
417 /// <returns>Standard HRESULT indicating success or failure.</returns>
418 STDMETHOD(GetLanguage)(_Out_ BSTR *pbstrLanguage) = 0;
419
420 /// <summary>
421 /// Gets the build branch of the package.
422 /// </summary>
423 /// <param name="pbstrBranch">The build branch of the package.</param>
424 /// <returns>Standard HRESULT indicating success or failure.</returns>
425 STDMETHOD(GetBranch)(_Out_ BSTR *pbstrBranch) = 0;
426
427 /// <summary>
428 /// Gets the type of the package.
429 /// </summary>
430 /// <param name="pbstrType">The type of the package.</param>
431 /// <returns>Standard HRESULT indicating success or failure.</returns>
432 STDMETHOD(GetType)(_Out_ BSTR *pbstrType) = 0;
433
434 /// <summary>
435 /// Gets the unique identifier consisting of all defined tokens.
436 /// </summary>
437 /// <param name="pbstrUniqueId">The unique identifier consisting of all
438 /// defined tokens.</param>
439 /// <returns>Standard HRESULT indicating success or failure, including
440 /// E_UNEXPECTED if no Id was defined (required).</returns>
441 STDMETHOD(GetUniqueId)(_Out_ BSTR *pbstrUniqueId) = 0;
442};
443#endif
444
445EXTERN_C const IID IID_ISetupHelper;
446
447#if defined(__cplusplus) && !defined(CINTERFACE)
448/// <summary>
449/// Helper functions.
450/// </summary>
451/// <remarks>
452/// You can query for this interface from the <see cref="SetupConfiguration"/>
453/// class.
454/// </remarks>
455struct DECLSPEC_UUID("42b21b78-6192-463e-87bf-d577838f1d5c")
456 DECLSPEC_NOVTABLE ISetupHelper : public IUnknown {
457 /// <summary>
458 /// Parses a dotted quad version string into a 64-bit unsigned integer.
459 /// </summary>
460 /// <param name="pwszVersion">The dotted quad version string to parse, e.g.
461 /// 1.2.3.4.</param>
462 /// <param name="pullVersion">A 64-bit unsigned integer representing the
463 /// version. You can compare this to other versions.</param>
464 /// <returns>Standard HRESULT indicating success or failure.</returns>
465 STDMETHOD(ParseVersion)
466 (_In_ LPCOLESTR pwszVersion, _Out_ PULONGLONG pullVersion) = 0;
467
468 /// <summary>
469 /// Parses a dotted quad version string into a 64-bit unsigned integer.
470 /// </summary>
471 /// <param name="pwszVersionRange">The string containing 1 or 2 dotted quad
472 /// version strings to parse, e.g. [1.0,) that means 1.0.0.0 or newer.</param>
473 /// <param name="pullMinVersion">A 64-bit unsigned integer representing the
474 /// minimum version, which may be 0. You can compare this to other
475 /// versions.</param>
476 /// <param name="pullMaxVersion">A 64-bit unsigned integer representing the
477 /// maximum version, which may be MAXULONGLONG. You can compare this to other
478 /// versions.</param>
479 /// <returns>Standard HRESULT indicating success or failure.</returns>
480 STDMETHOD(ParseVersionRange)
481 (_In_ LPCOLESTR pwszVersionRange, _Out_ PULONGLONG pullMinVersion,
482 _Out_ PULONGLONG pullMaxVersion) = 0;
483};
484#endif
485
486// Class declarations
487//
488EXTERN_C const CLSID CLSID_SetupConfiguration;
489
490#ifdef __cplusplus
491/// <summary>
492/// This class implements <see cref="ISetupConfiguration"/>, <see
493/// cref="ISetupConfiguration2"/>, and <see cref="ISetupHelper"/>.
494/// </summary>
495class DECLSPEC_UUID("177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D") SetupConfiguration;
496#endif
497
498// Function declarations
499//
500/// <summary>
501/// Gets an <see cref="ISetupConfiguration"/> that provides information about
502/// product instances installed on the machine.
503/// </summary>
504/// <param name="ppConfiguration">The <see cref="ISetupConfiguration"/> that
505/// provides information about product instances installed on the
506/// machine.</param>
507/// <param name="pReserved">Reserved for future use.</param>
508/// <returns>Standard HRESULT indicating success or failure.</returns>
509STDMETHODIMP GetSetupConfiguration(_Out_ ISetupConfiguration **ppConfiguration,
510 _Reserved_ LPVOID pReserved);
511
512#ifdef __cplusplus
513}
514#endif