Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

281 lines
6.4 KiB

  1. //+--------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1996 - 1999
  5. //
  6. // File: elog.cpp
  7. //
  8. // Contents: Cert Server Core implementation
  9. //
  10. // History: 02-Jan-97 terences created
  11. //
  12. //---------------------------------------------------------------------------
  13. // TBD: add AddLoggingEvent, which will log to file instead of the event log
  14. // TBD: add audit events
  15. // TBD: add filtering so that criticality sorting of events can take place
  16. #include <pch.cpp>
  17. #pragma hdrstop
  18. #include "certlog.h"
  19. #include "elog.h"
  20. #define __dwFILE__ __dwFILE_CERTSRV_ELOG_CPP__
  21. #if DBG_CERTSRV
  22. WCHAR const *
  23. wszEventType(
  24. IN DWORD dwEventType)
  25. {
  26. WCHAR const *pwsz;
  27. switch (dwEventType)
  28. {
  29. case EVENTLOG_ERROR_TYPE: pwsz = L"Error"; break;
  30. case EVENTLOG_WARNING_TYPE: pwsz = L"Warning"; break;
  31. case EVENTLOG_INFORMATION_TYPE: pwsz = L"Information"; break;
  32. case EVENTLOG_AUDIT_SUCCESS: pwsz = L"AuditSuccess"; break;
  33. case EVENTLOG_AUDIT_FAILURE: pwsz = L"AuditFailure"; break;
  34. default: pwsz = L"???"; break;
  35. }
  36. return(pwsz);
  37. }
  38. #endif // DBG_CERTSRV
  39. typedef struct _ELOGTHROTTLE {
  40. DWORD dwIdEvent;
  41. DWORD dwSeconds;
  42. LLFILETIME llftNext;
  43. } ELOGTHROTTLE;
  44. ELOGTHROTTLE s_elogThrottle[] = {
  45. { MSG_E_POSSIBLE_DENIAL_OF_SERVICE_ATTACK, 20 * CVT_MINUTES, },
  46. { MSG_E_BAD_DEFAULT_CA_XCHG_CSP, 1 * CVT_DAYS, },
  47. { MSG_E_BAD_REGISTRY_CA_XCHG_CSP, 1 * CVT_DAYS, },
  48. { MSG_CLAMPED_BY_CA_CERT, 1 * CVT_DAYS, },
  49. };
  50. BOOL
  51. LogThrottleEvent(
  52. IN DWORD dwIdEvent)
  53. {
  54. BOOL fThrottle = FALSE;
  55. if (CERTLOG_EXHAUSTIVE > g_dwLogLevel)
  56. {
  57. ELOGTHROTTLE *pet;
  58. for (
  59. pet = s_elogThrottle;
  60. pet < &s_elogThrottle[ARRAYSIZE(s_elogThrottle)];
  61. pet++)
  62. {
  63. if (dwIdEvent == pet->dwIdEvent)
  64. {
  65. LLFILETIME llft;
  66. LLFILETIME llftNext;
  67. GetSystemTimeAsFileTime(&llft.ft);
  68. // if it's time to log the next msg (Next < Now)
  69. llftNext = pet->llftNext;
  70. if (0 > CompareFileTime(&llftNext.ft, &llft.ft))
  71. {
  72. llft.ll += ((LONGLONG) pet->dwSeconds) * CVT_BASE;
  73. pet->llftNext = llft;
  74. }
  75. else
  76. {
  77. fThrottle = TRUE;
  78. }
  79. break;
  80. }
  81. }
  82. }
  83. //error:
  84. return(fThrottle);
  85. }
  86. /*********************************************************************
  87. * FUNCTION: LogEvent( DWORD dwEventType, *
  88. * DWORD dwIdEvent, *
  89. * WORD cStrings, *
  90. * LPTSTR *apwszStrings); *
  91. * *
  92. * PURPOSE: add the event to the event log *
  93. * *
  94. * INPUT: the event ID to report in the log, the number of insert *
  95. * strings, and an array of null-terminated insert strings *
  96. * *
  97. * RETURNS: none *
  98. *********************************************************************/
  99. HRESULT
  100. LogEvent(
  101. IN DWORD dwEventType,
  102. IN DWORD dwIdEvent,
  103. IN WORD cStrings,
  104. IN WCHAR const * const *apwszStrings)
  105. {
  106. HRESULT hr;
  107. HANDLE hAppLog = NULL;
  108. #if DBG_CERTSRV
  109. CONSOLEPRINT3((
  110. DBG_SS_CERTSRV,
  111. "LogEvent(Type=%x(%ws), Id=%x)\n",
  112. dwEventType,
  113. wszEventType(dwEventType),
  114. dwIdEvent));
  115. for (DWORD i = 0; i < cStrings; i++)
  116. {
  117. CONSOLEPRINT2((
  118. DBG_SS_CERTSRV,
  119. "LogEvent[%u]: %ws\n",
  120. i,
  121. apwszStrings[i]));
  122. }
  123. #endif // DBG_CERTSRV
  124. if (!LogThrottleEvent(dwIdEvent))
  125. {
  126. WORD wElogType = (WORD) dwEventType;
  127. hAppLog = RegisterEventSource(NULL, g_wszCertSrvServiceName);
  128. if (NULL == hAppLog)
  129. {
  130. hr = myHLastError();
  131. _JumpError(hr, error, "RegisterEventSource");
  132. }
  133. if (!ReportEvent(
  134. hAppLog,
  135. wElogType,
  136. 0,
  137. dwIdEvent,
  138. NULL,
  139. cStrings,
  140. 0,
  141. const_cast<WCHAR const **>(apwszStrings),
  142. NULL))
  143. {
  144. hr = myHLastError();
  145. _JumpError(hr, error, "ReportEvent");
  146. }
  147. }
  148. hr = S_OK;
  149. error:
  150. if (NULL != hAppLog)
  151. {
  152. DeregisterEventSource(hAppLog);
  153. }
  154. return(hr);
  155. }
  156. HRESULT
  157. LogEventHResult(
  158. IN DWORD dwEventType,
  159. IN DWORD dwIdEvent,
  160. IN HRESULT hrEvent)
  161. {
  162. HRESULT hr;
  163. WCHAR const *apwsz[1];
  164. WORD cpwsz;
  165. WCHAR awchr[cwcHRESULTSTRING];
  166. apwsz[0] = myGetErrorMessageText(hrEvent, TRUE);
  167. cpwsz = ARRAYSIZE(apwsz);
  168. if (NULL == apwsz[0])
  169. {
  170. apwsz[0] = myHResultToString(awchr, hrEvent);
  171. }
  172. hr = LogEvent(dwEventType, dwIdEvent, cpwsz, apwsz);
  173. _JumpIfError(hr, error, "LogEvent");
  174. error:
  175. if (NULL != apwsz[0] && awchr != apwsz[0])
  176. {
  177. LocalFree(const_cast<WCHAR *>(apwsz[0]));
  178. }
  179. return(hr);
  180. }
  181. HRESULT
  182. LogEventString(
  183. IN DWORD dwEventType,
  184. IN DWORD dwIdEvent,
  185. OPTIONAL IN WCHAR const *pwszString)
  186. {
  187. return(LogEvent(
  188. dwEventType,
  189. dwIdEvent,
  190. (WORD) (NULL == pwszString? 0 : 1),
  191. NULL == pwszString? NULL : &pwszString));
  192. }
  193. HRESULT
  194. LogEventStringHResult(
  195. IN DWORD dwEventType,
  196. IN DWORD dwIdEvent,
  197. IN WCHAR const *pwszString,
  198. IN HRESULT hrEvent)
  199. {
  200. return(LogEventStringArrayHResult(
  201. dwEventType,
  202. dwIdEvent,
  203. 1, // cStrings
  204. &pwszString,
  205. hrEvent));
  206. }
  207. HRESULT
  208. LogEventStringArrayHResult(
  209. IN DWORD dwEventType,
  210. IN DWORD dwIdEvent,
  211. IN DWORD cStrings,
  212. IN WCHAR const * const *apwszStrings,
  213. IN HRESULT hrEvent)
  214. {
  215. HRESULT hr;
  216. WCHAR const *apwsz[10];
  217. DWORD cpwsz;
  218. WCHAR awchr[cwcHRESULTSTRING];
  219. WCHAR const *pwszError = NULL;
  220. CSASSERT(ARRAYSIZE(apwsz) > cStrings);
  221. cpwsz = min(ARRAYSIZE(apwsz) - 1, cStrings);
  222. CopyMemory(apwsz, apwszStrings, cpwsz * sizeof(apwsz[0]));
  223. pwszError = myGetErrorMessageText(hrEvent, TRUE);
  224. if (NULL == pwszError)
  225. {
  226. pwszError = myHResultToString(awchr, hrEvent);
  227. }
  228. apwsz[cpwsz] = pwszError;
  229. cpwsz++;
  230. hr = LogEvent(dwEventType, dwIdEvent, (WORD) cpwsz, apwsz);
  231. _JumpIfError(hr, error, "LogEvent");
  232. error:
  233. if (NULL != pwszError && awchr != pwszError)
  234. {
  235. LocalFree(const_cast<WCHAR *>(pwszError));
  236. }
  237. return(hr);
  238. }