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.

203 lines
4.8 KiB

  1. //*************************************************************
  2. //
  3. // Copyright (c) Microsoft Corporation 1998
  4. // All rights reserved
  5. //
  6. // events.cxx
  7. //
  8. //*************************************************************
  9. #include "common.hxx"
  10. CEvents * gpEvents = 0;
  11. CEventsBase::CEventsBase()
  12. {
  13. _hUserToken = 0;
  14. }
  15. void
  16. CEventsBase::Report(
  17. DWORD EventID,
  18. BOOL bDowngradeErrors,
  19. WORD Strings,
  20. ...
  21. )
  22. {
  23. va_list VAList;
  24. WCHAR * ppwszStrings[10];
  25. WORD Type;
  26. DWORD DbgMsgLevel;
  27. if ( Strings > 10 )
  28. return;
  29. switch ( EventID / 100 )
  30. {
  31. case 1:
  32. Type = EVENTLOG_ERROR_TYPE;
  33. DbgMsgLevel = DM_WARNING;
  34. break;
  35. case 2:
  36. Type = EVENTLOG_WARNING_TYPE;
  37. DbgMsgLevel = DM_WARNING;
  38. break;
  39. case 3:
  40. Type = EVENTLOG_INFORMATION_TYPE;
  41. DbgMsgLevel = DM_VERBOSE;
  42. break;
  43. case 4:
  44. Type = EVENTLOG_INFORMATION_TYPE;
  45. DbgMsgLevel = DM_VERBOSE;
  46. break;
  47. default:
  48. return;
  49. }
  50. if ( bDowngradeErrors && ( EVENTLOG_ERROR_TYPE == Type ) )
  51. {
  52. Type = EVENTLOG_WARNING_TYPE;
  53. DbgMsgLevel = DM_WARNING;
  54. }
  55. if ( Strings > 0 )
  56. {
  57. va_start( VAList, Strings );
  58. for ( DWORD n = 0; n < Strings; n++ )
  59. ppwszStrings[n] = va_arg( VAList, WCHAR * );
  60. va_end( VAList );
  61. }
  62. if ( (EventID < 400) ||
  63. (gDebugLevel & (DL_VERBOSE | DL_EVENTLOG)) )
  64. {
  65. HANDLE hEventLog;
  66. PSID pSid;
  67. hEventLog = OpenEventLog( NULL, APPMGMT_EVENT_SOURCE );
  68. if ( ! hEventLog )
  69. return;
  70. pSid = AppmgmtGetUserSid( _hUserToken );
  71. (void) ReportEvent(
  72. hEventLog,
  73. Type,
  74. 0,
  75. EventID,
  76. pSid,
  77. Strings,
  78. 0,
  79. (LPCWCH *) ppwszStrings,
  80. NULL );
  81. LocalFree( pSid );
  82. CloseEventLog( hEventLog );
  83. }
  84. //
  85. // Also make sure the event messages get sent to the debugger and log file.
  86. // Kind of hacky method, but makes it so every caller to ::Report doesn't
  87. // have to call _DebugMsg as well.
  88. // However, don't do this for the verbose messages otherwise it will be
  89. // dumped to the debugger twice.
  90. //
  91. if ( EVENT_APPMGMT_VERBOSE == EventID )
  92. return;
  93. switch ( Strings )
  94. {
  95. case 0 :
  96. _DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID );
  97. break;
  98. case 1 :
  99. _DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0] );
  100. break;
  101. case 2 :
  102. _DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0], ppwszStrings[1] );
  103. break;
  104. case 3 :
  105. _DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0], ppwszStrings[1], ppwszStrings[2] );
  106. break;
  107. case 4 :
  108. _DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0], ppwszStrings[1], ppwszStrings[2], ppwszStrings[3] );
  109. break;
  110. case 5 :
  111. _DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0], ppwszStrings[1], ppwszStrings[2], ppwszStrings[3], ppwszStrings[4] );
  112. break;
  113. default :
  114. VerboseDebugDump( L"CEvents::Report called with more params then expected!\n" );
  115. break;
  116. }
  117. }
  118. void
  119. CEventsBase::Install(
  120. DWORD ErrorStatus,
  121. WCHAR * pwszDeploymentName,
  122. WCHAR * pwszGPOName
  123. )
  124. {
  125. WCHAR wszStatus[12];
  126. if ( ErrorStatus != ERROR_SUCCESS )
  127. {
  128. DwordToString( ErrorStatus, wszStatus );
  129. Report(
  130. EVENT_APPMGMT_INSTALL_FAILED,
  131. ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED == ErrorStatus,
  132. 3,
  133. pwszDeploymentName,
  134. pwszGPOName,
  135. wszStatus );
  136. }
  137. else
  138. {
  139. Report(
  140. EVENT_APPMGMT_INSTALL,
  141. FALSE,
  142. 2,
  143. pwszDeploymentName,
  144. pwszGPOName );
  145. }
  146. }
  147. void
  148. CEventsBase::Uninstall(
  149. DWORD ErrorStatus,
  150. WCHAR * pwszDeploymentName,
  151. WCHAR * pwszGPOName
  152. )
  153. {
  154. WCHAR wszStatus[12];
  155. if ( ErrorStatus != ERROR_SUCCESS )
  156. {
  157. DwordToString( ErrorStatus, wszStatus );
  158. Report(
  159. EVENT_APPMGMT_UNINSTALL_FAILED,
  160. ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED == ErrorStatus,
  161. 3,
  162. pwszDeploymentName,
  163. pwszGPOName,
  164. wszStatus );
  165. }
  166. else
  167. {
  168. Report(
  169. EVENT_APPMGMT_UNINSTALL,
  170. FALSE,
  171. 2,
  172. pwszDeploymentName,
  173. pwszGPOName );
  174. }
  175. }