123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- #ifndef BASE_WIN_EVENT_TRACE_PROVIDER_H_
- #define BASE_WIN_EVENT_TRACE_PROVIDER_H_
- #include <windows.h>
- #include <cguid.h>
- #include <evntrace.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <wmistr.h>
- #include <limits>
- #include "base/base_export.h"
- #include "base/macros.h"
- namespace base {
- namespace win {
- using EtwEventClass = GUID;
- using EtwEventType = UCHAR;
- using EtwEventLevel = UCHAR;
- using EtwEventVersion = USHORT;
- using EtwEventFlags = ULONG;
- template <size_t N>
- struct EtwMofEventBase {
- EVENT_TRACE_HEADER header;
- MOF_FIELD fields[N];
- };
- template <size_t N>
- class EtwMofEvent : public EtwMofEventBase<N> {
- public:
- using Super = EtwMofEventBase<N>;
-
-
- using EtwMofEventBase<N>::header;
- using EtwMofEventBase<N>::fields;
- EtwMofEvent() { memset(static_cast<Super*>(this), 0, sizeof(Super)); }
- EtwMofEvent(const EtwEventClass& event_class,
- EtwEventType type,
- EtwEventLevel level) {
- memset(static_cast<Super*>(this), 0, sizeof(Super));
- header.Size = sizeof(Super);
- header.Guid = event_class;
- header.Class.Type = type;
- header.Class.Level = level;
- header.Flags = WNODE_FLAG_TRACED_GUID | WNODE_FLAG_USE_MOF_PTR;
- }
- EtwMofEvent(const EtwEventClass& event_class,
- EtwEventType type,
- EtwEventVersion version,
- EtwEventLevel level) {
- memset(static_cast<Super*>(this), 0, sizeof(Super));
- header.Size = sizeof(Super);
- header.Guid = event_class;
- header.Class.Type = type;
- header.Class.Version = version;
- header.Class.Level = level;
- header.Flags = WNODE_FLAG_TRACED_GUID | WNODE_FLAG_USE_MOF_PTR;
- }
- void SetField(size_t field, size_t size, const void* data) {
-
- if ((field < N) && (size <= std::numeric_limits<uint32_t>::max())) {
- fields[field].DataPtr = reinterpret_cast<ULONG64>(data);
- fields[field].Length = static_cast<ULONG>(size);
- }
- }
- EVENT_TRACE_HEADER* get() { return &header; }
- private:
- DISALLOW_COPY_AND_ASSIGN(EtwMofEvent);
- };
- class BASE_EXPORT EtwTraceProvider {
- public:
-
-
- explicit EtwTraceProvider(const GUID& provider_name);
-
-
- EtwTraceProvider();
- virtual ~EtwTraceProvider();
-
-
-
-
-
- ULONG Register();
-
- ULONG Unregister();
-
- void set_provider_name(const GUID& provider_name) {
- provider_name_ = provider_name;
- }
- const GUID& provider_name() const { return provider_name_; }
- TRACEHANDLE registration_handle() const { return registration_handle_; }
- TRACEHANDLE session_handle() const { return session_handle_; }
- EtwEventFlags enable_flags() const { return enable_flags_; }
- EtwEventLevel enable_level() const { return enable_level_; }
-
-
-
- bool ShouldLog(EtwEventLevel level, EtwEventFlags flags) {
- return NULL != session_handle_ && level >= enable_level_ &&
- (0 != (flags & enable_flags_));
- }
-
-
- ULONG Log(const EtwEventClass& event_class,
- EtwEventType type,
- EtwEventLevel level,
- const char* message);
- ULONG Log(const EtwEventClass& event_class,
- EtwEventType type,
- EtwEventLevel level,
- const wchar_t* message);
-
- ULONG Log(EVENT_TRACE_HEADER* event);
- protected:
-
-
-
-
- virtual void OnEventsEnabled() {}
-
-
-
-
- virtual void OnEventsDisabled() {}
-
-
-
-
-
- virtual void PostEventsDisabled() {}
- private:
- ULONG EnableEvents(PVOID buffer);
- ULONG DisableEvents();
- ULONG Callback(WMIDPREQUESTCODE request, PVOID buffer);
- static ULONG WINAPI ControlCallback(WMIDPREQUESTCODE request,
- PVOID context,
- ULONG* reserved,
- PVOID buffer);
- GUID provider_name_ = GUID_NULL;
- TRACEHANDLE registration_handle_ = NULL;
- TRACEHANDLE session_handle_ = NULL;
- EtwEventFlags enable_flags_ = 0;
- EtwEventLevel enable_level_ = 0;
-
-
- static TRACE_GUID_REGISTRATION obligatory_guid_registration_;
- DISALLOW_COPY_AND_ASSIGN(EtwTraceProvider);
- };
- }
- }
- #endif
|