| Index: common/event_logger.cc
|
| diff --git a/common/event_logger.cc b/common/event_logger.cc
|
| deleted file mode 100644
|
| index 54b163429dc59f471cb9d7ce2edbc9446382659f..0000000000000000000000000000000000000000
|
| --- a/common/event_logger.cc
|
| +++ /dev/null
|
| @@ -1,225 +0,0 @@
|
| -// Copyright 2007-2009 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -
|
| -
|
| -#include "omaha/common/event_logger.h"
|
| -
|
| -#include <sddl.h>
|
| -#include "omaha/base/debug.h"
|
| -#include "omaha/base/error.h"
|
| -#include "omaha/base/logging.h"
|
| -#include "omaha/base/omaha_version.h"
|
| -#include "omaha/base/reg_key.h"
|
| -#include "omaha/base/safe_format.h"
|
| -#include "omaha/base/user_info.h"
|
| -#include "omaha/common/config_manager.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -void LogEventHelper(WORD type, DWORD id, size_t count, const TCHAR** strings,
|
| - const TCHAR* ctx) {
|
| - ASSERT1(count <= kint16max);
|
| - if (!ConfigManager::Instance()->CanLogEvents(type)) {
|
| - return;
|
| - }
|
| -
|
| - // Include the circular logging buffer in the event log if the type is a
|
| - // warning or an error.
|
| - CStringA data(ctx);
|
| - CString context = GetLogging()->GetHistory();
|
| - if (!context.IsEmpty()) {
|
| - SafeCStringAAppendFormat(&data, "\n[More context: %S]", context);
|
| - }
|
| -
|
| - HRESULT hr = EventLogger::ReportEvent(EventLogger::kSourceName,
|
| - type,
|
| - EventLogger::kDefaultCategory,
|
| - id,
|
| - static_cast<WORD>(count),
|
| - strings,
|
| - data.GetLength(),
|
| - data.GetBuffer());
|
| - if (FAILED(hr)) {
|
| - CORE_LOG(LW, (_T("[Failed to log event][0x%08x]"), hr));
|
| - }
|
| -}
|
| -
|
| -CString BuildEventSourceRegistryKeyName(const TCHAR* src_name) {
|
| - ASSERT1(src_name);
|
| - CString key_name;
|
| - SafeCStringFormat(&key_name,
|
| - _T("HKLM\\SYSTEM\\CurrentControlSet\\Services\\EventLog\\")
|
| - _T("Application\\%s"),
|
| - src_name);
|
| - return key_name;
|
| -}
|
| -
|
| -HRESULT EventLogger::AddEventSource(const TCHAR* src_name,
|
| - const TCHAR* msg_dll_path) {
|
| - ASSERT1(src_name);
|
| - if (!src_name) return E_INVALIDARG;
|
| - ASSERT1(msg_dll_path);
|
| - if (!msg_dll_path) return E_INVALIDARG;
|
| -
|
| - // Create the event source as a subkey of the "Application" log.
|
| - RegKey reg_key;
|
| - HRESULT hr = reg_key.Create(BuildEventSourceRegistryKeyName(src_name));
|
| - if (FAILED(hr)) return hr;
|
| -
|
| - // Set the name of the message file. RegKey class can't set REG_EXPAND_SZ
|
| - // values so we must use the low level OS call.
|
| - int result = ::RegSetValueEx(reg_key.Key(),
|
| - _T("EventMessageFile"),
|
| - 0,
|
| - REG_EXPAND_SZ,
|
| - reinterpret_cast<const byte*>(msg_dll_path),
|
| - (_tcslen(msg_dll_path) + 1) * sizeof(TCHAR));
|
| - if (result != ERROR_SUCCESS) return HRESULT_FROM_WIN32(result);
|
| -
|
| - // Set the supported event types.
|
| - DWORD types = EVENTLOG_ERROR_TYPE |
|
| - EVENTLOG_WARNING_TYPE |
|
| - EVENTLOG_INFORMATION_TYPE;
|
| - hr = reg_key.SetValue(_T("TypesSupported"), types);
|
| - if (FAILED(hr)) return hr;
|
| -
|
| - return S_OK;
|
| -}
|
| -
|
| -HRESULT EventLogger::RemoveEventSource(const TCHAR* src_name) {
|
| - ASSERT1(src_name);
|
| - if (!src_name) return E_INVALIDARG;
|
| -
|
| - // RegKey::DeleteKey returns S_FALSE when attempting to delete
|
| - // a key that is not there.
|
| - HRESULT hr = RegKey::DeleteKey(BuildEventSourceRegistryKeyName(src_name),
|
| - false);
|
| - return SUCCEEDED(hr) ? S_OK : hr;
|
| -}
|
| -
|
| -
|
| -HRESULT EventLogger::ReportEvent(const TCHAR* src_name,
|
| - WORD type,
|
| - WORD category,
|
| - DWORD id,
|
| - WORD count,
|
| - const TCHAR** strings,
|
| - size_t buf_size,
|
| - void* buffer) {
|
| - ASSERT1(src_name);
|
| - ASSERT1(type == EVENTLOG_SUCCESS ||
|
| - type == EVENTLOG_ERROR_TYPE ||
|
| - type == EVENTLOG_WARNING_TYPE ||
|
| - type == EVENTLOG_INFORMATION_TYPE);
|
| -
|
| - // Opens the log on the local computer.
|
| - HANDLE hlog = ::RegisterEventSource(NULL, src_name);
|
| - if (!hlog) {
|
| - return HRESULTFromLastError();
|
| - }
|
| -
|
| - // Best effort to get the sid for the current effective user. The event
|
| - // logging provides for logging the sid at no cost so that the user shows up
|
| - // in the event log.
|
| - CString sid_string;
|
| - VERIFY1(SUCCEEDED(user_info::GetEffectiveUserSid(&sid_string)));
|
| - PSID psid = NULL;
|
| - if (!sid_string.IsEmpty()) {
|
| - VERIFY1(::ConvertStringSidToSid(sid_string, &psid));
|
| - ASSERT1(psid);
|
| - }
|
| -
|
| - HRESULT hr = E_FAIL;
|
| - if (::ReportEvent(hlog, // Event log handle.
|
| - type, // Event type.
|
| - category, // Event category.
|
| - id, // Event identifier.
|
| - psid, // User security identifier.
|
| - count, // Number of substitution strings.
|
| - buf_size, // Size of binary data.
|
| - strings, // Pointer to strings.
|
| - buffer)) { // Binary data.
|
| - hr = S_OK;
|
| - } else {
|
| - hr = HRESULTFromLastError();
|
| - }
|
| -
|
| - ::LocalFree(psid);
|
| - VERIFY1(::DeregisterEventSource(hlog));
|
| - return hr;
|
| -}
|
| -
|
| -HRESULT EventLogger::ReadLastEvent(const TCHAR* src_name, EVENTLOGRECORD* rec) {
|
| - if (!(rec && src_name)) {
|
| - return E_INVALIDARG;
|
| - }
|
| - HANDLE hlog = ::OpenEventLog(NULL, src_name);
|
| - if (!hlog) {
|
| - return HRESULTFromLastError();
|
| - }
|
| - HRESULT hr = E_FAIL;
|
| - DWORD bytes_read(0), bytes_needed(0);
|
| - const DWORD read_flags = EVENTLOG_BACKWARDS_READ | EVENTLOG_SEQUENTIAL_READ;
|
| - if (::ReadEventLog(hlog, // Event log handle.
|
| - read_flags, // Reverse chronological order.
|
| - 0, // Not used.
|
| - rec, // Read buffer.
|
| - rec->Length, // Size of read buffer.
|
| - &bytes_read, // Number of bytes read.
|
| - &bytes_needed)) { // Number of bytes required.
|
| - hr = S_OK;
|
| - } else {
|
| - hr = HRESULTFromLastError();
|
| - }
|
| - ::CloseEventLog(hlog);
|
| - return hr;
|
| -}
|
| -
|
| -// TODO(omaha): Decide whether to use IDS_PRODUCT_DISPLAY_NAME instead.
|
| -// On one hand this string makes it to the event viewer, on
|
| -// the other hand the same string is used to register an event log for an
|
| -// application in registry. We do not expect the mapping to change when the user
|
| -// changes languages or there are multiple users for a per-machine install that
|
| -// are using different languages., however we may decide to do so.
|
| -const TCHAR* const EventLogger::kSourceName = kAppName;
|
| -
|
| -void GoogleUpdateLogEvent::WriteEvent() {
|
| - ASSERT1(!event_desc_.IsEmpty());
|
| - ASSERT1(type_ != 0);
|
| - ASSERT1(id_ != 0);
|
| -
|
| - const DWORD pid(::GetCurrentProcessId());
|
| - const TCHAR* ver = GetVersionString();
|
| -
|
| - const ConfigManager& cm = *ConfigManager::Instance();
|
| - CString msg;
|
| - SafeCStringFormat(&msg, _T("\n%s.\npid=%d, ver=%s, machine=%d, extern=%d"),
|
| - event_desc_, pid, ver, is_machine_, !cm.IsInternalUser());
|
| -#if DEBUG
|
| - msg.Append(_T(", debug"));
|
| -#endif
|
| -#if !OFFICIAL_BUILD
|
| - msg.Append(_T(", private"));
|
| -#endif
|
| -
|
| - if (!event_text_.IsEmpty()) {
|
| - SafeCStringAppendFormat(&msg, _T("\n%s"), event_text_);
|
| - }
|
| -
|
| - LogEvent(static_cast<WORD>(type_), id_, msg);
|
| -}
|
| -
|
| -} // namespace omaha
|
| -
|
|
|