private.h
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 21k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #define INC_OLE2
  2. #define _SHDOCVW_
  3. #ifdef UNICODE
  4. #define POST_IE5_BETA
  5. #include <w95wraps.h>
  6. #endif
  7. #include <windows.h>
  8. #include <windowsx.h>
  9. #include <ccstock.h>
  10. #include <ole2.h>
  11. #include <ole2ver.h>
  12. #include <oleauto.h>
  13. #include <docobj.h>
  14. #include <shlwapi.h>
  15. #include <wininet.h>   // INTERNET_MAX_URL_LENGTH.  Must be before shlobjp.h!
  16. #include <winineti.h>
  17. #include <shlobj.h>
  18. #include <shlobjp.h>
  19. //#include <crtfree.h>
  20. #include <inetsdk.h>
  21. #include <intshcut.h>
  22. #include <mshtml.h>
  23. #include <notftn.h>
  24. #include <webcheck.h>
  25. #include <exdisp.h>
  26. #include <inetreg.h>
  27. #include <advpub.h>
  28. #include <htiframe.h>
  29. #include <shsemip.h>        // in ccshellinc
  30. #include <shellp.h>
  31. #include <lmcons.h>         // for UNLEN/PWLEN
  32. #include <ipexport.h>       // for ping
  33. #include <icmpapi.h>        // for ping
  34. #include <mobsync.h>
  35. #include <mobsyncp.h>
  36. #undef MAX_STATUS   // goofy
  37. #include "debug.h"
  38. #include "resource.h"
  39. #include "rsrchdr.h"
  40. #include "pstore.h"
  41. #include <shdocvw.h> // to get SHRestricted2*
  42. #include <dwnnot.h> // IDownloadNotify
  43. #pragma warning(3:4701)   // local may be used w/o init
  44. #pragma warning(3:4702)   // Unreachable code
  45. #pragma warning(3:4705)   // Statement has no effect
  46. #pragma warning(3:4706)   // assignment w/i conditional expression
  47. #pragma warning(3:4709)   // command operator w/o index expression
  48. // How user of CUrlDownload receives notifications from it.
  49. class CUrlDownloadSink
  50. {
  51. public:
  52.     virtual HRESULT OnDownloadComplete(UINT iID, int iError) = 0;
  53.     virtual HRESULT OnAuthenticate(HWND *phwnd, LPWSTR *ppszUsername, LPWSTR *ppszPassword)
  54.                         { return E_NOTIMPL; }
  55.     virtual HRESULT OnClientPull(UINT iID, LPCWSTR pwszOldURL, LPCWSTR pwszNewURL)
  56.                         { return S_OK; }
  57.     virtual HRESULT OnOleCommandTargetExec(const GUID *pguidCmdGroup, DWORD nCmdID,
  58.                                 DWORD nCmdexecopt, VARIANTARG *pvarargIn, 
  59.                                 VARIANTARG *pvarargOut)
  60.                         { return OLECMDERR_E_NOTSUPPORTED; }
  61.     // returns free threaded callback interface
  62.     // If you use this, make your implementation of IDownloadNotify fast
  63.     virtual HRESULT GetDownloadNotify(IDownloadNotify **ppOut)
  64.                         { return E_NOTIMPL; }
  65. };
  66. class CUrlDownload;
  67. #include "filetime.h"
  68. #include "offline.h"
  69. #include "utils.h"
  70. #include "delagent.h"
  71. #include "cdfagent.h"
  72. #include "webcrawl.h"
  73. #include "trkcache.h"
  74. #include "postagnt.h"
  75. #include "cdlagent.h"
  76. // Note: dialmon.h changes winver to 0x400
  77. #include "dialmon.h"
  78. #ifndef GUIDSTR_MAX
  79. // GUIDSTR_MAX is 39 and includes the terminating zero.
  80. // == Copied from OLE source code =================================
  81. // format for string form of GUID is (leading identifier ????)
  82. // ????{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}
  83. #define GUIDSTR_MAX (1+ 8 + 1 + 4 + 1 + 4 + 1 + 4 + 1 + 12 + 1 + 1)
  84. // ================================================================
  85. #endif
  86. // Trace and debug flags
  87. #define TF_WEBCHECKCORE 0x00001000
  88. //#define TF_SCHEDULER    0x00002000
  89. #define TF_WEBCRAWL     0x00004000
  90. #define TF_SEPROX       0x00008000
  91. #define TF_CDFAGENT     0x00010000
  92. #define TF_STRINGLIST   0x00020000
  93. #define TF_URLDOWNLOAD  0x00040000
  94. #define TF_DOWNLD       0x00080000
  95. #define TF_DIALMON      0x00100000
  96. #define TF_MAILAGENT    0x00200000
  97. //#define TF_TRAYAGENT    0x00400000
  98. #define TF_SUBSFOLDER   0x00800000
  99. #define TF_MEMORY       0x01000000
  100. #define TF_UPDATEAGENT  0x02000000
  101. #define TF_POSTAGENT    0x04000000
  102. #define TF_DELAGENT     0x08000000
  103. #define TF_TRACKCACHE   0x10000000
  104. #define TF_SYNCMGR      0x20000000
  105. #define TF_THROTTLER    0x40000000
  106. #define TF_ADMIN        0x80000000  //  Admin and IE upgrade
  107. #define PSM_QUERYSIBLINGS_WPARAM_RESCHEDULE 0XF000
  108. #undef DBG
  109. #define DBG(sz)             TraceMsg(TF_THISMODULE, sz)
  110. #define DBG2(sz1, sz2)      TraceMsg(TF_THISMODULE, sz1, sz2)
  111. #define DBG_WARN(sz)        TraceMsg(TF_WARNING, sz)
  112. #define DBG_WARN2(sz1, sz2) TraceMsg(TF_WARNING, sz1, sz2)
  113. #ifdef DEBUG
  114. #define DBGASSERT(expr,sz)  do { if (!(expr)) TraceMsg(TF_WARNING, (sz)); } while (0)
  115. #define DBGIID(sz,iid)      DumpIID(sz,iid)
  116. #else
  117. #define DBGASSERT(expr,sz)  ((void)0)
  118. #define DBGIID(sz,iid)      ((void)0)
  119. #endif
  120. // shorthand
  121. #ifndef SAFERELEASE
  122. #define SAFERELEASE(p) if ((p) != NULL) { (p)->Release(); (p) = NULL; } else
  123. #endif
  124. #ifndef ATOMICRELEASE
  125. #define ATOMICRELEASET(p,type) { type* punkT=p; p=NULL; punkT->Release(); }
  126. #define ATOMICRELEASE(p) ATOMICRELEASET(p, IUnknown)
  127. #endif
  128. #ifndef SAFEFREEBSTR
  129. #define SAFEFREEBSTR(p) if ((p) != NULL) { SysFreeString(p); (p) = NULL; } else
  130. #endif
  131. #ifndef SAFEFREEOLESTR
  132. #define SAFEFREEOLESTR(p) if ((p) != NULL) { CoTaskMemFree(p); (p) = NULL; } else
  133. #endif
  134. #ifndef SAFELOCALFREE
  135. #define SAFELOCALFREE(p) if ((p) != NULL) { MemFree(p); (p) = NULL; } else
  136. #endif
  137. #ifndef SAFEDELETE
  138. #define SAFEDELETE(p) if ((p) != NULL) { delete (p); (p) = NULL; } else
  139. #endif
  140. // MAX_WEBCRAWL_LEVELS is the max crawl depth for site subscriptions
  141. // MAX_CDF_CRAWL_LEVELS is the max crawl depth for the "LEVEL" attrib value for CDFs
  142. #define MAX_WEBCRAWL_LEVELS 3
  143. #define MAX_CDF_CRAWL_LEVELS 3
  144. #define MY_MAX_CACHE_ENTRY_INFO 6144
  145. //
  146. // Define the location of the webcheck registry key.
  147. //
  148. #define WEBCHECK_REGKEY TEXT("Software\Microsoft\Windows\CurrentVersion\Webcheck")
  149. #define WEBCHECK_REGKEY_NOTF TEXT("Software\Microsoft\Windows\CurrentVersion\Webcheck\Notification Handlers")
  150. #define WEBCHECK_REGKEY_STORE (WEBCHECK_REGKEY TEXT("\Store.1"))
  151. //
  152. // Registry Keys
  153. //
  154. extern const TCHAR c_szRegKey[];                // registry key for webcheck stuff
  155. extern const TCHAR c_szRegKeyUsernames[];       // registry key for webcheck stuff
  156. extern const TCHAR c_szRegKeyPasswords[];       // registry key for webcheck stuff
  157. extern const TCHAR c_szRegKeyStore[];
  158. extern const TCHAR c_szRegPathInternetSettings[];
  159. // extern const TCHAR c_szRegKeyRestrictions[];    // HKCUPolicies...InfodeliveryRestrictions
  160. // extern const TCHAR c_szRegKeyModifications[];   // HKCUPolicies...InfodeliveryModification
  161. // extern const TCHAR c_szRegKeyCompletedMods[];   // HKCUPolicies...InfodeliveryCompletedModifications
  162. //
  163. // Registry Values
  164. //
  165. extern const TCHAR c_szNoChannelLogging[];
  166. //
  167. // Globals
  168. //
  169. extern HINSTANCE    g_hInst;                // dll instance
  170. extern ULONG        g_cLock;                // outstanding locks
  171. extern ULONG        g_cObj;                 // outstanding objects
  172. extern BOOL         g_fIsWinNT;             // are we on winNT? Always initialized.
  173. extern BOOL         g_fIsWinNT5;            // are we on winNT5? Always initialized.
  174. extern const TCHAR c_szEnable[];            // enable unattended dialup
  175. extern const TCHAR  c_szStrEmpty[];
  176. inline ULONG DllLock()     { return ++g_cLock; }
  177. inline ULONG DllUnlock()   { return --g_cLock; }
  178. inline ULONG DllGetLock()  { return g_cLock; }
  179. inline ULONG DllAddRef()   { return ++g_cObj; }
  180. inline ULONG DllRelease()  { return --g_cObj; }
  181. inline ULONG DllGetRef()   { return g_cObj; }
  182. //
  183. // Subscription property names; webcheck.cpp
  184. //
  185. // Agent Start
  186. extern const WCHAR  c_szPropURL[];          // BSTR
  187. extern const WCHAR  c_szPropName[];         // BSTR; friendly name
  188. extern const WCHAR  c_szPropAgentFlags[];   // I4
  189. extern const WCHAR  c_szPropCrawlLevels[];  // I4; webcrawler
  190. extern const WCHAR  c_szPropCrawlFlags[];   // I4; webcrawler
  191. extern const WCHAR  c_szPropCrawlMaxSize[]; // I4; webcrawler (in KB)
  192. extern const WCHAR  c_szPropCrawlChangesOnly[];  // BOOL
  193. extern const WCHAR  c_szPropChangeCode[];   // I4 or CY
  194. extern const WCHAR  c_szPropEmailNotf[];    // BOOL;
  195. extern const WCHAR  c_szPropCrawlUsername[];  // BSTR
  196. extern const WCHAR  c_szPropCrawlLocalDest[]; // BSTR
  197. extern const WCHAR  c_szPropEnableShortcutGleam[]; // I4
  198. extern const WCHAR  c_szPropChannelFlags[];     // I4; channel agent specific flags
  199. extern const WCHAR  c_szPropChannel[];          // I4; indicates a channel
  200. extern const WCHAR  c_szPropDesktopComponent[]; // I4; indicates a desktop component
  201. // set by agents in Agent Start
  202. extern const WCHAR  c_szPropCrawlGroupID[];  // cache group ID
  203. extern const WCHAR  c_szPropCrawlNewGroupID[]; // ID for new (existing) cache group
  204. extern const WCHAR  c_szPropCrawlActualSize[];  // in KB
  205. extern const WCHAR  c_szPropActualProgressMax[]; // Progress Max at end of last update
  206. extern const WCHAR  c_szStartCookie[];      // The cookie of Start Notification.
  207. extern const WCHAR  c_szPropStatusCode[];       // SCODE
  208. extern const WCHAR  c_szPropStatusString[];     // BSTR (sentence)
  209. extern const WCHAR  c_szPropCompletionTime[];   // DATE
  210. extern const WCHAR  c_szPropPassword[];   // BSTR
  211. // End Report
  212. extern const WCHAR  c_szPropEmailURL[];         // BSTR
  213. extern const WCHAR  c_szPropEmailFlags[];       // I4
  214. extern const WCHAR  c_szPropEmailTitle[];       // BSTR
  215. extern const WCHAR  c_szPropEmailAbstract[];    // BSTR
  216. extern const WCHAR  c_szPropCharSet[];          // BSTR
  217. // Tray Agent Properties
  218. extern const WCHAR  c_szPropGuidsArr[];     // SAFEARRAY for a list of GUIDs
  219. // Initial cookie used in AGENT_INIT notification.
  220. extern const WCHAR  c_szInitCookie[];      // The cookie of Start Notification.
  221. // Tracking 
  222. extern const WCHAR  c_szTrackingCookie[];   // Channel identity 
  223. extern const WCHAR  c_szTrackingPostURL[];  // tracking post url
  224. extern const WCHAR  c_szPostingRetry[];     // 
  225. extern const WCHAR  c_szPostHeader[];       // specify encoding method of postdata
  226. extern const WCHAR  c_szPostPurgeTime[];    // DATE
  227. //
  228. // Mail agent flags for the c_szPropEmailFlags property
  229. //
  230. enum MAILAGENT_FLAGS {
  231.     MAILAGENT_FLAG_CUSTOM_MSG = 0x1
  232. };
  233. //
  234. // Mail functions
  235. //
  236. HRESULT SendEmailFromItem(ISubscriptionItem *pItem);
  237. HRESULT MimeOleEncodeStreamQP(IStream *pstmIn, IStream *pstmOut);
  238. void ReadDefaultSMTPServer(LPTSTR pszBuf, UINT cch);
  239. void ReadDefaultEmail(LPTSTR pszBuf, UINT cch);
  240. // utils.cpp
  241. interface IChannelMgrPriv;
  242. HRESULT GetChannelPath(LPCTSTR pszURL, LPTSTR pszPath, int cch, IChannelMgrPriv** ppIChannelMgrPriv);
  243. //
  244. // Timer id's for scheduler and dialmon
  245. //
  246. #define TIMER_ID_DIALMON_IDLE   2       // every minute while connected
  247. #define TIMER_ID_DIALMON_SEC    3       // every second for 30 seconds 
  248. #define TIMER_ID_DBL_CLICK      4       // did the user single or double click
  249. #define TIMER_ID_USER_IDLE      5       // used to detect user idle on system
  250. // Custom schedule dialog proc
  251. BOOL CALLBACK CustomDlg(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
  252. int SGMessageBox(HWND, UINT, UINT);
  253. //
  254. // Dialmon messages - send to scheduler window by various pieces of the system
  255. // to tell us when dialup related stuff happens
  256. //
  257. #define WM_DIALMON_FIRST        WM_USER+100
  258. #define WM_WINSOCK_ACTIVITY     WM_DIALMON_FIRST + 0
  259. #define WM_REFRESH_SETTINGS     WM_DIALMON_FIRST + 1
  260. #define WM_SET_CONNECTOID_NAME  WM_DIALMON_FIRST + 2
  261. #define WM_IEXPLORER_EXITING    WM_DIALMON_FIRST + 3
  262. // message used to report user mouse or kbd activity
  263. // Note: sage.vxd uses this value and we can't change it.
  264. #define WM_USER_ACTIVITY        WM_USER+5
  265. // message sent by loadwc requesting a dynaload of sens/lce.
  266. #define WM_LOAD_SENSLCE         WM_USER+200
  267. #define WM_IS_SENSLCE_LOADED    WM_USER+201
  268. //
  269. // Random subscription defaults
  270. //
  271. #define DEFAULTLEVEL    0
  272. #define DEFAULTFLAGS  (WEBCRAWL_GET_IMAGES | WEBCRAWL_LINKS_ELSEWHERE | WEBCRAWL_GET_CONTROLS)
  273. #define IsNativeAgent(CLSIDAGENT)       (((CLSIDAGENT) == CLSID_WebCrawlerAgent) || ((CLSIDAGENT) == CLSID_ChannelAgent))
  274. #define IS_VALID_SUBSCRIPTIONTYPE(st)   ((st == SUBSTYPE_URL) || (st == SUBSTYPE_CHANNEL) || (st == SUBSTYPE_DESKTOPCHANNEL) || (st == SUBSTYPE_DESKTOPURL))
  275. //
  276. // Useful functions
  277. //
  278. int MyOleStrToStrN(LPTSTR psz, int cchMultiByte, LPCOLESTR pwsz);
  279. int MyStrToOleStrN(LPOLESTR pwsz, int cchWideChar, LPCTSTR psz);
  280. void DumpIID(LPCSTR psz, REFIID riid);
  281. // String comparison routines ; assume 8-bit characters. Return 0 or nonzero.
  282. // Will work correctly if one or both strings are entirely 8-bit characters.
  283. int MyAsciiCmpW(LPCWSTR pwsz1, LPCWSTR pwsz2);
  284. int MyAsciiCmpNIW(LPCWSTR pwsz1, LPCWSTR pwsz2, int iLen);
  285. inline
  286.  int MyAsciiCmpNW(LPCWSTR pwsz1, LPCWSTR pwsz2, int iLen)
  287.  { return memcmp(pwsz1, pwsz2, iLen*sizeof(WCHAR)); }
  288. // Implementation in CDFagent.cpp
  289. HRESULT XMLScheduleElementToTaskTrigger(IXMLElement *pRootEle, TASK_TRIGGER *ptt);
  290. HRESULT ScheduleToTaskTrigger(TASK_TRIGGER *ptt, SYSTEMTIME *pstStartDate, SYSTEMTIME *pstEndDate,
  291.                               long lInterval, long lEarliest, long lLatest, int iZone=9999);
  292. // Admin related functions
  293. HRESULT ProcessInfodeliveryPolicies(void);
  294. #ifndef ARRAYSIZE
  295. #define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
  296. #endif
  297. //  IE 5 versions - sans notfmgr support
  298. HRESULT ReadDWORD       (ISubscriptionItem *pItem, LPCWSTR szName, DWORD *pdwRet);
  299. HRESULT ReadLONGLONG    (ISubscriptionItem *pItem, LPCWSTR szName, LONGLONG *pllRet);
  300. HRESULT ReadGUID        (ISubscriptionItem *pItem, LPCWSTR szName, GUID *);
  301. HRESULT ReadDATE        (ISubscriptionItem *pItem, LPCWSTR szName, DATE *dtVal);
  302. HRESULT ReadBool        (ISubscriptionItem *pItem, LPCWSTR szName, VARIANT_BOOL *pBoolRet);
  303. HRESULT ReadBSTR        (ISubscriptionItem *pItem, LPCWSTR szName, BSTR *bstrRet);
  304. HRESULT ReadOLESTR      (ISubscriptionItem *pItem, LPCWSTR szName, LPWSTR *pszRet);
  305. HRESULT ReadAnsiSTR     (ISubscriptionItem *pItem, LPCWSTR szName, LPSTR *ppszRet);
  306. HRESULT ReadSCODE       (ISubscriptionItem *pItem, LPCWSTR szName, SCODE *pscRet);
  307. HRESULT ReadVariant     (ISubscriptionItem *pItem, LPCWSTR szName, VARIANT *pvarRet);
  308. HRESULT WriteDWORD      (ISubscriptionItem *pItem, LPCWSTR szName, DWORD dwVal);
  309. HRESULT WriteLONGLONG   (ISubscriptionItem *pItem, LPCWSTR szName, LONGLONG llVal);
  310. HRESULT WriteGUID       (ISubscriptionItem *pItem, LPCWSTR szName, GUID *);
  311. HRESULT WriteDATE       (ISubscriptionItem *pItem, LPCWSTR szName, DATE *dtVal);
  312. HRESULT WriteOLESTR     (ISubscriptionItem *pItem, LPCWSTR szName, LPCWSTR szVal);
  313. HRESULT WriteResSTR     (ISubscriptionItem *pItem, LPCWSTR szName, UINT uID);
  314. HRESULT WriteAnsiSTR    (ISubscriptionItem *pItem, LPCWSTR szName, LPCSTR szVal);
  315. HRESULT WriteSCODE      (ISubscriptionItem *pItem, LPCWSTR szName, SCODE scVal);
  316. HRESULT WriteEMPTY      (ISubscriptionItem *pItem, LPCWSTR szName);
  317. HRESULT WriteVariant    (ISubscriptionItem *pItem, LPCWSTR szName, VARIANT *pvarVal);
  318. #ifdef UNICODE
  319. #define ReadTSTR        ReadOLESTR
  320. #define WriteTSTR       WriteOLESTR
  321. #else
  322. #define ReadTSTR        ReadAnsiSTR
  323. #define WriteTSTR       WriteAnsiSTR
  324. #endif
  325. HRESULT WritePassword   (ISubscriptionItem *pItem, BSTR szPassword); 
  326. HRESULT ReadPassword    (ISubscriptionItem *pItem, BSTR *ppszPassword); 
  327. // WEBCRAWL.CPP helper functions
  328. // Do cool stuff to a single URL in the cache. Make sticky, get size, put in group...
  329. // Returns E_OUTOFMEMORY if make sticky fails
  330. HRESULT GetUrlInfoAndMakeSticky(
  331.             LPCTSTR pszBaseUrl,         // Base URL. May be NULL if pszThisUrl is absolute
  332.             LPCTSTR pszThisUrl,         // Absolute or relative url
  333.             LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo,       // Required
  334.             DWORD   dwBufSize,          // Size of *lpCacheEntryInfo
  335.             GROUPID llCacheGroupID);    // Group ID ; may be 0
  336. // PreCheckUrlForChange and PostCheckUrlForChange are documented in webcrawl.cpp
  337. HRESULT PreCheckUrlForChange(LPCTSTR lpURL, VARIANT *pvarChange, BOOL *pfGetContent);
  338. HRESULT PostCheckUrlForChange(VARIANT *pvarChange,
  339.                               LPINTERNET_CACHE_ENTRY_INFO lpInfo, FILETIME ftNewLastModified);
  340. HRESULT WriteCookieToInetDB(LPCTSTR pszURL, SUBSCRIPTIONCOOKIE *pCookie, BOOL bRemove);
  341. HRESULT ReadCookieFromInetDB(LPCTSTR pszURL, SUBSCRIPTIONCOOKIE *pCookie);
  342. #define MAX_RES_STRING_LEN 128      // max resource string len for WriteStringRes
  343. // IntSite helper function
  344. HRESULT IntSiteHelper(LPCTSTR pszURL, const PROPSPEC *pReadPropspec,
  345.         PROPVARIANT *pReadPropvar, UINT uPropVarArraySize, BOOL fWrite);
  346. extern const PROPSPEC c_rgPropRead[];
  347. #define PROP_SUBSCRIPTION   0
  348. #define PROP_FLAGS          1
  349. #define PROP_TRACKING       2
  350. #define PROP_CODEPAGE       3
  351. //=============================================================================
  352. // Helper class for aggregation. Inherit from this like another interface, then
  353. //  implement InnerQI and include IMPLEMENT_DELEGATE_UNKNOWN in your class declaration
  354. class CInnerUnknown
  355. {
  356. public:
  357.     CInnerUnknown() { m_cRef = 1; m_punkOuter=(IUnknown *)(CInnerUnknown *)this; }
  358.     void InitAggregation(IUnknown *punkOuter, IUnknown **punkInner)
  359.     {
  360.         if (punkOuter)
  361.         {
  362.             m_punkOuter = punkOuter;
  363.             *punkInner = (IUnknown *)(CInnerUnknown *)this;
  364.         }
  365.     }
  366.     virtual HRESULT STDMETHODCALLTYPE InnerQI(REFIID riid, void **ppunk) = 0;
  367.     virtual ULONG STDMETHODCALLTYPE InnerAddRef() { return ++m_cRef; }
  368.     virtual ULONG STDMETHODCALLTYPE InnerRelease() = 0;
  369. protected:
  370.     long     m_cRef;
  371.     IUnknown *m_punkOuter;
  372. };
  373. #define IMPLEMENT_DELEGATE_UNKNOWN() 
  374. STDMETHODIMP         QueryInterface(REFIID riid, void **ppunk) 
  375.     { return m_punkOuter->QueryInterface(riid, ppunk); } 
  376. STDMETHODIMP_(ULONG) AddRef() { return m_punkOuter->AddRef(); } 
  377. STDMETHODIMP_(ULONG) Release() { return m_punkOuter->Release(); } 
  378. STDMETHODIMP_(ULONG) InnerRelease() { 
  379.         if (0L != --m_cRef) return m_cRef; 
  380.         delete this; 
  381.         return 0L; }
  382. // end aggregation helpers
  383. //=============================================================================
  384. // Registry helper functions
  385. BOOL ReadRegValue(HKEY hkeyRoot, const TCHAR *pszKey, const TCHAR *pszValue, 
  386.                    void *pData, DWORD dwBytes);
  387. BOOL WriteRegValue(HKEY hkeyRoot, const TCHAR *pszKey, const TCHAR *pszValue,
  388.                     void *pData, DWORD dwBytes, DWORD dwType);
  389. DWORD ReadRegDWORD(HKEY hkeyRoot, const TCHAR *pszKey, const TCHAR *pszValue);
  390. // Event logging function
  391. DWORD __cdecl LogEvent(LPTSTR pszEvent, ...);
  392. // Thread proc for firing up sens and lce
  393. DWORD WINAPI ExternalsThread(LPVOID lpData);
  394. // Used to set syncmgr "warning" level
  395. #define INET_E_AGENT_WARNING 0x800C0FFE
  396. //
  397. // Main WebCheck class
  398. //
  399. class CWebCheck : public IOleCommandTarget
  400. {
  401. protected:
  402.     ULONG           m_cRef;
  403. public:
  404.     CWebCheck(void);
  405.     ~CWebCheck(void);
  406.     // IUnknown members
  407.     STDMETHODIMP         QueryInterface(REFIID, void **);
  408.     STDMETHODIMP_(ULONG) AddRef(void);
  409.     STDMETHODIMP_(ULONG) Release(void);
  410.     // IWebCheck members
  411.     STDMETHODIMP         StartService(BOOL fForceExternals);
  412.     STDMETHODIMP         StopService(void);
  413.     // IOleCommandTarget members
  414.     STDMETHODIMP         QueryStatus(const GUID *pguidCmdGroup,
  415.                                      ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText);
  416.     STDMETHODIMP         Exec(const GUID *pguidCmdGroup, DWORD nCmdID,
  417.                               DWORD nCmdexecopt, VARIANTARG *pvaIn,
  418.                               VARIANTARG *pvaOut);
  419.     // External handling members
  420.     BOOL                 ShouldLoadExternals(void);
  421.     BOOL                 AreExternalsLoaded(void);
  422.     void                 LoadExternals(void);
  423.     void                 UnloadExternals(void);
  424.     // thread for handling external bits
  425.     HANDLE               _hThread;
  426.     // events to synchronize with external thread
  427.     HANDLE               _hInitEvent;
  428.     HANDLE               _hTerminateEvent;
  429. };
  430. //
  431. // CMemStream class
  432. //
  433. class CMemStream
  434. {
  435. protected:
  436.     IStream *   m_pstm;
  437.     BOOL        m_fDirty;
  438.     BOOL        m_fError;
  439. public:
  440.     BOOL        m_fNewStream;
  441. public:
  442.     CMemStream(BOOL fNewStream=TRUE);
  443.     ~CMemStream();
  444.     BOOL        IsError() { return m_fError; }
  445.     HRESULT     Read(void *pv, ULONG cb, ULONG *cbRead);
  446.     HRESULT     Write(void *pv, ULONG cb, ULONG *cbWritten);
  447.     HRESULT     Seek(long lMove, DWORD dwOrigin, DWORD *dwNewPos);
  448.     HRESULT     SaveToStream(IUnknown *punk);
  449.     HRESULT     LoadFromStream(IUnknown **ppunk);
  450.     HRESULT     CopyToStream(IStream *pStm);
  451. };
  452. extern BOOL IsGlobalOffline(void);
  453. extern void SetGlobalOffline(BOOL fOffline);
  454. extern BOOL IsADScreenSaverActive();
  455. extern HRESULT MakeADScreenSaverActive();
  456. #define  _NO_DBGMEMORY_REDEFINITION_
  457. #include "dbgmem.h"
  458. #ifdef DEBUG
  459. extern LEAKDETECTFUNCS LeakDetFunctionTable;
  460. extern BOOL g_fInitTable;
  461. HLOCAL MemAlloc(IN UINT fuFlags, IN UINT cbBytes);
  462. HLOCAL MemFree(HLOCAL hMem);
  463. HLOCAL MemReAlloc(HLOCAL hMem, UINT uBytes, UINT uFlags);
  464. #else
  465. #define MemAlloc LocalAlloc
  466. #define MemFree LocalFree
  467. #define MemReAlloc LocalReAlloc
  468. #endif // DEBUG
  469. typedef HRESULT (* CREATEPROC)(IUnknown *, IUnknown **);
  470. // Helper functions to read and write passwords to an encrypted store.
  471. STDAPI ReadNotificationPassword(LPCWSTR wszUrl, BSTR * pbstrPassword);
  472. STDAPI WriteNotificationPassword(LPCWSTR wszUrl, BSTR  bstrPassword);
  473. // dialmon functions
  474. BOOL DialmonInit(void);
  475. void DialmonShutdown(void);
  476. // LCE dynaload entry points
  477. typedef HRESULT (* LCEREGISTER)(HMODULE);
  478. typedef HRESULT (* LCEUNREGISTER)(HMODULE);
  479. typedef HRESULT (* LCESTART)(void);
  480. typedef HRESULT (* LCESTOP)(void);
  481. // SENS dynaload entry points
  482. typedef HRESULT (* SENSREGISTER)(void);
  483. typedef BOOL (* SENSSTART)(void);
  484. typedef BOOL (* SENSSTOP)(void);
  485. // event dispatching
  486. DWORD DispatchEvent(DWORD dwEvent, LPWSTR pwsEventDesc, DWORD dwEventData);