312 lines
8.1 KiB
C
312 lines
8.1 KiB
C
|
//=======================================================================
|
||
|
//
|
||
|
// Copyright (c) 2000 Microsoft Corporation. All Rights Reserved.
|
||
|
//
|
||
|
// File: iuengine.h
|
||
|
//
|
||
|
// Description:
|
||
|
//
|
||
|
// Common include file for IUEngine DLL
|
||
|
//
|
||
|
//=======================================================================
|
||
|
|
||
|
#ifndef __IUENGINE_H_
|
||
|
#define __IUENGINE_H_
|
||
|
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <tchar.h>
|
||
|
#include <ole2.h>
|
||
|
#include "..\inc\iu.h"
|
||
|
#include <logging.h>
|
||
|
#include <shlwapi.h>
|
||
|
#include <iucommon.h>
|
||
|
#include <osdet.h>
|
||
|
#include <UrlAgent.h>
|
||
|
|
||
|
// #define __IUENGINE_USES_ATL_
|
||
|
#if defined(__IUENGINE_USES_ATL_)
|
||
|
#include <atlbase.h>
|
||
|
#define USES_IU_CONVERSION USES_CONVERSION
|
||
|
#else
|
||
|
#include <MemUtil.h>
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#include "schemakeys.h"
|
||
|
|
||
|
#include <mistsafe.h>
|
||
|
#include <wusafefn.h>
|
||
|
|
||
|
|
||
|
//***********************************************************************
|
||
|
//
|
||
|
// The following constants are defined in engmain.cpp
|
||
|
//
|
||
|
//***********************************************************************
|
||
|
|
||
|
|
||
|
/**
|
||
|
* the following two groups of constants can be used to construct
|
||
|
* lMode parameter of the following APIs:
|
||
|
* Download()
|
||
|
* DownloadAsync()
|
||
|
* Install()
|
||
|
* InstallAsync()
|
||
|
*
|
||
|
* Obviousely, you can only pick one from each group to make up
|
||
|
* lMode parameter.
|
||
|
*
|
||
|
*/
|
||
|
extern const LONG UPDATE_NOTIFICATION_DEFAULT;
|
||
|
extern const LONG UPDATE_NOTIFICATION_ANYPROGRESS;
|
||
|
extern const LONG UPDATE_NOTIFICATION_COMPLETEONLY;
|
||
|
extern const LONG UPDATE_NOTIFICATION_1PCT;
|
||
|
extern const LONG UPDATE_NOTIFICATION_5PCT;
|
||
|
extern const LONG UPDATE_NOTIFICATION_10PCT;
|
||
|
|
||
|
/**
|
||
|
* constant can also be used for SetOperationMode() and GetOperationMode()
|
||
|
*/
|
||
|
extern const LONG UPDATE_MODE_THROTTLE;
|
||
|
|
||
|
/**
|
||
|
* constant can be used by Download() and DownloadAsync(), which will
|
||
|
* tell these API's to use Corporate directory structure for destination folder.
|
||
|
*/
|
||
|
extern const LONG UPDATE_CORPORATE_MODE;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* constant can be used by Install() and InstallAsync(). Will disable all
|
||
|
* internet related features
|
||
|
*/
|
||
|
extern const LONG UPDATE_OFFLINE_MODE;
|
||
|
|
||
|
/**
|
||
|
* constants for SetOperationMode() API
|
||
|
*/
|
||
|
extern const LONG UPDATE_COMMAND_PAUSE;
|
||
|
extern const LONG UPDATE_COMMAND_RESUME;
|
||
|
extern const LONG UPDATE_COMMAND_CANCEL;
|
||
|
|
||
|
/**
|
||
|
* constants for GetOperationMode() API
|
||
|
*/
|
||
|
extern const LONG UPDATE_MODE_PAUSED;
|
||
|
extern const LONG UPDATE_MODE_RUNNING;
|
||
|
extern const LONG UPDATE_MODE_NOTEXISTS;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* constants for SetProperty() and GetProperty() API
|
||
|
*/
|
||
|
extern const LONG UPDATE_PROP_USECOMPRESSION;
|
||
|
extern const LONG UPDATE_PROP_OFFLINEMODE;
|
||
|
|
||
|
/**
|
||
|
* constants for BrowseForFolder() API
|
||
|
*
|
||
|
* IUBROWSE_WRITE_ACCESS - validate write access on selected folder
|
||
|
* IUBROWSE_AFFECT_UI - write-access validation affect OK button enable/disable
|
||
|
* IUBROWSE_NOBROWSE - do not show browse folder dialog box. validate path passed-in only
|
||
|
*
|
||
|
* default:
|
||
|
* pop up browse folder dialog box, not doing any write-access validation
|
||
|
*
|
||
|
*/
|
||
|
extern const LONG IUBROWSE_WRITE_ACCESS;
|
||
|
extern const LONG IUBROWSE_AFFECT_UI;
|
||
|
extern const LONG IUBROWSE_NOBROWSE;
|
||
|
|
||
|
// constants for historical speed registry
|
||
|
const TCHAR REGKEY_IUCTL[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\IUControl");
|
||
|
const TCHAR REGVAL_HISTORICALSPEED[] = _T("HistoricalSpeed"); // in bytes/sec
|
||
|
const TCHAR REGVAL_TIMEELAPSED[] = _T("TimeElapsed"); // in seconds
|
||
|
|
||
|
// constant for default downloads folder name
|
||
|
const TCHAR IU_WUTEMP[] = _T("WUTemp");
|
||
|
|
||
|
//
|
||
|
// Globals for the IUEngine
|
||
|
|
||
|
extern LONG g_lThreadCounter;
|
||
|
extern HANDLE g_evtNeedToQuit;
|
||
|
extern CUrlAgent *g_pUrlAgent;
|
||
|
|
||
|
typedef struct IUOPERATIONINFO
|
||
|
{
|
||
|
TCHAR szOperationUUID[64];
|
||
|
LONG lUpdateMask;
|
||
|
BSTR bstrOperationResult;
|
||
|
IUOPERATIONINFO *pNext;
|
||
|
} IUOPERATIONINFO, *PIUOPERATIONINFO;
|
||
|
class COperationMgr
|
||
|
{
|
||
|
public:
|
||
|
COperationMgr();
|
||
|
~COperationMgr();
|
||
|
|
||
|
BOOL AddOperation(LPCTSTR pszOperationID, LONG lUpdateMask);
|
||
|
BOOL RemoveOperation(LPCTSTR pszOperationID);
|
||
|
BOOL FindOperation(LPCTSTR pszOperationID, PLONG plUpdateMask, BSTR *pbstrOperationResult);
|
||
|
BOOL UpdateOperation(LPCTSTR pszOperationID, LONG lUpdateMask, BSTR bstrOperationResult);
|
||
|
|
||
|
private:
|
||
|
PIUOPERATIONINFO m_pOperationInfoList;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// CEngUpdate class used to export apartment safe instances of the update class to WU clients (iuctl, AU, DU, CDM)
|
||
|
//
|
||
|
|
||
|
class CEngUpdate
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
CEngUpdate();
|
||
|
~CEngUpdate();
|
||
|
|
||
|
public:
|
||
|
HRESULT WINAPI GetSystemSpec(BSTR bstrXmlClasses, DWORD dwFlags, BSTR *pbstrXmlDetectionResult);
|
||
|
|
||
|
HRESULT WINAPI GetManifest(BSTR bstrXmlClientInfo, BSTR bstrXmlSystemSpec, BSTR bstrXmlQuery, DWORD dwFlags, BSTR *pbstrXmlCatalog);
|
||
|
|
||
|
HRESULT WINAPI Detect(BSTR bstrXmlCatalog, DWORD dwFlags, BSTR *pbstrXmlItems);
|
||
|
|
||
|
HRESULT WINAPI Download(BSTR bstrXmlClientInfo, BSTR bstrXmlCatalog, BSTR bstrDestinationFolder, LONG lMode,
|
||
|
IUnknown *punkProgressListener, HWND hWnd, BSTR *pbstrXmlItems);
|
||
|
|
||
|
HRESULT WINAPI DownloadAsync(BSTR bstrXmlClientInfo, BSTR bstrXmlCatalog, BSTR bstrDestinationFolder, LONG lMode,
|
||
|
IUnknown *punkProgressListener, HWND hWnd, BSTR bstrUuidOperation, BSTR *pbstrUuidOperation);
|
||
|
|
||
|
HRESULT WINAPI Install(BSTR bstrXmlClientInfo,
|
||
|
BSTR bstrXmlCatalog,
|
||
|
BSTR bstrXmlDownloadedItems,
|
||
|
LONG lMode,
|
||
|
IUnknown *punkProgressListener,
|
||
|
HWND hWnd,
|
||
|
BSTR *pbstrXmlItems);
|
||
|
|
||
|
HRESULT WINAPI InstallAsync(BSTR bstrXmlClientInfo,
|
||
|
BSTR bstrXmlCatalog,
|
||
|
BSTR bstrXmlDownloadedItems,
|
||
|
LONG lMode,
|
||
|
IUnknown *punkProgressListener,
|
||
|
HWND hWnd,
|
||
|
BSTR bstrUuidOperation,
|
||
|
BSTR *pbstrUuidOperation);
|
||
|
|
||
|
HRESULT WINAPI SetOperationMode(BSTR bstrUuidOperation, LONG lMode);
|
||
|
|
||
|
HRESULT WINAPI GetOperationMode(BSTR bstrUuidOperation, LONG* plMode);
|
||
|
|
||
|
HRESULT WINAPI GetHistory(
|
||
|
BSTR bstrDateTimeFrom,
|
||
|
BSTR bstrDateTimeTo,
|
||
|
BSTR bstrClient,
|
||
|
BSTR bstrPath,
|
||
|
BSTR* pbstrLog);
|
||
|
|
||
|
HRESULT WINAPI BrowseForFolder(BSTR bstrStartFolder,
|
||
|
LONG flag,
|
||
|
BSTR* pbstrFolder);
|
||
|
|
||
|
HRESULT WINAPI RebootMachine();
|
||
|
|
||
|
private:
|
||
|
void WINAPI ShutdownInstanceThreads(); // called in dtor to shut down any outstanding threads
|
||
|
|
||
|
public:
|
||
|
LONG m_lThreadCounter;
|
||
|
HANDLE m_evtNeedToQuit;
|
||
|
BOOL m_fOfflineMode;
|
||
|
COperationMgr m_OperationMgr;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// CDM Internal Exports (called by IUCDM stub cdm.dll)
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// We use a separate Real(tm) global for CDM to hold an instance of the CEngUpdate class,
|
||
|
// since it is never multiple instanced.
|
||
|
//
|
||
|
extern CEngUpdate* g_pCDMEngUpdate;
|
||
|
|
||
|
VOID WINAPI InternalDetFilesDownloaded(
|
||
|
IN HANDLE hConnection
|
||
|
);
|
||
|
|
||
|
BOOL InternalDownloadGetUpdatedFiles(
|
||
|
IN PDOWNLOADINFOWIN98 pDownloadInfoWin98,
|
||
|
IN OUT LPTSTR lpDownloadPath,
|
||
|
IN UINT uSize
|
||
|
);
|
||
|
|
||
|
BOOL WINAPI InternalDownloadUpdatedFiles(
|
||
|
IN HANDLE hConnection,
|
||
|
IN HWND hwnd,
|
||
|
IN PDOWNLOADINFO pDownloadInfo,
|
||
|
OUT LPWSTR lpDownloadPath,
|
||
|
IN UINT uSize,
|
||
|
OUT PUINT puRequiredSize
|
||
|
);
|
||
|
|
||
|
|
||
|
BOOL WINAPI InternalFindMatchingDriver(
|
||
|
IN HANDLE hConnection,
|
||
|
IN PDOWNLOADINFO pDownloadInfo,
|
||
|
OUT PWUDRIVERINFO pWuDriverInfo
|
||
|
);
|
||
|
|
||
|
VOID WINAPI InternalLogDriverNotFound(
|
||
|
IN HANDLE hConnection,
|
||
|
IN LPCWSTR lpDeviceInstanceID,
|
||
|
IN DWORD dwFlags
|
||
|
);
|
||
|
|
||
|
int WINAPI InternalQueryDetectionFiles(
|
||
|
IN HANDLE hConnection,
|
||
|
IN void* pCallbackParam,
|
||
|
IN PFN_QueryDetectionFilesCallback pCallback
|
||
|
);
|
||
|
|
||
|
void InternalSetGlobalOfflineFlag(
|
||
|
IN BOOL fOfflineMode
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// GetSystemSpec functionality exported for use by CDM
|
||
|
//
|
||
|
|
||
|
class CXmlSystemSpec;
|
||
|
|
||
|
HRESULT AddComputerSystemClass(CXmlSystemSpec& xmlSpec);
|
||
|
|
||
|
HRESULT AddRegKeyClass(CXmlSystemSpec& xmlSpec);
|
||
|
|
||
|
HRESULT AddPlatformClass(CXmlSystemSpec& xmlSpec, IU_PLATFORM_INFO iuPlatformInfo);
|
||
|
|
||
|
HRESULT AddLocaleClass(CXmlSystemSpec& xmlSpec, BOOL fIsUser);
|
||
|
|
||
|
HRESULT AddDevicesClass(CXmlSystemSpec& xmlSpec, IU_PLATFORM_INFO iuPlatformInfo, BOOL fIsSysSpecCall);
|
||
|
|
||
|
//
|
||
|
// Misc. functionality
|
||
|
//
|
||
|
|
||
|
extern LONG g_lDoOnceOnLoadGuard;
|
||
|
|
||
|
void WINAPI DeleteExpiredDownloadFolders();
|
||
|
|
||
|
HRESULT WINAPI CreateGlobalCDMEngUpdateInstance();
|
||
|
|
||
|
HRESULT WINAPI DeleteGlobalCDMEngUpdateInstance();
|
||
|
|
||
|
void WINAPI ShutdownThreads(); // called by UnlockEnginge -- maintains backwards CDM compatibility
|
||
|
|
||
|
void WINAPI ShutdownGlobalThreads(); // called to shut down any outstanding global threads
|
||
|
|
||
|
#endif // __IUENGINE_H_
|