4

I'm trying to use "Event Tracing for Windows" through WPP instumentation. Per documentation in Getting Started with Software Tracing in Windows Drivers it is possible to issue traces to multiple providers from a single driver, but I saw no example for doing so:

A driver can specify more than one control GUID. Each control GUID identifies a unique provider. For example, if a driver defines two control GUIDs, one for a shared library and one for the driver, the library and the driver can be enabled as two different providers. Tracing can be enabled for either the library or the driver, or both.

I tried to created two header files, each with WPP_CONTROL_GUIDS using different guid. Then I include the different header files from c/cpp files which I expect to issue traces to the different providers. But it seems the definition in the main file override this seperation and all traces arrive to the provider used by it...

Any suggestion? Any sample? Thanks!!

Uri Cohen
  • 3,488
  • 1
  • 29
  • 46

1 Answers1

1

I avoid WPP tracing like the plague now, but the trace templates provide an example of how to do this. You should see this comment somewhere in one of your TMH files:

// template C:\WinDDK\7600.16385.1\bin\wppconfig\rev1\control.tpl
//
//     Defines a set of macro that expand control model specified
//     with WPP_CONTROL_GUIDS (example shown below)
//     into an enum of trace levels and required structures that
//     contain the mask of levels, logger handle and some information
//     required for registration.
//

///////////////////////////////////////////////////////////////////////////////////
//
// #define WPP_CONTROL_GUIDS \
//     WPP_DEFINE_CONTROL_GUID(Regular,(81b20fea,73a8,4b62,95bc,354477c97a6f), \
//       WPP_DEFINE_BIT(Error)      \
//       WPP_DEFINE_BIT(Unusual)    \
//       WPP_DEFINE_BIT(Noise)      \
//    )        \
//    WPP_DEFINE_CONTROL_GUID(HiFreq,(91b20fea,73a8,4b62,95bc,354477c97a6f), \
//       WPP_DEFINE_BIT(Entry)      \
//       WPP_DEFINE_BIT(Exit)       \
//       WPP_DEFINE_BIT(ApiCalls)   \
//       WPP_DEFINE_BIT(RandomJunk) \
//       WPP_DEFINE_BIT(LovePoem)   \
//    )  

So, you should be defining both GUIDs within the same WPP_CONTROL_GUIDS macro.

snoone
  • 5,409
  • 18
  • 19
  • Thanks! The part I'm missing here is how upon tracing one chooses which control-guid to use (Regular vs. HiFreq in your sample). Is it achieved using a non-overlapping set of flags and then specifying specific flag in trace macro? Or do I somehow directly specify which one is used? – Uri Cohen Sep 12 '12 at 06:10
  • My understanding is that you use non-overlapping flags. The generated trace statement just takes a flag (and optionally a level). The behind the scenes magic should do the work to log the message to the appropriate control GUID based on the flag. – snoone Sep 12 '12 at 14:07
  • @snoone, what's your view towards WPP tracing nowadays? Base on my experience with Windows 8.1, WPP tracing have been pretty good. – tchau.dev Jun 23 '15 at 00:34