1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/sandbox/chromium/base/win/event_trace_provider.cc Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,134 @@ 1.4 +// Copyright (c) 2012 The Chromium Authors. All rights reserved. 1.5 +// Use of this source code is governed by a BSD-style license that can be 1.6 +// found in the LICENSE file. 1.7 +// 1.8 +#include "base/win/event_trace_provider.h" 1.9 +#include <windows.h> 1.10 +#include <cguid.h> 1.11 + 1.12 +namespace base { 1.13 +namespace win { 1.14 + 1.15 +TRACE_GUID_REGISTRATION EtwTraceProvider::obligatory_guid_registration_ = { 1.16 + &GUID_NULL, 1.17 + NULL 1.18 +}; 1.19 + 1.20 +EtwTraceProvider::EtwTraceProvider(const GUID& provider_name) 1.21 + : provider_name_(provider_name), registration_handle_(NULL), 1.22 + session_handle_(NULL), enable_flags_(0), enable_level_(0) { 1.23 +} 1.24 + 1.25 +EtwTraceProvider::EtwTraceProvider() 1.26 + : provider_name_(GUID_NULL), registration_handle_(NULL), 1.27 + session_handle_(NULL), enable_flags_(0), enable_level_(0) { 1.28 +} 1.29 + 1.30 +EtwTraceProvider::~EtwTraceProvider() { 1.31 + Unregister(); 1.32 +} 1.33 + 1.34 +ULONG EtwTraceProvider::EnableEvents(void* buffer) { 1.35 + session_handle_ = ::GetTraceLoggerHandle(buffer); 1.36 + if (NULL == session_handle_) { 1.37 + return ::GetLastError(); 1.38 + } 1.39 + 1.40 + enable_flags_ = ::GetTraceEnableFlags(session_handle_); 1.41 + enable_level_ = ::GetTraceEnableLevel(session_handle_); 1.42 + 1.43 + // Give subclasses a chance to digest the state change. 1.44 + OnEventsEnabled(); 1.45 + 1.46 + return ERROR_SUCCESS; 1.47 +} 1.48 + 1.49 +ULONG EtwTraceProvider::DisableEvents() { 1.50 + // Give subclasses a chance to digest the state change. 1.51 + OnEventsDisabled(); 1.52 + 1.53 + enable_level_ = 0; 1.54 + enable_flags_ = 0; 1.55 + session_handle_ = NULL; 1.56 + 1.57 + PostEventsDisabled(); 1.58 + 1.59 + return ERROR_SUCCESS; 1.60 +} 1.61 + 1.62 +ULONG EtwTraceProvider::Callback(WMIDPREQUESTCODE request, void* buffer) { 1.63 + switch (request) { 1.64 + case WMI_ENABLE_EVENTS: 1.65 + return EnableEvents(buffer); 1.66 + case WMI_DISABLE_EVENTS: 1.67 + return DisableEvents(); 1.68 + default: 1.69 + return ERROR_INVALID_PARAMETER; 1.70 + } 1.71 + // Not reached. 1.72 +} 1.73 + 1.74 +ULONG WINAPI EtwTraceProvider::ControlCallback(WMIDPREQUESTCODE request, 1.75 + void* context, ULONG *reserved, void* buffer) { 1.76 + EtwTraceProvider *provider = reinterpret_cast<EtwTraceProvider*>(context); 1.77 + 1.78 + return provider->Callback(request, buffer); 1.79 +} 1.80 + 1.81 +ULONG EtwTraceProvider::Register() { 1.82 + if (provider_name_ == GUID_NULL) 1.83 + return ERROR_INVALID_NAME; 1.84 + 1.85 + return ::RegisterTraceGuids(ControlCallback, this, &provider_name_, 1.86 + 1, &obligatory_guid_registration_, NULL, NULL, ®istration_handle_); 1.87 +} 1.88 + 1.89 +ULONG EtwTraceProvider::Unregister() { 1.90 + // If a session is active, notify subclasses that it's going away. 1.91 + if (session_handle_ != NULL) 1.92 + DisableEvents(); 1.93 + 1.94 + ULONG ret = ::UnregisterTraceGuids(registration_handle_); 1.95 + 1.96 + registration_handle_ = NULL; 1.97 + 1.98 + return ret; 1.99 +} 1.100 + 1.101 +ULONG EtwTraceProvider::Log(const EtwEventClass& event_class, 1.102 + EtwEventType type, EtwEventLevel level, const char *message) { 1.103 + if (NULL == session_handle_ || enable_level_ < level) 1.104 + return ERROR_SUCCESS; // No one listening. 1.105 + 1.106 + EtwMofEvent<1> event(event_class, type, level); 1.107 + 1.108 + event.fields[0].DataPtr = reinterpret_cast<ULONG64>(message); 1.109 + event.fields[0].Length = message ? 1.110 + static_cast<ULONG>(sizeof(message[0]) * (1 + strlen(message))) : 0; 1.111 + 1.112 + return ::TraceEvent(session_handle_, &event.header); 1.113 +} 1.114 + 1.115 +ULONG EtwTraceProvider::Log(const EtwEventClass& event_class, 1.116 + EtwEventType type, EtwEventLevel level, const wchar_t *message) { 1.117 + if (NULL == session_handle_ || enable_level_ < level) 1.118 + return ERROR_SUCCESS; // No one listening. 1.119 + 1.120 + EtwMofEvent<1> event(event_class, type, level); 1.121 + 1.122 + event.fields[0].DataPtr = reinterpret_cast<ULONG64>(message); 1.123 + event.fields[0].Length = message ? 1.124 + static_cast<ULONG>(sizeof(message[0]) * (1 + wcslen(message))) : 0; 1.125 + 1.126 + return ::TraceEvent(session_handle_, &event.header); 1.127 +} 1.128 + 1.129 +ULONG EtwTraceProvider::Log(EVENT_TRACE_HEADER* event) { 1.130 + if (enable_level_ < event->Class.Level) 1.131 + return ERROR_SUCCESS; 1.132 + 1.133 + return ::TraceEvent(session_handle_, event); 1.134 +} 1.135 + 1.136 +} // namespace win 1.137 +} // namespace base