include: Define more wuapi interfaces to avoid undefined forward declarations.
diff --git a/include/wuapi.idl b/include/wuapi.idl
index 27a3d5f..dd5da68 100644
--- a/include/wuapi.idl
+++ b/include/wuapi.idl
@@ -21,21 +21,12 @@
 
 import "oaidl.idl";
 
-interface IAutomaticUpdates;
-interface IAutomaticUpdatesSettings;
-interface IDownloadJob;
-interface IDownloadResult;
-interface IInstallationJob;
-interface IInstallationResult;
-interface ISearchJob;
-interface ISearchResult;
+interface ICategoryCollection;
+interface IStringCollection;
 interface IUpdateCollection;
 interface IUpdateDownloader;
-interface IUpdateHistoryEntryCollection;
 interface IUpdateInstaller;
 interface IUpdateSearcher;
-interface IUpdateSession;
-interface IWebProxy;
 
 typedef [public] enum tagDownloadPriority
 {
@@ -52,6 +43,126 @@
     ssOthers        = 3,
 } ServerSelection;
 
+typedef [public] enum tagAutomaticUpdatesNotificationLevel
+{
+    aunlNotConfigured,
+    aunlDisabled,
+    aunlNotifyBeforeDownload,
+    aunlNotifyBeforeInstallation,
+    aunlScheduledInstallation,
+} AutomaticUpdatesNotificationLevel;
+
+typedef [public] enum tagAutomaticUpdatesScheduledInstallationDay
+{
+    ausidEveryDay,
+    ausidEverySunday,
+    ausidEveryMonday,
+    ausidEveryTuesday,
+    ausidEveryWednesday,
+    ausidEveryThursday,
+    ausidEveryFriday,
+    ausidEverySaturday,
+} AutomaticUpdatesScheduledInstallationDay;
+
+typedef [public] enum tagDownloadPhase
+{
+    dphInitializing,
+    dphDownloading,
+    dphVerifying,
+} DownloadPhase;
+
+typedef [public] enum tagOperationResultCode
+{
+    orcNotStarted,
+    orcInProgress,
+    orcSucceeded,
+    orcSucceededWithErrors,
+    orcFailed,
+    orcAborted,
+} OperationResultCode;
+
+typedef [public] enum tagUpdateExceptionContext
+{
+    uecGeneral = 1,
+    uecWindowsDriver,
+    uecWindowsInstaller
+} UpdateExceptionContext;
+
+typedef [public] enum tagInstallationImpact
+{
+    iiNormal,
+    iiMinor,
+    iiRequiresExclusiveHandling
+} InstallationImpact;
+
+typedef [public] enum tagInstallationRebootBehavior
+{
+    irbNeverReboots,
+    irbAlwaysRequiresReboot,
+    irbCanRequestReboot
+} InstallationRebootBehavior;
+
+typedef [public] enum tagUpdateType
+{
+    utSoftware = 1,
+    utDriver
+} UpdateType;
+
+typedef [public] enum tagUpdateOperation
+{
+    uoInstallation = 1,
+    uoUninstallation
+} UpdateOperation;
+
+typedef [public] enum tagDeploymentAction
+{
+    daNone,
+    daInstallation,
+    daUninstallation,
+    daDetection
+} DeploymentAction;
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(2ee48f22-af3c-405f-8970-f71be12ee9a2),
+    pointer_default(unique)
+]
+interface IAutomaticUpdatesSettings : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT NotificationLevel( [out, retval] AutomaticUpdatesNotificationLevel *retval );
+
+    [propput, id(0x60020001)]
+    HRESULT NotificationLevel( [in] AutomaticUpdatesNotificationLevel value );
+
+    [propget, id(0x60020002)]
+    HRESULT ReadOnly( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Required( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT ScheduledInstallationDay( [out, retval] AutomaticUpdatesScheduledInstallationDay *retval );
+
+    [propput, id(0x60020004)]
+    HRESULT ScheduledInstallationDay( [in] AutomaticUpdatesScheduledInstallationDay value );
+
+    [propget, id(0x60020005)]
+    HRESULT ScheduledInstallationTime( [out, retval] LONG *retval );
+
+    [propput, id(0x60020005)]
+    HRESULT ScheduledInstallationTime( [in] LONG value );
+
+    [id(0x60020006)]
+    HRESULT Refresh();
+
+    [id(0x60020007)]
+    HRESULT Save();
+}
+
 [
     object,
     uuid(673425bf-c082-4c7c-bdfd-569464b8e0ce),
@@ -81,6 +192,61 @@
 
 [
     object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(174c81fe-aecd-4dae-b8a0-2c6318dd86a8),
+    pointer_default(unique),
+]
+interface IWebProxy : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT Address( [out, retval] BSTR *retval );
+
+    [propput, id(0x60020001)]
+    HRESULT Address( [in] BSTR value );
+
+    [propget, id(0x60020002)]
+    HRESULT BypassList( [out, retval] IStringCollection **retval );
+
+    [propput, id(0x60020002)]
+    HRESULT BypassList( [in] IStringCollection *value );
+
+    [propget, id(0x60020003)]
+    HRESULT BypassProxyOnLocal( [out, retval] VARIANT_BOOL *retval );
+
+    [propput, id(0x60020003)]
+    HRESULT BypassProxyOnLocal( [in] VARIANT_BOOL value );
+
+    [propget, id(0x60020004)]
+    HRESULT ReadOnly( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020005)]
+    HRESULT UserName( [out, retval] BSTR *retval );
+
+    [propput, id(0x60020005)]
+    HRESULT UserName( [in] BSTR value );
+
+    [id(0x60020006)]
+    HRESULT SetPassword( [in] BSTR value );
+
+    [id(0x60020007)]
+    HRESULT PromptForCredentials( [in, unique] IUnknown *parentWindow,
+                                  [in] BSTR title );
+
+    [restricted, id(0x60020008)]
+    HRESULT PromptForCredentialsFromHwnd( [in, unique] HWND parentWindow,
+                                          [in] BSTR title );
+
+    [propget, id(0x60020009)]
+    HRESULT AutoDetect( [out, retval] VARIANT_BOOL *retval );
+
+    [propput, id(0x60020009)]
+    HRESULT AutoDetect( [in] VARIANT_BOOL value );
+}
+
+[
+    object,
     uuid(816858a4-260d-4260-933a-2585f1abc76b),
     oleautomation,
     dual,
@@ -121,6 +287,566 @@
 
 [
     object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(7c907864-346c-4aeb-8f3f-57da289f969f),
+    pointer_default(unique),
+]
+interface IImageInformation : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT AltText( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT Height( [out, retval] LONG *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Source( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT Width( [out, retval] LONG *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(81ddc1b8-9d35-47a6-b471-5b80f519223b),
+    pointer_default(unique),
+]
+interface ICategory : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Name( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020001)]
+    HRESULT CategoryID( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT Children( [out, retval] ICategoryCollection **retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Description( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT Image( [out, retval] IImageInformation **retval );
+
+    [propget, id(0x60020005)]
+    HRESULT Order( [out, retval] LONG *retval );
+
+    [propget, id(0x60020006)]
+    HRESULT Parent( [out, retval] ICategory **retval );
+
+    [propget, id(0x60020007)]
+    HRESULT Type( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020008)]
+    HRESULT Updates( [out, retval] IUpdateCollection **retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(3a56bfb8-576c-43f7-9335-fe4838fd7e37),
+    pointer_default(unique),
+]
+interface ICategoryCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                [out, retval] ICategory **retval );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(eff90582-2ddc-480f-a06d-60f3fbc362c3),
+    pointer_default(unique),
+    hidden
+]
+interface IStringCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [out, retval] BSTR *retval );
+
+    [propput, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                [in] BSTR value );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT ReadOnly( [out, retval] VARIANT_BOOL *retval );
+
+    [id(0x60020003)]
+    HRESULT Add( [in] BSTR value,
+                 [out, retval] LONG *retval );
+
+    [id(0x60020004)]
+    HRESULT Clear();
+
+    [id(0x60020005)]
+    HRESULT Copy( [out, retval] IStringCollection **retval );
+
+    [id(0x60020006)]
+    HRESULT Insert( [in] LONG index,
+                    [in] BSTR value );
+
+    [id(0x60020007)]
+    HRESULT RemoveAt( [in] LONG index );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(a376dd5e-09d4-427f-af7c-fed5b6e1c1d6),
+    pointer_default(unique),
+]
+interface IUpdateException : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Message( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020001)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT Context( [out, retval] UpdateExceptionContext *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(503626a3-8e14-4729-9355-0fe664bd2321),
+    pointer_default(unique),
+]
+interface IUpdateExceptionCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [out, retval] IUpdateException **retval );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(46297823-9940-4c09-aed9-cd3ea6d05968),
+    pointer_default(unique)
+]
+interface IUpdateIdentity : IDispatch
+{
+    [propget, id(0x60020002)]
+    HRESULT RevisionNumber( [out, retval] LONG *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT UpdateID( [out, retval] BSTR *retval );
+}
+
+[
+    ,
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(d9a59339-e245-4dbd-9686-4d5763e39624),
+    pointer_default(unique),
+]
+interface IInstallationBehavior : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT CanRequestUserInput( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT Impact( [out, retval] InstallationImpact *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT RebootBehavior( [out, retval] InstallationRebootBehavior *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT RequiresNetworkConnectivity( [out, retval] VARIANT_BOOL *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(54a2cb2d-9a0c-48b6-8a50-9abb69ee2d02),
+    pointer_default(unique),
+]
+interface IUpdateDownloadContent : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT DownloadUrl( [out, retval] BSTR *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(bc5513c8-b3b8-4bf7-a4d4-361c0d8c88ba),
+    pointer_default(unique),
+]
+interface IUpdateDownloadContentCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [out, retval] IUpdateDownloadContent **retval );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+}
+
+[
+
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(6a92b07a-d821-4682-b423-5c805022cc4d),
+    pointer_default(unique),
+]
+interface IUpdate : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Title( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020001)]
+    HRESULT AutoSelectOnWebSites( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT BundledUpdates( [out, retval] IUpdateCollection **retval );
+
+    [propget, id(0x60020003)]
+    HRESULT CanRequireSource( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT Categories( [out, retval] ICategoryCollection **retval );
+
+    [propget, id(0x60020005)]
+    HRESULT Deadline( [out, retval] VARIANT *retval );
+
+    [propget, id(0x60020006)]
+    HRESULT DeltaCompressedContentAvailable( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020007)]
+    HRESULT DeltaCompressedContentPreferred( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020008)]
+    HRESULT Description( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020009)]
+    HRESULT EulaAccepted( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x6002000a)]
+    HRESULT EulaText( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002000b)]
+    HRESULT HandlerID( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002000c)]
+    HRESULT Identity( [out, retval] IUpdateIdentity **retval );
+
+    [propget, id(0x6002000d)]
+    HRESULT Image( [out, retval] IImageInformation **retval );
+
+    [propget, id(0x6002000e)]
+    HRESULT InstallationBehavior( [out, retval] IInstallationBehavior **retval );
+
+    [propget, id(0x6002000f)]
+    HRESULT IsBeta( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020010)]
+    HRESULT IsDownloaded( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020011)]
+    HRESULT IsHidden( [out, retval] VARIANT_BOOL *retval );
+
+    [propput, id(0x60020011)]
+    HRESULT IsHidden( [in] VARIANT_BOOL value );
+
+    [propget, id(0x60020012)]
+    HRESULT IsInstalled( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020013)]
+    HRESULT IsMandatory( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020014)]
+    HRESULT IsUninstallable( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020015)]
+    HRESULT Languages( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x60020016)]
+    HRESULT LastDeploymentChangeTime( [out, retval] DATE *retval );
+
+    [propget, id(0x60020017)]
+    HRESULT MaxDownloadSize( [out, retval] DECIMAL *retval );
+
+    [propget, id(0x60020018)]
+    HRESULT MinDownloadSize( [out, retval] DECIMAL *retval );
+
+    [propget, id(0x60020019)]
+    HRESULT MoreInfoUrls( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x6002001a)]
+    HRESULT MsrcSeverity( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002001b)]
+    HRESULT RecommendedCpuSpeed( [out, retval] LONG *retval );
+
+    [propget, id(0x6002001c)]
+    HRESULT RecommendedHardDiskSpace( [out, retval] LONG *retval );
+
+    [propget, id(0x6002001d)]
+    HRESULT RecommendedMemory( [out, retval] LONG *retval );
+
+    [propget, id(0x6002001e)]
+    HRESULT ReleaseNotes( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002001f)]
+    HRESULT SecurityBulletinIDs( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x60020021)]
+    HRESULT SupersededUpdateIDs( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x60020022)]
+    HRESULT SupportUrl( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020023)]
+    HRESULT Type( [out, retval] UpdateType *retval );
+
+    [propget, id(0x60020024)]
+    HRESULT UninstallationNotes( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020025)]
+    HRESULT UninstallationBehavior( [out, retval] IInstallationBehavior **retval );
+
+    [propget, id(0x60020026)]
+    HRESULT UninstallationSteps( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x60020028)]
+    HRESULT KBArticleIDs( [out, retval] IStringCollection **retval );
+
+    [id(0x60020027)]
+    HRESULT AcceptEula();
+
+    [propget, id(0x60020029)]
+    HRESULT DeploymentAction( [out, retval] DeploymentAction *retval );
+
+    [id(0x6002002a)]
+    HRESULT CopyFromCache( [in, ref] BSTR path,
+                           [in] VARIANT_BOOL toExtractCabFiles );
+
+    [propget, id(0x6002002b)]
+    HRESULT DownloadPriority( [out, retval] DownloadPriority *retval );
+
+    [propget, id(0x6002002c)]
+    HRESULT DownloadContents( [out, retval] IUpdateDownloadContentCollection **retval );
+}
+
+[
+
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(07f7438c-7709-4ca5-b518-91279288134e),
+    pointer_default(unique),
+    hidden
+]
+interface IUpdateCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [out, retval] IUpdate **retval );
+
+    [propput, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [in] IUpdate *value );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT ReadOnly( [out, retval] VARIANT_BOOL *retval );
+
+    [id(0x60020003)]
+    HRESULT Add( [in] IUpdate *value,
+                 [out, retval] LONG *retval );
+
+    [id(0x60020004)]
+    HRESULT Clear();
+
+    [id(0x60020005)]
+    HRESULT Copy( [out, retval] IUpdateCollection **retval );
+
+    [id(0x60020006)]
+    HRESULT Insert( [in] LONG index,
+                [in] IUpdate *value );
+
+    [id(0x60020007)]
+    HRESULT RemoveAt( [in] LONG index );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(7366ea16-7a1a-4ea2-b042-973d3e9cd99b),
+    pointer_default(unique),
+]
+interface ISearchJob : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT AsyncState( [out, retval] VARIANT *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT IsCompleted( [out, retval] VARIANT_BOOL *retval );
+
+    [id(0x60020003)]
+    HRESULT CleanUp();
+
+    [id(0x60020004)]
+    HRESULT RequestAbort();
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(d40cff62-e08c-4498-941a-01e25f0fd33c),
+    pointer_default(unique),
+]
+interface ISearchResult : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT RootCategories( [out, retval] ICategoryCollection **retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Updates( [out, retval] IUpdateCollection **retval );
+
+    [propget, id(0x60020004)]
+    HRESULT Warnings( [out, retval] IUpdateExceptionCollection **retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(be56a644-af0e-4e0e-a311-c1d8e695cbff),
+    pointer_default(unique),
+]
+interface IUpdateHistoryEntry : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT Operation( [out, retval] UpdateOperation *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT Date( [out, retval] DATE *retval );
+
+    [propget, id(0x60020005)]
+    HRESULT UpdateIdentity( [out, retval] IUpdateIdentity **retval );
+
+    [propget, id(0x60020006)]
+    HRESULT Title( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020007)]
+    HRESULT Description( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020008)]
+    HRESULT UnmappedResultCode( [out, retval] LONG *retval );
+
+    [propget, id(0x60020009)]
+    HRESULT ClientApplicationID( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002000a)]
+    HRESULT ServerSelection( [out, retval] ServerSelection *retval );
+
+    [propget, id(0x6002000b)]
+    HRESULT ServiceID( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002000c)]
+    HRESULT UninstallationSteps( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x6002000d)]
+    HRESULT UninstallationNotes( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002000e)]
+    HRESULT SupportUrl( [out, retval] BSTR *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(a7f04f3c-a290-435b-aadf-a116c3357a5c),
+    pointer_default(unique),
+]
+interface IUpdateHistoryEntryCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [out, retval] IUpdateHistoryEntry **retval );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+}
+
+[
+    object,
     uuid(8f45abf1-f9ae-4b95-a933-f0f66e5056ea),
     oleautomation,
     dual,
@@ -206,6 +932,113 @@
 
 [
     object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(bf99af76-b575-42ad-8aa4-33cbb5477af1),
+    pointer_default(unique),
+]
+interface IUpdateDownloadResult : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(d31a5bac-f719-4178-9dbb-5e2cb47fd18a),
+    pointer_default(unique),
+]
+interface IDownloadProgress : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT CurrentUpdateBytesDownloaded( [out, retval] DECIMAL *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT CurrentUpdateBytesToDownload( [out, retval] DECIMAL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT CurrentUpdateIndex( [out, retval] LONG *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT PercentComplete( [out, retval] LONG *retval );
+
+    [propget, id(0x60020005)]
+    HRESULT TotalBytesDownloaded( [out, retval] DECIMAL *retval );
+
+    [propget, id(0x60020006)]
+    HRESULT TotalBytesToDownload( [out, retval] DECIMAL *retval );
+
+    [id(0x60020007)]
+    HRESULT GetUpdateResult( [in] LONG updateIndex,
+                             [out, retval] IUpdateDownloadResult **retval );
+
+
+    [propget, id(0x60020008)]
+    HRESULT CurrentUpdateDownloadPhase( [out, retval] DownloadPhase *retval );
+
+    [propget, id(0x60020009)]
+    HRESULT CurrentUpdatePercentComplete( [out, retval] LONG *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(c574de85-7358-43f6-aae8-8697e62d8ba7),
+    pointer_default(unique),
+]
+interface IDownloadJob : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT AsyncState( [out, retval] VARIANT *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT IsCompleted( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Updates( [out, retval] IUpdateCollection **retval );
+
+    [id(0x60020004)]
+    HRESULT CleanUp();
+
+    [id(0x60020005)]
+    HRESULT GetProgress( [out, retval] IDownloadProgress **retval );
+
+    [id(0x60020006)]
+    HRESULT RequestAbort();
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(daa4fdd0-4727-4dbe-a1e7-745dca317144),
+    pointer_default(unique),
+]
+interface IDownloadResult : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+
+    [id(0x60020003)]
+    HRESULT GetUpdateResult( [in] LONG updateIndex,
+                             [out, retval] IUpdateDownloadResult **retval );
+}
+
+[
+    object,
     uuid(68f1c6f9-7ecc-4666-a464-247fe12496c3),
     oleautomation,
     dual,
@@ -263,6 +1096,103 @@
 
 [
     object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(d940f0f8-3cbb-4fd0-993f-471e7f2328ad),
+    pointer_default(unique),
+]
+interface IUpdateInstallationResult : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT RebootRequired( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(345c8244-43a3-4e32-a368-65f073b76f36),
+    pointer_default(unique),
+]
+interface IInstallationProgress : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT CurrentUpdateIndex( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT CurrentUpdatePercentComplete( [out, retval] LONG *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT PercentComplete( [out, retval] LONG *retval );
+
+    [id(0x60020004)]
+    HRESULT GetUpdateResult( [in] LONG updateIndex,
+                             [out, retval] IUpdateInstallationResult **retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(5c209f0b-bad5-432a-9556-4699bed2638a),
+    pointer_default(unique),
+]
+interface IInstallationJob : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT AsyncState( [out, retval] VARIANT *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT IsCompleted( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Updates( [out, retval] IUpdateCollection **retval );
+
+    [id(0x60020004)]
+    HRESULT CleanUp();
+
+    [id(0x60020005)]
+    HRESULT GetProgress( [out, retval] IInstallationProgress **retval );
+
+    [id(0x60020006)]
+    HRESULT RequestAbort();
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(a43c56d6-7451-48d4-af96-b6cd2d0d9b7a),
+    pointer_default(unique),
+]
+interface IInstallationResult : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT RebootRequired( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+
+    [id(0x60020004)]
+    HRESULT GetUpdateResult( [in] LONG updateIndex,
+                             [out, retval] IUpdateInstallationResult **retval );
+}
+
+[
+    object,
     uuid(7b929c68-ccdc-4226-96b1-8724600b54c2),
     oleautomation,
     dual,