//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 2000 // // File: wuaueng.h // //-------------------------------------------------------------------------- #pragma once #include #include #include #include #include #include #include //#include #include #include //#include #include #include "wuaulib.h" #include "AUSessions.h" #include #define AUSCHEDINSTALLDAY_MIN 0 #define AUSCHEDINSTALLDAY_MAX 7 #define AUSCHEDINSTALLTIME_MIN 0 #define AUSCHEDINSTALLTIME_MAX 23 typedef struct tagWORKER_THREAD_INIT_DATA { UINT uFirstMsg; BOOL fWaitB4Detect; DWORD dwWaitB4Detect; } WORKER_THREAD_INIT_DATA; #define E_NOCONNECTION HRESULT_FROM_WIN32(ERROR_CONNECTION_UNAVAIL) HRESULT SelfUpdate(void); HRESULT CheckForUpdatedComponents(BOOL *pfInstalledWUAUENG); HRESULT InstallFromCIF(LPCTSTR pstrCifCab, LPCTSTR pstrDownloadDir, LPCTSTR pstrWhich); ///////////////////////////////////////////////////////// // Status ping information ///////////////////////////////////////////////////////// class PingStatus: public CUrlLog //group together status ping functions { public: inline PingStatus(void):CUrlLog(_T("au"), NULL, NULL){} void ReadLiveServerUrlFromIdent(void); void PingDetectionSuccess( BOOL fOnline, UINT cItems); void PingDetectionFailure( BOOL fOnline, DWORD dwError, LPCTSTR ptszMessage = NULL); void PingDownload( BOOL fOnline, URLLOGSTATUS status, DWORD dwError, LPCTSTR ptszItemID = NULL, LPCTSTR ptszDeviceID = NULL, LPCTSTR ptszMessage = NULL); void PingSelfUpdate( BOOL fOnline, URLLOGSTATUS status, DWORD dwError); void PingDeclinedItem( BOOL fOnline, URLLOGACTIVITY activity, LPCTSTR ptszItemID); private: //---------------------------------------------------------------------- // // private function to gather common info and perform ping // //---------------------------------------------------------------------- void _Ping( BOOL fOnline, URLLOGACTIVITY activity, URLLOGSTATUS status, DWORD dwError, LPCTSTR ptszMessage, LPCTSTR ptszItemID, LPCTSTR ptszDeviceID); }; #define IDOWNLOAD_COMPLETE_EVT 0 #define IDOWNLOAD_TRANSIENT_ERROR_EVT 1 #define IDOWNLOAD_DOWNLOAD_IN_PROGRESS 2 #define IDOWNLOAD_SERVICE_FINISH 3 #define IDOWNLOAD_SERVICE_DISABLED 4 #define IDOWNLOAD_DOWNLOAD_CANCELED 5 #define IDOWNLOAD_MESSAGE 6 #define CNUM_DOWNLOAD_EVT 6 extern HANDLE ghServiceFinished; extern HANDLE ghEngineState; extern HANDLE ghServiceDisabled; extern HANDLE ghValidateCatalog; extern HANDLE ghNotifyClient; extern HANDLE ghWorkerThreadMsgQueueCreation; extern CLIENT_NOTIFY_DATA gClientNotifyData; extern DWORD gdwWorkerThreadId; extern SESSION_STATUS gAdminSessions; extern PingStatus gPingStatus; typedef struct _ENGINE_EVENTS { public: void CloseEvents(void) { //Don't close the ServiceFinish handle and EngineState events m_grEvents[IDOWNLOAD_SERVICE_FINISH] = NULL; m_grEvents[IDOWNLOAD_SERVICE_DISABLED] = NULL; for ( int i = 0; i < CNUM_DOWNLOAD_EVT; i++) { SafeCloseHandleNULL(m_grEvents[i]); } } BOOL CreateEvents(void) { BOOL fRet = TRUE; ZeroMemory(m_grEvents, sizeof(m_grEvents)); m_grEvents[IDOWNLOAD_SERVICE_FINISH] = ghServiceFinished; m_grEvents[IDOWNLOAD_SERVICE_DISABLED] = ghServiceDisabled; for ( int i = 0; i < CNUM_DOWNLOAD_EVT; i++) { if ( IDOWNLOAD_SERVICE_FINISH != i && IDOWNLOAD_SERVICE_DISABLED != i ) { if ( NULL == (m_grEvents[i] = CreateEvent(NULL, FALSE, FALSE, NULL)) ) { CloseEvents(); fRet = FALSE; break; } } } return fRet; } void SetEvent(ULONG iEvent) { if ( (iEvent < CNUM_DOWNLOAD_EVT) && (NULL != m_grEvents[iEvent]) ) { ::SetEvent(m_grEvents[iEvent]); } } ULONG cEvents(void) { return CNUM_DOWNLOAD_EVT; } CONST HANDLE * grEventHandles(void) { return m_grEvents; } private: HANDLE m_grEvents[CNUM_DOWNLOAD_EVT]; } ENGINE_EVENTS; //defined in wuaueng.cpp HRESULT HrCreateNewCatalog(void); void CancelDownload(void); void ResumeDownloadIfNeccesary(void); HRESULT UpdateProc(WORKER_THREAD_INIT_DATA &initData); DWORD RandomWaitTimeBeforeDetect(); //defined in service.cpp BOOL FDownloadIsPaused();