Home | History | Annotate | Line # | Download | only in ToolChains
      1 // <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>
     46 enum 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__
     77 typedef struct ISetupInstance ISetupInstance;
     78 #endif
     79 
     80 #ifndef __ISetupInstance2_FWD_DEFINED__
     81 #define __ISetupInstance2_FWD_DEFINED__
     82 typedef struct ISetupInstance2 ISetupInstance2;
     83 #endif
     84 
     85 #ifndef __IEnumSetupInstances_FWD_DEFINED__
     86 #define __IEnumSetupInstances_FWD_DEFINED__
     87 typedef struct IEnumSetupInstances IEnumSetupInstances;
     88 #endif
     89 
     90 #ifndef __ISetupConfiguration_FWD_DEFINED__
     91 #define __ISetupConfiguration_FWD_DEFINED__
     92 typedef struct ISetupConfiguration ISetupConfiguration;
     93 #endif
     94 
     95 #ifndef __ISetupConfiguration2_FWD_DEFINED__
     96 #define __ISetupConfiguration2_FWD_DEFINED__
     97 typedef struct ISetupConfiguration2 ISetupConfiguration2;
     98 #endif
     99 
    100 #ifndef __ISetupPackageReference_FWD_DEFINED__
    101 #define __ISetupPackageReference_FWD_DEFINED__
    102 typedef struct ISetupPackageReference ISetupPackageReference;
    103 #endif
    104 
    105 #ifndef __ISetupHelper_FWD_DEFINED__
    106 #define __ISetupHelper_FWD_DEFINED__
    107 typedef 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
    116 typedef class SetupConfiguration SetupConfiguration;
    117 #endif
    118 
    119 #endif
    120 
    121 #ifdef __cplusplus
    122 extern "C" {
    123 #endif
    124 
    125 // Interface definitions
    126 //
    127 EXTERN_C const IID IID_ISetupInstance;
    128 
    129 #if defined(__cplusplus) && !defined(CINTERFACE)
    130 /// <summary>
    131 /// Information about an instance of a product.
    132 /// </summary>
    133 struct 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 
    225 EXTERN_C const IID IID_ISetupInstance2;
    226 
    227 #if defined(__cplusplus) && !defined(CINTERFACE)
    228 /// <summary>
    229 /// Information about an instance of a product.
    230 /// </summary>
    231 struct 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 
    276 EXTERN_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>
    282 struct 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 
    327 EXTERN_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>
    333 struct 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 
    364 EXTERN_C const IID IID_ISetupConfiguration2;
    365 
    366 #if defined(__cplusplus) && !defined(CINTERFACE)
    367 /// <summary>
    368 /// Gets information about product instances.
    369 /// </summary>
    370 struct 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 
    382 EXTERN_C const IID IID_ISetupPackageReference;
    383 
    384 #if defined(__cplusplus) && !defined(CINTERFACE)
    385 /// <summary>
    386 /// A reference to a package.
    387 /// </summary>
    388 struct 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 
    445 EXTERN_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>
    455 struct 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 //
    488 EXTERN_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>
    495 class 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>
    509 STDMETHODIMP GetSetupConfiguration(_Out_ ISetupConfiguration **ppConfiguration,
    510                                    _Reserved_ LPVOID pReserved);
    511 
    512 #ifdef __cplusplus
    513 }
    514 #endif
    515