Tracelogging.h 236 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360
  1. #pragma once
  2. //*********************************************************
  3. //
  4. // Copyright (c) Microsoft. All rights reserved.
  5. // This code is licensed under the MIT License.
  6. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
  7. // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  8. // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  9. // PARTICULAR PURPOSE AND NONINFRINGEMENT.
  10. //
  11. //*********************************************************
  12. #ifndef __WIL_TRACELOGGING_H_INCLUDED
  13. #define __WIL_TRACELOGGING_H_INCLUDED
  14. #ifdef _KERNEL_MODE
  15. #error This header is not supported in kernel-mode.
  16. #endif
  17. // Note that we avoid pulling in STL's memory header from TraceLogging.h through Resource.h as we have
  18. // TraceLogging customers who are still on older versions of STL (without std::shared_ptr<>).
  19. #define RESOURCE_SUPPRESS_STL
  20. #ifndef __WIL_RESULT_INCLUDED
  21. #include <wil/result.h>
  22. #endif
  23. #undef RESOURCE_SUPPRESS_STL
  24. #include <winmeta.h>
  25. #include <TraceLoggingProvider.h>
  26. #include <TraceLoggingActivity.h>
  27. #ifndef __WIL_TRACELOGGING_CONFIG_H
  28. #include <wil/traceloggingconfig.h>
  29. #endif
  30. #ifndef TRACELOGGING_SUPPRESS_NEW
  31. #include <new>
  32. #endif
  33. #include <wil/win32_helpers.h>
  34. #pragma warning(push)
  35. #pragma warning(disable: 26135) // Missing locking annotation, Caller failing to hold lock
  36. #ifdef __clang__
  37. #pragma clang diagnostic push
  38. #pragma clang diagnostic ignored "-Wmicrosoft-template-shadow"
  39. #endif
  40. #ifndef __TRACELOGGING_TEST_HOOK_ERROR
  41. #define __TRACELOGGING_TEST_HOOK_ERROR(failure)
  42. #define __TRACELOGGING_TEST_HOOK_ACTIVITY_ERROR(failure)
  43. #define __TRACELOGGING_TEST_HOOK_CALLCONTEXT_ERROR(pFailure, hr)
  44. #define __TRACELOGGING_TEST_HOOK_ACTIVITY_START()
  45. #define __TRACELOGGING_TEST_HOOK_ACTIVITY_STOP(pFailure, hr)
  46. #define __TRACELOGGING_TEST_HOOK_SET_ENABLED false
  47. #define __TRACELOGGING_TEST_HOOK_VERIFY_API_TELEMETRY(nameSpace, apiList, specializationList, countArray, numCounters)
  48. #define __TRACELOGGING_TEST_HOOK_API_TELEMETRY_EVENT_DELAY_MS 5000
  49. #endif
  50. // For use only within wil\TraceLogging.h:
  51. #define _wiltlg_STRINGIZE(x) _wiltlg_STRINGIZE_imp(x)
  52. #define _wiltlg_STRINGIZE_imp(x) #x
  53. #define _wiltlg_LSTRINGIZE(x) _wiltlg_LSTRINGIZE_imp1(x)
  54. #define _wiltlg_LSTRINGIZE_imp1(x) _wiltlg_LSTRINGIZE_imp2(#x)
  55. #define _wiltlg_LSTRINGIZE_imp2(s) L##s
  56. /*
  57. Macro __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(name1, name2):
  58. This macro defines a storage link association between two names for use by the
  59. TlgReflector static analysis tool.
  60. */
  61. #define __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(name1, name2) \
  62. __annotation(L"_TlgProviderLink:|" _wiltlg_LSTRINGIZE(__LINE__) L"|Key|" _wiltlg_LSTRINGIZE(name1) L"=" _wiltlg_LSTRINGIZE(name2))
  63. // Utility macro for writing relevant fields from a wil::FailureInfo structure into a TraceLoggingWrite
  64. // statement. Most fields are relevant for telemetry or for simple ETW, but there are a few additional
  65. // fields reported via ETW.
  66. #define __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure) \
  67. TraceLoggingUInt32((failure).hr, "hresult", "Failure error code"), \
  68. TraceLoggingString((failure).pszFile, "fileName", "Source code file name where the error occurred"), \
  69. TraceLoggingUInt32((failure).uLineNumber, "lineNumber", "Line number within the source code file where the error occurred"), \
  70. TraceLoggingString((failure).pszModule, "module", "Name of the binary where the error occurred"), \
  71. TraceLoggingUInt32(static_cast<DWORD>((failure).type), "failureType", "Indicates what type of failure was observed (exception, returned error, logged error or fail fast"), \
  72. TraceLoggingWideString((failure).pszMessage, "message", "Custom message associated with the failure (if any)"), \
  73. TraceLoggingUInt32((failure).threadId, "threadId", "Identifier of the thread the error occurred on"), \
  74. TraceLoggingString((failure).pszCallContext, "callContext", "List of telemetry activities containing this error"), \
  75. TraceLoggingUInt32((failure).callContextOriginating.contextId, "originatingContextId", "Identifier for the oldest telemetry activity containing this error"), \
  76. TraceLoggingString((failure).callContextOriginating.contextName, "originatingContextName", "Name of the oldest telemetry activity containing this error"), \
  77. TraceLoggingWideString((failure).callContextOriginating.contextMessage, "originatingContextMessage", "Custom message associated with the oldest telemetry activity containing this error (if any)"), \
  78. TraceLoggingUInt32((failure).callContextCurrent.contextId, "currentContextId", "Identifier for the newest telemetry activity containing this error"), \
  79. TraceLoggingString((failure).callContextCurrent.contextName, "currentContextName", "Name of the newest telemetry activity containing this error"), \
  80. TraceLoggingWideString((failure).callContextCurrent.contextMessage, "currentContextMessage", "Custom message associated with the newest telemetry activity containing this error (if any)")
  81. #define __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure) \
  82. __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure), \
  83. TraceLoggingUInt32(static_cast<DWORD>((failure).failureId), "failureId", "Identifier assigned to this failure"), \
  84. TraceLoggingUInt32(static_cast<DWORD>((failure).cFailureCount), "failureCount", "Number of failures seen within the binary where the error occurred"), \
  85. TraceLoggingString((failure).pszFunction, "function", "Name of the function where the error occurred")
  86. // Activity Start Event (ALL)
  87. #define __ACTIVITY_START_PARAMS() \
  88. TraceLoggingStruct(1, "wilActivity"), \
  89. TraceLoggingUInt32(::GetCurrentThreadId(), "threadId", "Identifier of the thread the activity was run on")
  90. // Activity Stop Event (SUCCESSFUL or those WITHOUT full failure info -- just hr)
  91. // Also utilized for intermediate stop events (a successful call to 'Stop()' from a Split activity
  92. #define __ACTIVITY_STOP_PARAMS(hr) \
  93. TraceLoggingStruct(2, "wilActivity"), \
  94. TraceLoggingUInt32(hr, "hresult", "Failure error code"), \
  95. TraceLoggingUInt32(::GetCurrentThreadId(), "threadId", "Identifier of the thread the activity was run on")
  96. // Activity Stop Event (FAILED with full failure info)
  97. #define __ACTIVITY_STOP_TELEMETRY_FAILURE_PARAMS(failure) \
  98. TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \
  99. TraceLoggingStruct(14, "wilActivity"), \
  100. __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure)
  101. #define __ACTIVITY_STOP_TRACELOGGING_FAILURE_PARAMS(failure) \
  102. TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \
  103. TraceLoggingStruct(17, "wilActivity"), \
  104. __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure)
  105. // "ActivityError" tagged event (all distinct FAILURES occurring within the outer activity scope)
  106. #define __ACTIVITY_ERROR_TELEMETRY_FAILURE_PARAMS(failure) \
  107. TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \
  108. TraceLoggingStruct(14, "wilActivity"), \
  109. __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure)
  110. #define __ACTIVITY_ERROR_TRACELOGGING_FAILURE_PARAMS(failure) \
  111. TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \
  112. TraceLoggingStruct(17, "wilActivity"), \
  113. __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure)
  114. // "ActivityFailure" tagged event (only comes through on TELEMETRY for CallContext activities that have FAILED)
  115. #define __ACTIVITY_FAILURE_TELEMETRY_FAILURE_PARAMS(failure) \
  116. TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \
  117. TraceLoggingStruct(14, "wilActivity"), \
  118. __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure)
  119. #define __ACTIVITY_FAILURE_TELEMETRY_PARAMS(hr, contextName, contextMessage) \
  120. TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \
  121. TraceLoggingStruct(4, "wilActivity"), \
  122. TraceLoggingUInt32(hr, "hresult", "Failure error code"), \
  123. TraceLoggingUInt32(::GetCurrentThreadId(), "threadId", "Identifier of the thread the activity was run on"), \
  124. TraceLoggingString(contextName, "currentContextName", "Name of the activity containing this error"), \
  125. TraceLoggingWideString(contextMessage, "currentContextMessage", "Custom message for the activity containing this error (if any)")
  126. // "FallbackError" events (all FAILURE events happening outside of ANY activity context)
  127. #define __RESULT_TELEMETRY_FAILURE_PARAMS(failure) \
  128. TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \
  129. TraceLoggingStruct(14, "wilResult"), \
  130. __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure)
  131. #define __RESULT_TRACELOGGING_FAILURE_PARAMS(failure) \
  132. TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \
  133. TraceLoggingStruct(17, "wilResult"), \
  134. __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure)
  135. namespace wil
  136. {
  137. enum class ActivityOptions
  138. {
  139. None = 0,
  140. TelemetryOnFailure = 0x1,
  141. TraceLoggingOnFailure = 0x2
  142. };
  143. DEFINE_ENUM_FLAG_OPERATORS(ActivityOptions)
  144. template <typename ActivityTraceLoggingType,
  145. ActivityOptions options, UINT64 keyword, UINT8 level, UINT64 privacyTag,
  146. typename TlgReflectorTag>
  147. class ActivityBase;
  148. /// @cond
  149. namespace details
  150. {
  151. // Lazy static initialization helper for holding a singleton telemetry class to maintain
  152. // the provider handle.
  153. template<class T>
  154. class static_lazy
  155. {
  156. public:
  157. void __cdecl cleanup() WI_NOEXCEPT
  158. {
  159. if (wil::init_once_initialized(m_initOnce))
  160. {
  161. reinterpret_cast<T*>(m_storage)->~T();
  162. }
  163. }
  164. T* get(void(__cdecl *cleanupFunc)(void)) WI_NOEXCEPT
  165. {
  166. wil::init_once_failfast(m_initOnce, [=]() -> HRESULT
  167. {
  168. ::new (m_storage) T();
  169. atexit(cleanupFunc);
  170. reinterpret_cast<T*>(m_storage)->Create();
  171. return S_OK;
  172. });
  173. return reinterpret_cast<T*>(m_storage);
  174. }
  175. private:
  176. INIT_ONCE m_initOnce = INIT_ONCE_STATIC_INIT;
  177. alignas(T) BYTE m_storage[sizeof(T)];
  178. };
  179. // This class serves as a simple RAII wrapper around CallContextInfo. It presumes that
  180. // the contextName parameter is always a static string, but copies or allocates the
  181. // contextMessage as needed.
  182. class StoredCallContextInfo : public wil::CallContextInfo
  183. {
  184. public:
  185. StoredCallContextInfo()
  186. {
  187. ::ZeroMemory(this, sizeof(*this));
  188. }
  189. StoredCallContextInfo(StoredCallContextInfo &&other) :
  190. StoredCallContextInfo()
  191. {
  192. operator=(wistd::move(other));
  193. }
  194. StoredCallContextInfo& operator=(StoredCallContextInfo &&other)
  195. {
  196. contextId = other.contextId;
  197. contextName = other.contextName;
  198. ClearMessage();
  199. contextMessage = other.contextMessage;
  200. other.contextMessage = nullptr;
  201. m_ownsMessage = other.m_ownsMessage;
  202. other.m_ownsMessage = false;
  203. return *this;
  204. }
  205. StoredCallContextInfo(StoredCallContextInfo const &other) :
  206. m_ownsMessage(false)
  207. {
  208. contextId = other.contextId;
  209. contextName = other.contextName;
  210. if (other.m_ownsMessage)
  211. {
  212. AssignMessage(other.contextMessage);
  213. }
  214. else
  215. {
  216. contextMessage = other.contextMessage;
  217. }
  218. }
  219. StoredCallContextInfo(_In_opt_ PCSTR staticContextName) :
  220. m_ownsMessage(false)
  221. {
  222. contextId = 0;
  223. contextName = staticContextName;
  224. contextMessage = nullptr;
  225. }
  226. StoredCallContextInfo(PCSTR staticContextName, _Printf_format_string_ PCSTR formatString, va_list argList) :
  227. StoredCallContextInfo(staticContextName)
  228. {
  229. SetMessage(formatString, argList);
  230. }
  231. void SetMessage(_Printf_format_string_ PCSTR formatString, va_list argList)
  232. {
  233. wchar_t loggingMessage[2048];
  234. PrintLoggingMessage(loggingMessage, ARRAYSIZE(loggingMessage), formatString, argList);
  235. ClearMessage();
  236. AssignMessage(loggingMessage);
  237. }
  238. void SetMessage(_In_opt_ PCWSTR message)
  239. {
  240. ClearMessage();
  241. contextMessage = message;
  242. }
  243. void SetMessageCopy(_In_opt_ PCWSTR message)
  244. {
  245. ClearMessage();
  246. if (message != nullptr)
  247. {
  248. AssignMessage(message);
  249. }
  250. }
  251. void ClearMessage()
  252. {
  253. if (m_ownsMessage)
  254. {
  255. WIL_FreeMemory(const_cast<PWSTR>(contextMessage));
  256. m_ownsMessage = false;
  257. }
  258. contextMessage = nullptr;
  259. }
  260. ~StoredCallContextInfo()
  261. {
  262. ClearMessage();
  263. }
  264. StoredCallContextInfo& operator=(StoredCallContextInfo const &) = delete;
  265. private:
  266. void AssignMessage(PCWSTR message)
  267. {
  268. auto length = wcslen(message);
  269. if (length > 0)
  270. {
  271. auto sizeBytes = (length + 1) * sizeof(wchar_t);
  272. contextMessage = static_cast<PCWSTR>(WIL_AllocateMemory(sizeBytes));
  273. if (contextMessage != nullptr)
  274. {
  275. m_ownsMessage = true;
  276. memcpy_s(const_cast<PWSTR>(contextMessage), sizeBytes, message, sizeBytes);
  277. }
  278. }
  279. }
  280. bool m_ownsMessage;
  281. };
  282. template <typename TActivity>
  283. void SetRelatedActivityId(TActivity&)
  284. {
  285. }
  286. #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
  287. template <typename ActivityTraceLoggingType, ActivityOptions options, UINT64 keyword, UINT8 level, UINT64 privacyTag, typename TlgReflectorTag>
  288. void SetRelatedActivityId(wil::ActivityBase<ActivityTraceLoggingType, options, keyword, level, privacyTag, TlgReflectorTag>& activity)
  289. {
  290. GUID capturedRelatedId;
  291. EventActivityIdControl(EVENT_ACTIVITY_CTRL_GET_ID, &capturedRelatedId);
  292. activity.SetRelatedActivityId(capturedRelatedId);
  293. }
  294. #endif
  295. typedef wistd::integral_constant<char, 0> tag_start;
  296. typedef wistd::integral_constant<char, 1> tag_start_cv;
  297. } // namespace details
  298. /// @endcond
  299. // This class acts as a simple RAII class returned by a call to ContinueOnCurrentThread() for an activity
  300. // or by a call to WatchCurrentThread() on a provider. The result is meant to be a stack local variable
  301. // whose scope controls the lifetime of an error watcher on the given thread. That error watcher re-directs
  302. // errors occurrent within the object's lifetime to the associated provider or activity.
  303. class ActivityThreadWatcher
  304. {
  305. public:
  306. ActivityThreadWatcher() WI_NOEXCEPT
  307. : m_callbackHolder(nullptr, nullptr, false)
  308. {}
  309. ActivityThreadWatcher(_In_ details::IFailureCallback *pCallback, PCSTR staticContextName) WI_NOEXCEPT :
  310. m_callContext(staticContextName),
  311. m_callbackHolder(pCallback, &m_callContext)
  312. {
  313. }
  314. ActivityThreadWatcher(_In_ details::IFailureCallback *pCallback, PCSTR staticContextName, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT :
  315. ActivityThreadWatcher(pCallback, staticContextName)
  316. {
  317. m_callContext.SetMessage(formatString, argList);
  318. }
  319. // Uses the supplied StoredCallContextInfo rather than producing one itself
  320. ActivityThreadWatcher(_In_ details::IFailureCallback *pCallback, _In_ details::StoredCallContextInfo const &callContext) WI_NOEXCEPT :
  321. m_callContext(callContext),
  322. m_callbackHolder(pCallback, &m_callContext)
  323. {
  324. }
  325. ActivityThreadWatcher(ActivityThreadWatcher &&other) WI_NOEXCEPT :
  326. m_callContext(wistd::move(other.m_callContext)),
  327. m_callbackHolder(wistd::move(other.m_callbackHolder))
  328. {
  329. m_callbackHolder.SetCallContext(&m_callContext);
  330. }
  331. ActivityThreadWatcher(ActivityThreadWatcher const &) = delete;
  332. ActivityThreadWatcher& operator=(ActivityThreadWatcher const &) = delete;
  333. void SetMessage(_Printf_format_string_ PCSTR formatString, ...)
  334. {
  335. va_list argList;
  336. va_start(argList, formatString);
  337. m_callContext.SetMessage(formatString, argList);
  338. va_end(argList);
  339. }
  340. void SetMessage(_In_opt_ PCWSTR message)
  341. {
  342. m_callContext.SetMessage(message);
  343. }
  344. void SetMessageCopy(_In_opt_ PCWSTR message)
  345. {
  346. m_callContext.SetMessageCopy(message);
  347. }
  348. private:
  349. details::StoredCallContextInfo m_callContext;
  350. details::ThreadFailureCallbackHolder m_callbackHolder;
  351. };
  352. // This is the base-class implementation of a TraceLogging class. TraceLogging classes are defined with
  353. // BEGIN_TRACELOGGING_CLASS and automatically derive from this class
  354. enum class ErrorReportingType
  355. {
  356. None = 0,
  357. Telemetry,
  358. TraceLogging
  359. };
  360. class TraceLoggingProvider : public details::IFailureCallback
  361. {
  362. public:
  363. // Only one instance of each of these derived classes should be created
  364. TraceLoggingProvider(_In_ TraceLoggingProvider const&) = delete;
  365. TraceLoggingProvider& operator=(TraceLoggingProvider const&) = delete;
  366. void* operator new(size_t) = delete;
  367. void* operator new[](size_t) = delete;
  368. protected:
  369. // This can be overridden to provide specific initialization code for any individual provider.
  370. // It will be ran once when the single static singleton instance of this class is created.
  371. virtual void Initialize() WI_NOEXCEPT {}
  372. // This method can be overridden by a provider to more tightly control what happens in the event
  373. // of a failure in a CallContext activity, WatchCurrentThread() object, or attributed to a specific failure.
  374. virtual void OnErrorReported(bool alreadyReported, FailureInfo const &failure) WI_NOEXCEPT
  375. {
  376. if (!alreadyReported && WI_IsFlagClear(failure.flags, FailureFlags::RequestSuppressTelemetry))
  377. {
  378. if (m_errorReportingType == ErrorReportingType::Telemetry)
  379. {
  380. ReportTelemetryFailure(failure);
  381. }
  382. else if (m_errorReportingType == ErrorReportingType::TraceLogging)
  383. {
  384. ReportTraceLoggingFailure(failure);
  385. }
  386. }
  387. }
  388. public:
  389. TraceLoggingHProvider Provider_() const WI_NOEXCEPT
  390. {
  391. return m_providerHandle;
  392. }
  393. protected:
  394. TraceLoggingProvider() WI_NOEXCEPT {}
  395. virtual ~TraceLoggingProvider() WI_NOEXCEPT
  396. {
  397. if (m_ownsProviderHandle)
  398. {
  399. TraceLoggingUnregister(m_providerHandle);
  400. }
  401. }
  402. bool IsEnabled_(UCHAR eventLevel /* WINEVENT_LEVEL_XXX, e.g. WINEVENT_LEVEL_VERBOSE */, ULONGLONG eventKeywords /* MICROSOFT_KEYWORD_XXX */) const WI_NOEXCEPT
  403. {
  404. return ((m_providerHandle != nullptr) && TraceLoggingProviderEnabled(m_providerHandle, eventLevel, eventKeywords)) || __TRACELOGGING_TEST_HOOK_SET_ENABLED;
  405. }
  406. void SetErrorReportingType_(ErrorReportingType type)
  407. {
  408. m_errorReportingType = type;
  409. }
  410. static bool WasAlreadyReportedToTelemetry(long failureId) WI_NOEXCEPT
  411. {
  412. static long volatile s_lastFailureSeen = -1;
  413. auto wasSeen = (s_lastFailureSeen == failureId);
  414. s_lastFailureSeen = failureId;
  415. return wasSeen;
  416. }
  417. void ReportTelemetryFailure(FailureInfo const &failure) WI_NOEXCEPT
  418. {
  419. __TRACELOGGING_TEST_HOOK_ERROR(failure);
  420. TraceLoggingWrite(m_providerHandle, "FallbackError", TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __RESULT_TELEMETRY_FAILURE_PARAMS(failure));
  421. }
  422. void ReportTraceLoggingFailure(FailureInfo const &failure) WI_NOEXCEPT
  423. {
  424. TraceLoggingWrite(m_providerHandle, "FallbackError", TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __RESULT_TRACELOGGING_FAILURE_PARAMS(failure));
  425. }
  426. // Helper function for TraceLoggingError.
  427. // It prints out a trace message for debug purposes. The message does not go into the telemetry.
  428. void ReportTraceLoggingError(_In_ _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT
  429. {
  430. if (IsEnabled_(WINEVENT_LEVEL_ERROR, 0))
  431. {
  432. wchar_t loggingMessage[2048];
  433. details::PrintLoggingMessage(loggingMessage, ARRAYSIZE(loggingMessage), formatString, argList);
  434. TraceLoggingWrite(m_providerHandle, "TraceLoggingError", TraceLoggingLevel(WINEVENT_LEVEL_ERROR), TraceLoggingWideString(loggingMessage, "traceLoggingMessage"));
  435. }
  436. }
  437. // Helper function for TraceLoggingInfo.
  438. // It prints out a trace message for debug purposes. The message does not go into the telemetry.
  439. void ReportTraceLoggingMessage(_In_ _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT
  440. {
  441. if (IsEnabled_(WINEVENT_LEVEL_VERBOSE, 0))
  442. {
  443. wchar_t loggingMessage[2048];
  444. details::PrintLoggingMessage(loggingMessage, ARRAYSIZE(loggingMessage), formatString, argList);
  445. TraceLoggingWrite(m_providerHandle, "TraceLoggingInfo", TraceLoggingLevel(WINEVENT_LEVEL_VERBOSE), TraceLoggingWideString(loggingMessage, "traceLoggingMessage"));
  446. }
  447. }
  448. void Register(TraceLoggingHProvider const providerHandle, TLG_PENABLECALLBACK callback = nullptr) WI_NOEXCEPT
  449. {
  450. // taking over the lifetime and management of providerHandle
  451. m_providerHandle = providerHandle;
  452. m_ownsProviderHandle = true;
  453. TraceLoggingRegisterEx(providerHandle, callback, nullptr);
  454. InternalInitialize();
  455. }
  456. void AttachProvider(TraceLoggingHProvider const providerHandle) WI_NOEXCEPT
  457. {
  458. m_providerHandle = providerHandle;
  459. m_ownsProviderHandle = false;
  460. InternalInitialize();
  461. }
  462. private:
  463. // IFailureCallback
  464. bool NotifyFailure(FailureInfo const &failure) WI_NOEXCEPT override
  465. {
  466. if (!WasAlreadyReportedToTelemetry(failure.failureId))
  467. {
  468. OnErrorReported(false, failure);
  469. }
  470. return true;
  471. }
  472. void InternalInitialize()
  473. {
  474. m_errorReportingType = ErrorReportingType::Telemetry;
  475. Initialize();
  476. }
  477. TraceLoggingHProvider m_providerHandle;
  478. bool m_ownsProviderHandle;
  479. ErrorReportingType m_errorReportingType;
  480. };
  481. template<
  482. typename TraceLoggingType,
  483. UINT64 keyword = 0,
  484. UINT8 level = WINEVENT_LEVEL_VERBOSE,
  485. typename TlgReflectorTag = _TlgReflectorTag_Param0IsProviderType> // helps TlgReflector understand that this is a wrapper type
  486. class BasicActivity
  487. : public _TlgActivityBase<BasicActivity<TraceLoggingType, keyword, level, TlgReflectorTag>, keyword, level>
  488. {
  489. using BaseTy = _TlgActivityBase<BasicActivity<TraceLoggingType, keyword, level, TlgReflectorTag>, keyword, level>;
  490. friend BaseTy;
  491. void OnStarted()
  492. {
  493. }
  494. void OnStopped()
  495. {
  496. }
  497. public:
  498. BasicActivity()
  499. {
  500. }
  501. BasicActivity(BasicActivity&& rhs) :
  502. BaseTy(wistd::move(rhs))
  503. {
  504. }
  505. BasicActivity& operator=(BasicActivity&& rhs)
  506. {
  507. BaseTy::operator=(wistd::move(rhs));
  508. return *this;
  509. }
  510. /*
  511. Returns a handle to the TraceLogging provider associated with this activity.
  512. */
  513. TraceLoggingHProvider Provider() const
  514. {
  515. return TraceLoggingType::Provider();
  516. }
  517. /*
  518. Sets the related (parent) activity.
  519. May only be called once. If used, must be called before starting the activity.
  520. */
  521. template<typename ActivityTy>
  522. void SetRelatedActivity(_In_ const ActivityTy& relatedActivity)
  523. {
  524. this->SetRelatedId(*relatedActivity.Id());
  525. }
  526. /*
  527. Sets the related (parent) activity.
  528. May only be called once. If used, must be called before starting the activity.
  529. */
  530. void SetRelatedActivityId(_In_ const GUID& relatedActivityId)
  531. {
  532. this->SetRelatedId(relatedActivityId);
  533. }
  534. /*
  535. Sets the related (parent) activity.
  536. May only be called once. If used, must be called before starting the activity.
  537. */
  538. void SetRelatedActivityId(_In_ const GUID* relatedActivityId)
  539. {
  540. __FAIL_FAST_IMMEDIATE_ASSERT__(relatedActivityId != NULL);
  541. this->SetRelatedId(*relatedActivityId);
  542. }
  543. };
  544. template<
  545. typename TraceLoggingType,
  546. UINT64 keyword = 0,
  547. UINT8 level = WINEVENT_LEVEL_VERBOSE,
  548. typename TlgReflectorTag = _TlgReflectorTag_Param0IsProviderType> // helps TlgReflector understand that this is a wrapper type
  549. class BasicThreadActivity
  550. : public _TlgActivityBase<BasicThreadActivity<TraceLoggingType, keyword, level, TlgReflectorTag>, keyword, level>
  551. {
  552. using BaseTy = _TlgActivityBase<BasicThreadActivity<TraceLoggingType, keyword, level, TlgReflectorTag>, keyword, level>;
  553. friend BaseTy;
  554. void OnStarted()
  555. {
  556. this->PushThreadActivityId();
  557. }
  558. void OnStopped()
  559. {
  560. this->PopThreadActivityId();
  561. }
  562. public:
  563. BasicThreadActivity()
  564. {
  565. }
  566. BasicThreadActivity(BasicThreadActivity&& rhs)
  567. : BaseTy(wistd::move(rhs))
  568. {
  569. }
  570. BasicThreadActivity& operator=(BasicThreadActivity&& rhs)
  571. {
  572. BaseTy::operator=(wistd::move(rhs));
  573. return *this;
  574. }
  575. /*
  576. Returns a handle to the TraceLogging provider associated with this activity.
  577. */
  578. TraceLoggingHProvider Provider() const
  579. {
  580. return TraceLoggingType::Provider();
  581. }
  582. };
  583. #define __WI_TraceLoggingWriteTagged(activity, name, ...) \
  584. __pragma(warning(push)) __pragma(warning(disable:4127)) \
  585. do { \
  586. _tlgActivityDecl(activity) \
  587. TraceLoggingWriteActivity( \
  588. TraceLoggingType::Provider(), \
  589. (name), \
  590. _tlgActivityRef(activity).Id(), \
  591. NULL, \
  592. __VA_ARGS__); \
  593. } while(0) \
  594. __pragma(warning(pop)) \
  595. // This is the ultimate base class implementation for all activities. Activity classes are defined with
  596. // DEFINE_TRACELOGGING_ACTIVITY, DEFINE_CALLCONTEXT_ACTIVITY, DEFINE_TELEMETRY_ACTIVITY and others
  597. template <typename ActivityTraceLoggingType,
  598. ActivityOptions options = ActivityOptions::None, UINT64 keyword = 0, UINT8 level = WINEVENT_LEVEL_VERBOSE, UINT64 privacyTag = 0,
  599. typename TlgReflectorTag = _TlgReflectorTag_Param0IsProviderType>
  600. class ActivityBase : public details::IFailureCallback
  601. {
  602. public:
  603. typedef ActivityTraceLoggingType TraceLoggingType;
  604. static UINT64 const Keyword = keyword;
  605. static UINT8 const Level = level;
  606. static UINT64 const PrivacyTag = privacyTag;
  607. ActivityBase(PCSTR contextName, bool shouldWatchErrors = false) WI_NOEXCEPT :
  608. m_activityData(contextName),
  609. m_pActivityData(&m_activityData),
  610. m_callbackHolder(this, m_activityData.GetCallContext(), shouldWatchErrors)
  611. {
  612. }
  613. ActivityBase(ActivityBase &&other, bool shouldWatchErrors) WI_NOEXCEPT :
  614. m_activityData(wistd::move(other.m_activityData)),
  615. m_sharedActivityData(wistd::move(other.m_sharedActivityData)),
  616. m_callbackHolder(this, nullptr, shouldWatchErrors)
  617. {
  618. m_pActivityData = m_sharedActivityData ? m_sharedActivityData.get() : &m_activityData;
  619. m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext());
  620. other.m_pActivityData = &other.m_activityData;
  621. if (other.m_callbackHolder.IsWatching())
  622. {
  623. other.m_callbackHolder.StopWatching();
  624. }
  625. }
  626. ActivityBase(ActivityBase &&other) WI_NOEXCEPT :
  627. ActivityBase(wistd::move(other), other.m_callbackHolder.IsWatching())
  628. {
  629. }
  630. ActivityBase(ActivityBase const &other) WI_NOEXCEPT :
  631. m_activityData(),
  632. m_pActivityData(&m_activityData),
  633. m_callbackHolder(this, nullptr, false) // false = do not automatically watch for failures
  634. {
  635. operator=(other);
  636. }
  637. ActivityBase& operator=(ActivityBase &&other) WI_NOEXCEPT
  638. {
  639. m_activityData = wistd::move(other.m_activityData);
  640. m_sharedActivityData = wistd::move(other.m_sharedActivityData);
  641. m_pActivityData = m_sharedActivityData ? m_sharedActivityData.get() : &m_activityData;
  642. m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext());
  643. m_callbackHolder.SetWatching(other.m_callbackHolder.IsWatching());
  644. other.m_pActivityData = &other.m_activityData;
  645. if (other.m_callbackHolder.IsWatching())
  646. {
  647. other.m_callbackHolder.StopWatching();
  648. }
  649. return *this;
  650. }
  651. ActivityBase& operator=(ActivityBase const &other) WI_NOEXCEPT
  652. {
  653. if (m_callbackHolder.IsWatching())
  654. {
  655. m_callbackHolder.StopWatching();
  656. }
  657. if (other.m_sharedActivityData)
  658. {
  659. m_pActivityData = other.m_pActivityData;
  660. m_sharedActivityData = other.m_sharedActivityData;
  661. }
  662. else if (m_sharedActivityData.create(wistd::move(other.m_activityData)))
  663. {
  664. // Locking should not be required as the first copy should always take place on the owning
  665. // thread...
  666. m_pActivityData = m_sharedActivityData.get();
  667. other.m_sharedActivityData = m_sharedActivityData;
  668. other.m_pActivityData = m_pActivityData;
  669. other.m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext());
  670. }
  671. m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext());
  672. return *this;
  673. }
  674. // These calls all result in setting a message to associate with any failures that might occur while
  675. // running the activity. For example, you could associate a filename with a call context activity
  676. // so that the file name is only reported if the activity fails with the failure.
  677. void SetMessage(_In_ _Printf_format_string_ PCSTR formatString, ...)
  678. {
  679. va_list argList;
  680. va_start(argList, formatString);
  681. auto lock = LockExclusive();
  682. GetCallContext()->SetMessage(formatString, argList);
  683. va_end(argList);
  684. }
  685. void SetMessage(_In_opt_ PCWSTR message)
  686. {
  687. auto lock = LockExclusive();
  688. GetCallContext()->SetMessage(message);
  689. }
  690. void SetMessageCopy(_In_opt_ PCWSTR message)
  691. {
  692. auto lock = LockExclusive();
  693. GetCallContext()->SetMessageCopy(message);
  694. }
  695. // This call stops watching for errors on the thread that the activity was originally
  696. // created on. Use it when moving the activity into a thread-agnostic class or moving
  697. // an activity across threads.
  698. void IgnoreCurrentThread() WI_NOEXCEPT
  699. {
  700. if (m_callbackHolder.IsWatching())
  701. {
  702. m_callbackHolder.StopWatching();
  703. }
  704. }
  705. // Call this API to retrieve an RAII object to watch events on the current thread. The returned
  706. // object should only be used on the stack.
  707. WI_NODISCARD ActivityThreadWatcher ContinueOnCurrentThread() WI_NOEXCEPT
  708. {
  709. if (IsRunning())
  710. {
  711. return ActivityThreadWatcher(this, *m_pActivityData->GetCallContext());
  712. }
  713. return ActivityThreadWatcher();
  714. }
  715. // This is the 'default' Stop routine that accepts an HRESULT and completes the activity...
  716. void Stop(HRESULT hr = S_OK) WI_NOEXCEPT
  717. {
  718. bool stopActivity;
  719. HRESULT hrLocal;
  720. {
  721. auto lock = LockExclusive();
  722. stopActivity = m_pActivityData->SetStopResult(hr, &hrLocal);
  723. }
  724. if (stopActivity)
  725. {
  726. ReportStopActivity(hrLocal);
  727. }
  728. else
  729. {
  730. __WI_TraceLoggingWriteTagged(*this, "ActivityIntermediateStop", TraceLoggingKeyword(Keyword), TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), __ACTIVITY_STOP_PARAMS(hr));
  731. }
  732. IgnoreCurrentThread();
  733. }
  734. // IFailureCallback
  735. bool NotifyFailure(FailureInfo const &failure) WI_NOEXCEPT override
  736. {
  737. // We always report errors to the ETW stream, but we hold-back the telemetry keyword if we've already reported this error to this
  738. // particular telemetry provider.
  739. __TRACELOGGING_TEST_HOOK_ACTIVITY_ERROR(failure);
  740. if (WI_IsFlagClear(failure.flags, FailureFlags::RequestSuppressTelemetry))
  741. {
  742. #ifdef __clang__
  743. #pragma clang diagnostic push
  744. #pragma clang diagnostic ignored "-Wunused-value"
  745. #endif
  746. #pragma warning(push)
  747. #pragma warning(disable: 6319)
  748. if (false, WI_IsFlagSet(options, ActivityOptions::TelemetryOnFailure) && !WasAlreadyReportedToTelemetry(failure.failureId))
  749. {
  750. __WI_TraceLoggingWriteTagged(*this, "ActivityError", TraceLoggingKeyword(Keyword | MICROSOFT_KEYWORD_TELEMETRY), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __ACTIVITY_ERROR_TELEMETRY_FAILURE_PARAMS(failure));
  751. }
  752. else if (false, WI_IsFlagSet(options, ActivityOptions::TraceLoggingOnFailure))
  753. {
  754. __WI_TraceLoggingWriteTagged(*this, "ActivityError", TraceLoggingKeyword(0), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __ACTIVITY_ERROR_TRACELOGGING_FAILURE_PARAMS(failure));
  755. }
  756. else
  757. {
  758. __WI_TraceLoggingWriteTagged(*this, "ActivityError", TraceLoggingKeyword(Keyword), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __ACTIVITY_ERROR_TRACELOGGING_FAILURE_PARAMS(failure));
  759. }
  760. #pragma warning(pop)
  761. #ifdef __clang__
  762. #pragma clang diagnostic pop
  763. #endif
  764. }
  765. auto lock = LockExclusive();
  766. m_pActivityData->NotifyFailure(failure);
  767. return true;
  768. }
  769. // This is the base TraceLoggingActivity<> contract... we implement it so that this class
  770. // can be used by all of the activity macros and we re-route the request as needed.
  771. //
  772. // The contract required by the TraceLogging Activity macros is:
  773. // - activity.Keyword // compile-time constant
  774. // - activity.Level // compile-time constant
  775. // - activity.PrivacyTag // compile-time constant
  776. // - activity.Provider()
  777. // - activity.Id()
  778. // - activity.zInternalRelatedId()
  779. // - activity.zInternalStart()
  780. // - activity.zInternalStop()
  781. // In addition, for TlgReflector to work correctly, it must be possible for
  782. // TlgReflector to statically map from typeof(activity) to hProvider.
  783. GUID const* zInternalRelatedId() const WI_NOEXCEPT
  784. {
  785. return m_pActivityData->zInternalRelatedId();
  786. }
  787. void zInternalStart() WI_NOEXCEPT
  788. {
  789. auto lock = LockExclusive(); m_pActivityData->zInternalStart();
  790. }
  791. void zInternalStop() WI_NOEXCEPT
  792. {
  793. auto lock = LockExclusive(); m_pActivityData->zInternalStop();
  794. }
  795. static TraceLoggingHProvider Provider() WI_NOEXCEPT
  796. {
  797. return ActivityTraceLoggingType::Provider();
  798. }
  799. GUID const* Id() const WI_NOEXCEPT
  800. {
  801. return m_pActivityData->Id();
  802. }
  803. GUID const* providerGuid() const WI_NOEXCEPT
  804. {
  805. return m_pActivityData->providerGuid();
  806. }
  807. template<class OtherTy>
  808. void SetRelatedActivity(OtherTy const &relatedActivity) WI_NOEXCEPT
  809. {
  810. auto lock = LockExclusive();
  811. m_pActivityData->SetRelatedActivityId(relatedActivity.Id());
  812. }
  813. void SetRelatedActivityId(_In_ const GUID& relatedActivityId) WI_NOEXCEPT
  814. {
  815. auto lock = LockExclusive();
  816. m_pActivityData->SetRelatedActivityId(&relatedActivityId);
  817. }
  818. void SetRelatedActivityId(_In_ const GUID* relatedActivityId) WI_NOEXCEPT
  819. {
  820. auto lock = LockExclusive();
  821. m_pActivityData->SetRelatedActivityId(relatedActivityId);
  822. }
  823. inline bool IsRunning() const WI_NOEXCEPT
  824. {
  825. return m_pActivityData->NeedsStopped();
  826. }
  827. protected:
  828. virtual void StopActivity() WI_NOEXCEPT = 0;
  829. virtual bool WasAlreadyReportedToTelemetry(long failureId) WI_NOEXCEPT = 0;
  830. void EnsureWatchingCurrentThread()
  831. {
  832. if (!m_callbackHolder.IsWatching())
  833. {
  834. m_callbackHolder.StartWatching();
  835. }
  836. }
  837. void SetStopResult(HRESULT hr, _Out_opt_ HRESULT *phr = nullptr) WI_NOEXCEPT
  838. {
  839. auto lock = LockExclusive();
  840. m_pActivityData->SetStopResult(hr, phr);
  841. }
  842. void IncrementExpectedStopCount() WI_NOEXCEPT
  843. {
  844. auto lock = LockExclusive();
  845. m_pActivityData->IncrementExpectedStopCount();
  846. }
  847. // Locking should not be required on these accessors as we only use this at reporting (which will only happen from
  848. // the final stop)
  849. FailureInfo const * GetFailureInfo() WI_NOEXCEPT
  850. {
  851. return m_pActivityData->GetFailureInfo();
  852. }
  853. inline HRESULT GetResult() const WI_NOEXCEPT
  854. {
  855. return m_pActivityData->GetResult();
  856. }
  857. details::StoredCallContextInfo *GetCallContext() const WI_NOEXCEPT
  858. {
  859. return m_pActivityData->GetCallContext();
  860. }
  861. // Think of this routine as the destructor -- since we need to call virtual derived methods, we can't use it as
  862. // a destructor without a pure virtual method call, so we have the derived class call it in its destructor...
  863. void Destroy() WI_NOEXCEPT
  864. {
  865. bool fStop = true;
  866. if (m_sharedActivityData)
  867. {
  868. // The lock unifies the 'unique()' check and the 'reset()' of any non-unique activity so that we
  869. // can positively identify the final release of the internal data
  870. auto lock = LockExclusive();
  871. if (!m_sharedActivityData.unique())
  872. {
  873. fStop = false;
  874. m_sharedActivityData.reset();
  875. }
  876. }
  877. if (fStop && m_pActivityData->NeedsStopped())
  878. {
  879. ReportStopActivity(m_pActivityData->SetUnhandledException());
  880. }
  881. }
  882. private:
  883. void ReportStopActivity(HRESULT hr) WI_NOEXCEPT
  884. {
  885. if (FAILED(hr) && WI_AreAllFlagsClear(Keyword, (MICROSOFT_KEYWORD_TELEMETRY | MICROSOFT_KEYWORD_MEASURES | MICROSOFT_KEYWORD_CRITICAL_DATA)) && WI_IsFlagSet(options, ActivityOptions::TelemetryOnFailure))
  886. {
  887. wil::FailureInfo const* pFailure = GetFailureInfo();
  888. if (pFailure != nullptr)
  889. {
  890. __TRACELOGGING_TEST_HOOK_CALLCONTEXT_ERROR(pFailure, pFailure->hr);
  891. auto & failure = *pFailure;
  892. __WI_TraceLoggingWriteTagged(*this, "ActivityFailure", TraceLoggingKeyword(Keyword | MICROSOFT_KEYWORD_TELEMETRY), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __ACTIVITY_FAILURE_TELEMETRY_FAILURE_PARAMS(failure));
  893. }
  894. else
  895. {
  896. __TRACELOGGING_TEST_HOOK_CALLCONTEXT_ERROR(nullptr, hr);
  897. __WI_TraceLoggingWriteTagged(*this, "ActivityFailure", TraceLoggingKeyword(Keyword | MICROSOFT_KEYWORD_TELEMETRY), TraceLoggingLevel(WINEVENT_LEVEL_ERROR),
  898. __ACTIVITY_FAILURE_TELEMETRY_PARAMS(hr, m_pActivityData->GetCallContext()->contextName, m_pActivityData->GetCallContext()->contextMessage));
  899. }
  900. }
  901. StopActivity();
  902. }
  903. rwlock_release_exclusive_scope_exit LockExclusive() WI_NOEXCEPT
  904. {
  905. // We only need to lock when we're sharing....
  906. return (m_sharedActivityData ? m_sharedActivityData->LockExclusive() : rwlock_release_exclusive_scope_exit());
  907. }
  908. template <typename ActivityTraceLoggingType,
  909. typename TlgReflectorTag = _TlgReflectorTag_Param0IsProviderType>
  910. class ActivityData :
  911. public _TlgActivityBase<ActivityData<ActivityTraceLoggingType, TlgReflectorTag>, keyword, level>
  912. {
  913. using BaseTy = _TlgActivityBase<ActivityData<ActivityTraceLoggingType, TlgReflectorTag>, keyword, level>;
  914. friend BaseTy;
  915. void OnStarted() {}
  916. void OnStopped() {}
  917. // SFINAE dispatching on presence of ActivityTraceLoggingType::CreateActivityId(_Out_ GUID& childActivityId, _In_opt_ const GUID* relatedActivityId)
  918. template<typename ProviderType>
  919. auto CreateActivityIdByProviderType(int, _Out_ GUID& childActivityId) ->
  920. decltype(ProviderType::CreateActivityId(childActivityId, this->GetRelatedId()), (void)0)
  921. {
  922. ProviderType::CreateActivityId(childActivityId, this->GetRelatedId());
  923. }
  924. template<typename ProviderType>
  925. auto CreateActivityIdByProviderType(long, _Out_ GUID& childActivityId) ->
  926. void
  927. {
  928. EventActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, &childActivityId);
  929. }
  930. void CreateActivityId(_Out_ GUID& childActivityId)
  931. {
  932. CreateActivityIdByProviderType<ActivityTraceLoggingType>(0, childActivityId);
  933. }
  934. public:
  935. ActivityData(_In_opt_ PCSTR contextName = nullptr) WI_NOEXCEPT :
  936. BaseTy(),
  937. m_callContext(contextName),
  938. m_result(S_OK),
  939. m_stopCountExpected(1)
  940. {
  941. }
  942. ActivityData(ActivityData &&other) WI_NOEXCEPT :
  943. BaseTy(wistd::move(other)),
  944. m_callContext(wistd::move(other.m_callContext)),
  945. m_result(other.m_result),
  946. m_failure(wistd::move(other.m_failure)),
  947. m_stopCountExpected(other.m_stopCountExpected)
  948. {
  949. }
  950. ActivityData & operator=(ActivityData &&other) WI_NOEXCEPT
  951. {
  952. BaseTy::operator=(wistd::move(other));
  953. m_callContext = wistd::move(other.m_callContext);
  954. m_result = other.m_result;
  955. m_failure = wistd::move(other.m_failure);
  956. m_stopCountExpected = other.m_stopCountExpected;
  957. return *this;
  958. }
  959. ActivityData(ActivityData const &other) = delete;
  960. ActivityData & operator=(ActivityData const &other) = delete;
  961. // returns true if the event was reported to telemetry
  962. void NotifyFailure(FailureInfo const &failure) WI_NOEXCEPT
  963. {
  964. if ((failure.hr != m_failure.GetFailureInfo().hr) && // don't replace with the same error (likely propagation up the stack)
  965. ((failure.hr != m_result) || SUCCEEDED(m_result))) // don't replace if we've already got the current explicitly supplied failure code
  966. {
  967. m_failure.SetFailureInfo(failure);
  968. }
  969. }
  970. rwlock_release_exclusive_scope_exit LockExclusive() WI_NOEXCEPT
  971. {
  972. return m_lock.lock_exclusive();
  973. }
  974. static TraceLoggingHProvider Provider()
  975. {
  976. return ActivityTraceLoggingType::Provider();
  977. }
  978. bool NeedsStopped() const WI_NOEXCEPT
  979. {
  980. return BaseTy::IsStarted();
  981. }
  982. void SetRelatedActivityId(const GUID* relatedId)
  983. {
  984. this->SetRelatedId(*relatedId);
  985. }
  986. bool SetStopResult(HRESULT hr, _Out_opt_ HRESULT *phr) WI_NOEXCEPT
  987. {
  988. // We must be expecting at least one Stop -- otherwise the caller is calling Stop() more times
  989. // than it can (normally once, or +1 for each call to Split())
  990. __FAIL_FAST_IMMEDIATE_ASSERT__(m_stopCountExpected >= 1);
  991. if (SUCCEEDED(m_result))
  992. {
  993. m_result = hr;
  994. }
  995. if (phr != nullptr)
  996. {
  997. *phr = m_result;
  998. }
  999. return ((--m_stopCountExpected) == 0);
  1000. }
  1001. HRESULT SetUnhandledException() WI_NOEXCEPT
  1002. {
  1003. HRESULT hr = m_failure.GetFailureInfo().hr;
  1004. SetStopResult(FAILED(hr) ? hr : HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION), &hr);
  1005. return hr;
  1006. }
  1007. void IncrementExpectedStopCount() WI_NOEXCEPT
  1008. {
  1009. m_stopCountExpected++;
  1010. }
  1011. FailureInfo const *GetFailureInfo() const WI_NOEXCEPT
  1012. {
  1013. return (FAILED(m_result) && (m_result == m_failure.GetFailureInfo().hr)) ? &m_failure.GetFailureInfo() : nullptr;
  1014. }
  1015. inline HRESULT GetResult() const WI_NOEXCEPT
  1016. {
  1017. return m_result;
  1018. }
  1019. details::StoredCallContextInfo *GetCallContext() WI_NOEXCEPT
  1020. {
  1021. return &m_callContext;
  1022. }
  1023. private:
  1024. details::StoredCallContextInfo m_callContext;
  1025. HRESULT m_result;
  1026. StoredFailureInfo m_failure;
  1027. int m_stopCountExpected;
  1028. wil::srwlock m_lock;
  1029. };
  1030. mutable ActivityData<ActivityTraceLoggingType, TlgReflectorTag> m_activityData;
  1031. mutable ActivityData<ActivityTraceLoggingType, TlgReflectorTag> *m_pActivityData;
  1032. mutable details::shared_object<ActivityData<ActivityTraceLoggingType, TlgReflectorTag>> m_sharedActivityData;
  1033. mutable details::ThreadFailureCallbackHolder m_callbackHolder;
  1034. };
  1035. } // namespace wil
  1036. // Internal MACRO implementation of Activities.
  1037. // Do NOT use these macros directly.
  1038. #define __WI_TraceLoggingWriteStart(activity, name, ...) \
  1039. __pragma(warning(push)) __pragma(warning(disable:4127)) \
  1040. do { \
  1041. _tlgActivityDecl(activity) \
  1042. static const UINT64 _tlgActivity_Keyword = _tlgActivityRef(activity).Keyword;\
  1043. static const UINT8 _tlgActivity_Level = _tlgActivityRef(activity).Level;\
  1044. static const UINT64 _tlgActivityPrivacyTag = _tlgActivityRef(activity).PrivacyTag;\
  1045. static_assert( \
  1046. _tlgActivity_Keyword == (_tlgActivity_Keyword _tlg_FOREACH(_tlgKeywordVal, __VA_ARGS__)), \
  1047. "Do not use TraceLoggingKeyword in TraceLoggingWriteStart. Keywords for START events are " \
  1048. "specified in the activity type, e.g. TraceLoggingActivity<Provider,Keyword,Level>."); \
  1049. static_assert( \
  1050. _tlgActivity_Level == (_tlgActivity_Level _tlg_FOREACH(_tlgLevelVal, __VA_ARGS__)), \
  1051. "Do not use TraceLoggingLevel in TraceLoggingWriteStart. The Level for START events is " \
  1052. "specified in the activity type, e.g. TraceLoggingActivity<Provider,Keyword,Level>."); \
  1053. _tlgActivityRef(activity).zInternalStart(); \
  1054. TraceLoggingWriteActivity( \
  1055. TraceLoggingType::Provider(), \
  1056. (name), \
  1057. _tlgActivityRef(activity).Id(), \
  1058. _tlgActivityRef(activity).zInternalRelatedId(), \
  1059. TraceLoggingOpcode(1 /* WINEVENT_OPCODE_START */), \
  1060. TraceLoggingKeyword(_tlgActivity_Keyword), \
  1061. TraceLoggingLevel(_tlgActivity_Level), \
  1062. TelemetryPrivacyDataTag(_tlgActivityPrivacyTag), \
  1063. TraceLoggingDescription("~^" _wiltlg_LSTRINGIZE(activity) L"^~"), \
  1064. __VA_ARGS__); \
  1065. } while(0) \
  1066. __pragma(warning(pop)) \
  1067. #define __WRITE_ACTIVITY_START(EventId, ...) \
  1068. __TRACELOGGING_TEST_HOOK_ACTIVITY_START(); \
  1069. __WI_TraceLoggingWriteStart(*this, #EventId, __ACTIVITY_START_PARAMS(), __VA_ARGS__); \
  1070. EnsureWatchingCurrentThread()
  1071. #define __WI_TraceLoggingWriteStop(activity, name, ...) \
  1072. __pragma(warning(push)) __pragma(warning(disable:4127)) \
  1073. do { \
  1074. _tlgActivityDecl(activity) \
  1075. static const UINT64 _tlgActivity_Keyword = _tlgActivityRef(activity).Keyword;\
  1076. static const UINT8 _tlgActivity_Level = _tlgActivityRef(activity).Level;\
  1077. static const UINT64 _tlgActivityPrivacyTag = _tlgActivityRef(activity).PrivacyTag;\
  1078. static_assert( \
  1079. _tlgActivity_Keyword == (_tlgActivity_Keyword _tlg_FOREACH(_tlgKeywordVal, __VA_ARGS__)), \
  1080. "Do not use TraceLoggingKeyword in TraceLoggingWriteStop. Keywords for STOP events are " \
  1081. "specified in the activity type, e.g. TraceLoggingActivity<Provider,Keyword,Level>."); \
  1082. static_assert( \
  1083. _tlgActivity_Level == (_tlgActivity_Level _tlg_FOREACH(_tlgLevelVal, __VA_ARGS__)), \
  1084. "Do not use TraceLoggingLevel in TraceLoggingWriteStop. The Level for STOP events is " \
  1085. "specified in the activity type, e.g. TraceLoggingActivity<Provider,Keyword,Level>."); \
  1086. _tlgActivityRef(activity).zInternalStop(); \
  1087. TraceLoggingWriteActivity( \
  1088. TraceLoggingType::Provider(), \
  1089. (name), \
  1090. _tlgActivityRef(activity).Id(), \
  1091. NULL, \
  1092. TraceLoggingOpcode(2 /* WINEVENT_OPCODE_STOP */),\
  1093. TraceLoggingKeyword(_tlgActivity_Keyword),\
  1094. TraceLoggingLevel(_tlgActivity_Level),\
  1095. TelemetryPrivacyDataTag(_tlgActivityPrivacyTag), \
  1096. TraceLoggingDescription("~^" _wiltlg_LSTRINGIZE(activity) L"^~"),\
  1097. __VA_ARGS__); \
  1098. } while(0) \
  1099. __pragma(warning(pop)) \
  1100. #define __WRITE_ACTIVITY_STOP(EventId, ...) \
  1101. wil::FailureInfo const* pFailure = GetFailureInfo(); \
  1102. if (pFailure != nullptr) \
  1103. { \
  1104. __TRACELOGGING_TEST_HOOK_ACTIVITY_STOP(pFailure, pFailure->hr); \
  1105. auto &failure = *pFailure; \
  1106. if (false, WI_IsAnyFlagSet(Keyword, (MICROSOFT_KEYWORD_TELEMETRY | MICROSOFT_KEYWORD_MEASURES | MICROSOFT_KEYWORD_CRITICAL_DATA))) \
  1107. { \
  1108. __WI_TraceLoggingWriteStop(*this, #EventId, __ACTIVITY_STOP_TELEMETRY_FAILURE_PARAMS(failure), __VA_ARGS__); \
  1109. } \
  1110. else \
  1111. { \
  1112. __WI_TraceLoggingWriteStop(*this, #EventId, __ACTIVITY_STOP_TRACELOGGING_FAILURE_PARAMS(failure), __VA_ARGS__); \
  1113. } \
  1114. } \
  1115. else \
  1116. { \
  1117. __TRACELOGGING_TEST_HOOK_ACTIVITY_STOP(nullptr, GetResult()); \
  1118. __WI_TraceLoggingWriteStop(*this, #EventId, __ACTIVITY_STOP_PARAMS(GetResult()), __VA_ARGS__); \
  1119. } \
  1120. IgnoreCurrentThread();
  1121. // optional params are: KeyWord, Level, PrivacyTags, Options
  1122. #define __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, ...) \
  1123. class ActivityClassName final : public wil::ActivityBase<TraceLoggingType, __VA_ARGS__> \
  1124. { \
  1125. protected: \
  1126. void StopActivity() WI_NOEXCEPT override \
  1127. { __WRITE_ACTIVITY_STOP(ActivityClassName); } \
  1128. bool WasAlreadyReportedToTelemetry(long failureId) WI_NOEXCEPT override \
  1129. { return TraceLoggingType::WasAlreadyReportedToTelemetry(failureId); } \
  1130. public: \
  1131. static bool IsEnabled() WI_NOEXCEPT \
  1132. { return TraceLoggingType::IsEnabled(); } \
  1133. ~ActivityClassName() WI_NOEXCEPT { ActivityBase::Destroy(); } \
  1134. ActivityClassName(ActivityClassName const &other) WI_NOEXCEPT : ActivityBase(other) {} \
  1135. ActivityClassName(ActivityClassName &&other) WI_NOEXCEPT : ActivityBase(wistd::move(other)) {} \
  1136. ActivityClassName(ActivityClassName &&other, bool shouldWatchErrors) WI_NOEXCEPT : ActivityBase(wistd::move(other), shouldWatchErrors) {} \
  1137. ActivityClassName& operator=(ActivityClassName const &other) WI_NOEXCEPT \
  1138. { ActivityBase::operator=(other); return *this; } \
  1139. ActivityClassName& operator=(ActivityClassName &&other) WI_NOEXCEPT \
  1140. { auto localActivity(wistd::move(*this)); ActivityBase::operator=(wistd::move(other)); return *this; } \
  1141. explicit operator bool() const WI_NOEXCEPT \
  1142. { return IsRunning(); } \
  1143. void StopWithResult(HRESULT hr) \
  1144. { ActivityBase::Stop(hr); } \
  1145. template<typename... TArgs> \
  1146. void StopWithResult(HRESULT hr, TArgs&&... args) \
  1147. { SetStopResult(hr); Stop(wistd::forward<TArgs>(args)...); } \
  1148. void Stop(HRESULT hr = S_OK) WI_NOEXCEPT \
  1149. { ActivityBase::Stop(hr); } \
  1150. void StartActivity() WI_NOEXCEPT \
  1151. { __WRITE_ACTIVITY_START(ActivityClassName); } \
  1152. void StartRelatedActivity() WI_NOEXCEPT \
  1153. { wil::details::SetRelatedActivityId(*this); StartActivity(); } \
  1154. void StartActivityWithCorrelationVector(PCSTR correlationVector) WI_NOEXCEPT \
  1155. { __WRITE_ACTIVITY_START(ActivityClassName, TraceLoggingString(correlationVector, "__TlgCV__")); } \
  1156. WI_NODISCARD ActivityClassName Split() WI_NOEXCEPT \
  1157. { __FAIL_FAST_IMMEDIATE_ASSERT__(IsRunning()); IncrementExpectedStopCount(); return ActivityClassName(*this); } \
  1158. WI_NODISCARD ActivityClassName TransferToCurrentThread() WI_NOEXCEPT \
  1159. { return ActivityClassName(wistd::move(*this), IsRunning()); } \
  1160. WI_NODISCARD ActivityClassName TransferToMember() WI_NOEXCEPT \
  1161. { return ActivityClassName(wistd::move(*this), false); }
  1162. #define __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) \
  1163. private: \
  1164. template<typename... TArgs> \
  1165. ActivityClassName(wil::details::tag_start, TArgs&&... args) WI_NOEXCEPT : ActivityBase(#ActivityClassName) \
  1166. { StartActivity(wistd::forward<TArgs>(args)...); \
  1167. __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK("this", ActivityClassName); } \
  1168. template<typename... TArgs> \
  1169. ActivityClassName(wil::details::tag_start_cv, _In_opt_ PCSTR correlationVector, TArgs&&... args) WI_NOEXCEPT : ActivityBase(#ActivityClassName) \
  1170. { StartActivityWithCorrelationVector(correlationVector, wistd::forward<TArgs>(args)...); \
  1171. __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK("this", ActivityClassName); } \
  1172. public: \
  1173. ActivityClassName() WI_NOEXCEPT : ActivityBase(#ActivityClassName, false) {} \
  1174. template<typename... TArgs> \
  1175. WI_NODISCARD static ActivityClassName Start(TArgs&&... args) \
  1176. { return ActivityClassName(wil::details::tag_start(), wistd::forward<TArgs>(args)...); } \
  1177. template<typename... TArgs> \
  1178. WI_NODISCARD static ActivityClassName StartWithCorrelationVector(_In_ PCSTR correlationVector, TArgs&&... args) \
  1179. { return ActivityClassName(wil::details::tag_start_cv(), correlationVector, wistd::forward<TArgs>(args)...); }
  1180. #define __IMPLEMENT_CALLCONTEXT_CLASS(ActivityClassName) \
  1181. protected: \
  1182. ActivityClassName(_In_ void **, PCSTR contextName, _In_opt_ _Printf_format_string_ PCSTR formatString, _In_opt_ va_list argList) : \
  1183. ActivityBase(contextName) \
  1184. { GetCallContext()->SetMessage(formatString, argList); StartActivity(); } \
  1185. ActivityClassName(_In_ void **, PCSTR contextName) : \
  1186. ActivityBase(contextName) \
  1187. { StartActivity(); } \
  1188. public: \
  1189. ActivityClassName(PCSTR contextName) : ActivityBase(contextName, false) {} \
  1190. ActivityClassName(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT : ActivityClassName(contextName) \
  1191. { va_list argList; va_start(argList, formatString); GetCallContext()->SetMessage(formatString, argList); } \
  1192. WI_NODISCARD static ActivityClassName Start(PCSTR contextName) WI_NOEXCEPT \
  1193. { return ActivityClassName(static_cast<void **>(__nullptr), contextName); } \
  1194. WI_NODISCARD static ActivityClassName Start(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \
  1195. { va_list argList; va_start(argList, formatString); return ActivityClassName(static_cast<void **>(__nullptr), contextName, formatString, argList); }
  1196. #define __END_TRACELOGGING_ACTIVITY_CLASS() \
  1197. };
  1198. #ifdef _GENERIC_PARTB_FIELDS_ENABLED
  1199. #define _TLGWRITE_GENERIC_PARTB_FIELDS _GENERIC_PARTB_FIELDS_ENABLED,
  1200. #endif
  1201. #define DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, ...) \
  1202. void EventId() \
  1203. { \
  1204. __WI_TraceLoggingWriteTagged(*this, #EventId, _TLGWRITE_GENERIC_PARTB_FIELDS __VA_ARGS__); \
  1205. }
  1206. #define DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, ...) \
  1207. void EventId(PCSTR correlationVector) \
  1208. { __WI_TraceLoggingWriteTagged(*this, #EventId, _TLGWRITE_GENERIC_PARTB_FIELDS TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); }
  1209. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \
  1210. template<typename T1> void EventId(T1 &&varName1) \
  1211. { \
  1212. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1213. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1214. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1215. __VA_ARGS__); \
  1216. }
  1217. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \
  1218. template<typename T1> void EventId(T1 &&varName1, PCSTR correlationVector) \
  1219. { \
  1220. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1221. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1222. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1223. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1224. }
  1225. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \
  1226. template<typename T1, typename T2> void EventId(T1 &&varName1, T2 &&varName2) \
  1227. { \
  1228. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1229. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1230. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1231. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1232. __VA_ARGS__); \
  1233. }
  1234. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \
  1235. template<typename T1, typename T2> void EventId(T1 &&varName1, T2 &&varName2, PCSTR correlationVector) \
  1236. { \
  1237. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1238. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1239. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1240. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1241. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1242. }
  1243. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \
  1244. template<typename T1, typename T2, typename T3> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3) \
  1245. { \
  1246. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1247. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1248. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1249. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1250. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1251. __VA_ARGS__); \
  1252. }
  1253. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \
  1254. template<typename T1, typename T2, typename T3> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, PCSTR correlationVector) \
  1255. { \
  1256. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1257. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1258. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1259. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1260. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1261. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1262. }
  1263. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \
  1264. template<typename T1, typename T2, typename T3, typename T4> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4) \
  1265. { \
  1266. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1267. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1268. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1269. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1270. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1271. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1272. __VA_ARGS__); \
  1273. }
  1274. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \
  1275. template<typename T1, typename T2, typename T3, typename T4> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, PCSTR correlationVector) \
  1276. { \
  1277. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1278. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1279. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1280. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1281. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1282. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1283. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1284. }
  1285. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \
  1286. template<typename T1, typename T2, typename T3, typename T4, typename T5> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5) \
  1287. { \
  1288. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1289. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1290. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1291. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1292. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1293. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1294. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1295. __VA_ARGS__); \
  1296. }
  1297. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \
  1298. template<typename T1, typename T2, typename T3, typename T4, typename T5> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, PCSTR correlationVector) \
  1299. { \
  1300. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1301. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1302. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1303. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1304. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1305. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1306. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1307. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1308. }
  1309. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \
  1310. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6) \
  1311. { \
  1312. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1313. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1314. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1315. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1316. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1317. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1318. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1319. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1320. __VA_ARGS__); \
  1321. }
  1322. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \
  1323. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, PCSTR correlationVector) \
  1324. { \
  1325. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1326. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1327. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1328. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1329. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1330. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1331. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1332. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1333. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1334. }
  1335. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \
  1336. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7) \
  1337. { \
  1338. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1339. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1340. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1341. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1342. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1343. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1344. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1345. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1346. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1347. __VA_ARGS__); \
  1348. }
  1349. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \
  1350. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, PCSTR correlationVector) \
  1351. { \
  1352. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1353. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1354. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1355. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1356. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1357. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1358. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1359. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1360. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1361. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1362. }
  1363. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \
  1364. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8) \
  1365. { \
  1366. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1367. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1368. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1369. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1370. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1371. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1372. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1373. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1374. TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \
  1375. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1376. __VA_ARGS__); \
  1377. }
  1378. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \
  1379. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, PCSTR correlationVector) \
  1380. { \
  1381. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1382. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1383. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1384. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1385. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1386. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1387. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1388. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1389. TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \
  1390. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1391. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1392. }
  1393. #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \
  1394. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9) \
  1395. { \
  1396. __WI_TraceLoggingWriteTagged(*this, #EventId, \
  1397. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1398. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1399. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1400. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1401. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1402. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1403. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1404. TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \
  1405. TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \
  1406. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1407. __VA_ARGS__); \
  1408. }
  1409. #define DEFINE_TAGGED_TRACELOGGING_EVENT_UINT32(EventId, varName, ...) DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, UINT32, varName, __VA_ARGS__)
  1410. #define DEFINE_TAGGED_TRACELOGGING_EVENT_BOOL(EventId, varName, ...) DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, bool, varName, __VA_ARGS__)
  1411. #define DEFINE_TAGGED_TRACELOGGING_EVENT_STRING(EventId, varName, ...) DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, PCWSTR, varName, __VA_ARGS__)
  1412. // Internal MACRO implementation of TraceLogging classes.
  1413. // Do NOT use these macros directly.
  1414. #define __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingProviderOwnerClassName) \
  1415. public: \
  1416. typedef TraceLoggingProviderOwnerClassName TraceLoggingType; \
  1417. static bool IsEnabled(UCHAR eventLevel = 0 /* WINEVENT_LEVEL_XXX, e.g. WINEVENT_LEVEL_VERBOSE */, ULONGLONG eventKeywords = 0 /* MICROSOFT_KEYWORD_XXX */) WI_NOEXCEPT \
  1418. { return Instance()->IsEnabled_(eventLevel, eventKeywords); } \
  1419. static TraceLoggingHProvider Provider() WI_NOEXCEPT \
  1420. { return static_cast<TraceLoggingProvider *>(Instance())->Provider_(); } \
  1421. static void SetTelemetryEnabled(bool) WI_NOEXCEPT {} \
  1422. static void SetErrorReportingType(wil::ErrorReportingType type) WI_NOEXCEPT \
  1423. { return Instance()->SetErrorReportingType_(type); } \
  1424. static void __stdcall FallbackTelemetryCallback(bool alreadyReported, wil::FailureInfo const &failure) WI_NOEXCEPT \
  1425. { return Instance()->OnErrorReported(alreadyReported, failure); } \
  1426. WI_NODISCARD static wil::ActivityThreadWatcher WatchCurrentThread(PCSTR contextName) WI_NOEXCEPT \
  1427. { return wil::ActivityThreadWatcher(Instance(), contextName); } \
  1428. WI_NODISCARD static wil::ActivityThreadWatcher WatchCurrentThread(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \
  1429. { va_list argList; va_start(argList, formatString); return wil::ActivityThreadWatcher(Instance(), contextName, formatString, argList); } \
  1430. __BEGIN_TRACELOGGING_ACTIVITY_CLASS(CallContext, wil::ActivityOptions::TelemetryOnFailure) \
  1431. __IMPLEMENT_CALLCONTEXT_CLASS(CallContext); \
  1432. __END_TRACELOGGING_ACTIVITY_CLASS(); \
  1433. static CallContext Start(PCSTR contextName) WI_NOEXCEPT \
  1434. { return CallContext(contextName, __nullptr, __nullptr); } \
  1435. static CallContext Start(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \
  1436. { va_list argList; va_start(argList, formatString); return CallContext(contextName, formatString, argList); } \
  1437. static void TraceLoggingInfo(_Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \
  1438. { va_list argList; va_start(argList, formatString); return Instance()->ReportTraceLoggingMessage(formatString, argList); } \
  1439. static void TraceLoggingError(_Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \
  1440. { va_list argList; va_start(argList, formatString); return Instance()->ReportTraceLoggingError(formatString, argList); } \
  1441. private: \
  1442. TraceLoggingHProvider Provider_() const WI_NOEXCEPT = delete; \
  1443. TraceLoggingClassName() WI_NOEXCEPT {}; \
  1444. protected: \
  1445. static TraceLoggingClassName* Instance() WI_NOEXCEPT \
  1446. { static wil::details::static_lazy<TraceLoggingClassName> wrapper; return wrapper.get([](){wrapper.cleanup();}); } \
  1447. friend class wil::details::static_lazy<TraceLoggingClassName>; \
  1448. #define __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOption) \
  1449. __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingClassName) \
  1450. private: \
  1451. struct StaticHandle \
  1452. { \
  1453. TraceLoggingHProvider handle; \
  1454. StaticHandle() WI_NOEXCEPT \
  1455. { \
  1456. TRACELOGGING_DEFINE_PROVIDER_STORAGE(__hInner, ProviderName, ProviderId, TraceLoggingOption); \
  1457. _tlg_DefineProvider_annotation(TraceLoggingClassName, _Tlg##TraceLoggingClassName##Prov, 0, ProviderName); \
  1458. handle = &__hInner; \
  1459. } \
  1460. } m_staticHandle; \
  1461. protected: \
  1462. void Create() WI_NOEXCEPT \
  1463. { Register(m_staticHandle.handle); } \
  1464. public:
  1465. #define __IMPLEMENT_TRACELOGGING_CLASS(TraceLoggingClassName, ProviderName, ProviderId) \
  1466. __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionMicrosoftTelemetry())
  1467. #define __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOption) \
  1468. __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingClassName) \
  1469. private: \
  1470. struct StaticHandle \
  1471. { \
  1472. TraceLoggingHProvider handle; \
  1473. StaticHandle() WI_NOEXCEPT \
  1474. { \
  1475. TRACELOGGING_DEFINE_PROVIDER_STORAGE(__hInner, ProviderName, ProviderId, TraceLoggingOption); \
  1476. _tlg_DefineProvider_annotation(TraceLoggingClassName, _Tlg##TraceLoggingClassName##Prov, 0, ProviderName); \
  1477. handle = &__hInner; \
  1478. } \
  1479. } m_staticHandle; \
  1480. static VOID NTAPI Callback( _In_ const GUID* SourceId, \
  1481. ULONG ControlCode, \
  1482. UCHAR Level, \
  1483. ULONGLONG MatchAnyKeyword, \
  1484. ULONGLONG MatchAllKeyword, \
  1485. _In_opt_ EVENT_FILTER_DESCRIPTOR* FilterData, \
  1486. void* CallbackContext ); \
  1487. protected: \
  1488. void Create() WI_NOEXCEPT \
  1489. { Register(m_staticHandle.handle, &TraceLoggingClassName::Callback); } \
  1490. public:
  1491. #define __IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \
  1492. __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingClassName) \
  1493. private: \
  1494. struct StaticHandle \
  1495. { \
  1496. TraceLoggingHProvider handle; \
  1497. StaticHandle() WI_NOEXCEPT \
  1498. { \
  1499. TRACELOGGING_DEFINE_PROVIDER_STORAGE(__hInner, ProviderName, ProviderId); \
  1500. _tlg_DefineProvider_annotation(TraceLoggingClassName, _Tlg##TraceLoggingClassName##Prov, 0, ProviderName); \
  1501. handle = &__hInner; \
  1502. } \
  1503. } m_staticHandle; \
  1504. protected: \
  1505. void Create() WI_NOEXCEPT \
  1506. { Register(m_staticHandle.handle); } \
  1507. public:
  1508. #define DEFINE_TRACELOGGING_EVENT(EventId, ...) \
  1509. static void EventId() { \
  1510. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1511. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1512. __VA_ARGS__); \
  1513. }
  1514. #define DEFINE_TRACELOGGING_EVENT_CV(EventId, ...) \
  1515. static void EventId(PCSTR correlationVector) \
  1516. { \
  1517. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1518. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1519. TraceLoggingString(correlationVector, "__TlgCV__"), \
  1520. __VA_ARGS__); \
  1521. }
  1522. #define DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \
  1523. template<typename T1> static void EventId(T1 &&varName1) \
  1524. { \
  1525. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1526. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1527. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1528. __VA_ARGS__); \
  1529. }
  1530. #define DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \
  1531. template<typename T1> static void EventId(T1 &&varName1, PCSTR correlationVector) \
  1532. { \
  1533. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1534. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1535. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1536. TraceLoggingString(correlationVector, "__TlgCV__"), \
  1537. __VA_ARGS__); \
  1538. }
  1539. #define DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \
  1540. template<typename T1, typename T2> static void EventId(T1 &&varName1, T2 &&varName2) \
  1541. { \
  1542. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1543. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1544. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1545. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1546. __VA_ARGS__); \
  1547. }
  1548. #define DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \
  1549. template<typename T1, typename T2> static void EventId(T1 &&varName1, T2 &&varName2, PCSTR correlationVector) \
  1550. { \
  1551. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1552. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1553. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1554. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1555. TraceLoggingString(correlationVector, "__TlgCV__"), \
  1556. __VA_ARGS__); \
  1557. }
  1558. #define DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \
  1559. template<typename T1, typename T2, typename T3> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3) \
  1560. { \
  1561. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1562. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1563. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1564. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1565. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1566. __VA_ARGS__); \
  1567. }
  1568. #define DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \
  1569. template<typename T1, typename T2, typename T3> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, PCSTR correlationVector) \
  1570. { \
  1571. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1572. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1573. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1574. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1575. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1576. TraceLoggingString(correlationVector, "__TlgCV__"), \
  1577. __VA_ARGS__); \
  1578. }
  1579. #define DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \
  1580. template<typename T1, typename T2, typename T3, typename T4> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4) \
  1581. { \
  1582. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1583. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1584. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1585. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1586. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1587. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1588. __VA_ARGS__); \
  1589. }
  1590. #define DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \
  1591. template<typename T1, typename T2, typename T3, typename T4> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, PCSTR correlationVector) \
  1592. { \
  1593. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1594. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1595. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1596. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1597. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1598. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1599. TraceLoggingString(correlationVector, "__TlgCV__"), \
  1600. __VA_ARGS__); \
  1601. }
  1602. #define DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \
  1603. template<typename T1, typename T2, typename T3, typename T4, typename T5> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5) \
  1604. { \
  1605. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1606. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1607. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1608. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1609. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1610. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1611. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1612. __VA_ARGS__); \
  1613. }
  1614. #define DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \
  1615. template<typename T1, typename T2, typename T3, typename T4, typename T5> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, PCSTR correlationVector) \
  1616. { \
  1617. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1618. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1619. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1620. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1621. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1622. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1623. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1624. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1625. }
  1626. #define DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \
  1627. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6) \
  1628. { \
  1629. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1630. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1631. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1632. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1633. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1634. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1635. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1636. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1637. __VA_ARGS__); \
  1638. }
  1639. #define DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \
  1640. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, PCSTR correlationVector) \
  1641. { \
  1642. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1643. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1644. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1645. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1646. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1647. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1648. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1649. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1650. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1651. }
  1652. #define DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \
  1653. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7) \
  1654. { \
  1655. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1656. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1657. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1658. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1659. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1660. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1661. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1662. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1663. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1664. __VA_ARGS__); \
  1665. }
  1666. #define DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \
  1667. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, PCSTR correlationVector) \
  1668. { \
  1669. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1670. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1671. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1672. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1673. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1674. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1675. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1676. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1677. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1678. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1679. }
  1680. #define DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \
  1681. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8) \
  1682. { \
  1683. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1684. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1685. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1686. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1687. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1688. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1689. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1690. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1691. TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \
  1692. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1693. __VA_ARGS__); \
  1694. }
  1695. #define DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \
  1696. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, PCSTR correlationVector) \
  1697. { \
  1698. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1699. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1700. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1701. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1702. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1703. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1704. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1705. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1706. TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \
  1707. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1708. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1709. }
  1710. #define DEFINE_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \
  1711. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9) \
  1712. { \
  1713. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1714. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1715. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1716. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1717. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1718. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1719. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1720. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1721. TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \
  1722. TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \
  1723. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1724. __VA_ARGS__); \
  1725. }
  1726. #define DEFINE_TRACELOGGING_EVENT_PARAM9_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \
  1727. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9, PCSTR correlationVector) \
  1728. { \
  1729. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1730. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1731. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1732. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1733. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1734. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1735. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1736. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1737. TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \
  1738. TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \
  1739. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1740. TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \
  1741. }
  1742. #define DEFINE_TRACELOGGING_EVENT_PARAM10(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, VarType10, varName10, ...) \
  1743. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9, T10 &&varName10) \
  1744. { \
  1745. TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \
  1746. TraceLoggingValue(static_cast<VarType1>(wistd::forward<T1>(varName1)), _wiltlg_STRINGIZE(varName1)), \
  1747. TraceLoggingValue(static_cast<VarType2>(wistd::forward<T2>(varName2)), _wiltlg_STRINGIZE(varName2)), \
  1748. TraceLoggingValue(static_cast<VarType3>(wistd::forward<T3>(varName3)), _wiltlg_STRINGIZE(varName3)), \
  1749. TraceLoggingValue(static_cast<VarType4>(wistd::forward<T4>(varName4)), _wiltlg_STRINGIZE(varName4)), \
  1750. TraceLoggingValue(static_cast<VarType5>(wistd::forward<T5>(varName5)), _wiltlg_STRINGIZE(varName5)), \
  1751. TraceLoggingValue(static_cast<VarType6>(wistd::forward<T6>(varName6)), _wiltlg_STRINGIZE(varName6)), \
  1752. TraceLoggingValue(static_cast<VarType7>(wistd::forward<T7>(varName7)), _wiltlg_STRINGIZE(varName7)), \
  1753. TraceLoggingValue(static_cast<VarType8>(wistd::forward<T8>(varName8)), _wiltlg_STRINGIZE(varName8)), \
  1754. TraceLoggingValue(static_cast<VarType9>(wistd::forward<T9>(varName9)), _wiltlg_STRINGIZE(varName9)), \
  1755. TraceLoggingValue(static_cast<VarType10>(wistd::forward<T10>(varName10)), _wiltlg_STRINGIZE(varName10)), \
  1756. _TLGWRITE_GENERIC_PARTB_FIELDS \
  1757. __VA_ARGS__); \
  1758. }
  1759. #define DEFINE_TRACELOGGING_EVENT_UINT32(EventId, varName, ...) DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, UINT32, varName, __VA_ARGS__)
  1760. #define DEFINE_TRACELOGGING_EVENT_BOOL(EventId, varName, ...) DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, bool, varName, __VA_ARGS__)
  1761. #define DEFINE_TRACELOGGING_EVENT_STRING(EventId, varName, ...) DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, PCWSTR, varName, __VA_ARGS__)
  1762. // Declaring a pure TraceLogging class
  1763. // To declare a tracelogging class, declare your class derived from wil::TraceLoggingProvider, populate the uuid
  1764. // attribute of the class with the GUID of your provider, and then include the IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY
  1765. // macro within your class.
  1766. //
  1767. // If you want to register a provider using a callback to log events, you can instead use the IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY_AND_CALLBACK
  1768. // Additionally your tracelogging class will have to implement a static Callback method. See the declaration within __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB.
  1769. //
  1770. // If you don't need or use telemetry, you can instead use the IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY.
  1771. // This prevents telemetry from enabling your provider even if you're not using telemetry.
  1772. #define IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, GroupName) \
  1773. __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, GroupName)
  1774. #define IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, GroupName) \
  1775. __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, GroupName)
  1776. #define IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \
  1777. IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionMicrosoftTelemetry())
  1778. #define IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY_AND_CALLBACK(TraceLoggingClassName, ProviderName, ProviderId) \
  1779. IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionMicrosoftTelemetry())
  1780. #define IMPLEMENT_TRACELOGGING_CLASS_WITH_WINDOWS_CORE_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \
  1781. IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionWindowsCoreTelemetry())
  1782. #define IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \
  1783. __IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId)
  1784. #ifndef WIL_HIDE_DEPRECATED_1612
  1785. WIL_WARN_DEPRECATED_1612_PRAGMA("IMPLEMENT_TRACELOGGING_CLASS")
  1786. // DEPRECATED: Use IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY
  1787. #define IMPLEMENT_TRACELOGGING_CLASS IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY
  1788. #endif
  1789. // [Optional] Externally using a Tracelogging class
  1790. // Use TraceLoggingProviderWrite to directly use the trace logging provider externally from the class in code.
  1791. // This is recommended only for simple TraceLogging events. Telemetry events and activities are better defined
  1792. // within your Tracelogging class using one of the macros below.
  1793. #define TraceLoggingProviderWrite(TraceLoggingClassName, EventId, ...) \
  1794. TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, __VA_ARGS__)
  1795. #define TraceLoggingProviderWriteTelemetry(TraceLoggingClassName, EventId, ...) \
  1796. TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), __VA_ARGS__)
  1797. #define TraceLoggingProviderWriteMeasure(TraceLoggingClassName, EventId, ...) \
  1798. TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), __VA_ARGS__)
  1799. #define TraceLoggingProviderWriteCriticalData(TraceLoggingClassName, EventId, ...) \
  1800. TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), __VA_ARGS__)
  1801. // [Optional] Custom Events
  1802. // Use these macros to define a Custom Event for a Provider. Use the TraceLoggingClassWrite or TraceLoggingClassWriteTelemetry
  1803. // from within a custom event to issue the event. Methods will be a no-op (and not be called) if the provider is not
  1804. // enabled.
  1805. #define TraceLoggingClassWrite(EventId, ...) \
  1806. TraceLoggingWrite(TraceLoggingType::Provider(), EventId, __VA_ARGS__)
  1807. #define TraceLoggingClassWriteTelemetry(EventId, ...) \
  1808. TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), __VA_ARGS__)
  1809. #define TraceLoggingClassWriteMeasure(EventId, ...) \
  1810. TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), __VA_ARGS__)
  1811. #define TraceLoggingClassWriteCriticalData(EventId, ...) \
  1812. TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), __VA_ARGS__)
  1813. #define DEFINE_EVENT_METHOD(MethodName) \
  1814. template<typename... TArgs> \
  1815. static void MethodName(TArgs&&... args) WI_NOEXCEPT \
  1816. { \
  1817. if (IsEnabled()) \
  1818. { Instance()->MethodName##_(wistd::forward<TArgs>(args)...); } \
  1819. } \
  1820. void MethodName##_
  1821. // [Optional] Simple Events
  1822. // Use these macros to define very simple telemetry events for a Provider. The events can
  1823. // be TELEMETRY events or TRACELOGGING events.
  1824. #define DEFINE_TELEMETRY_EVENT(EventId) \
  1825. DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1826. #define DEFINE_TELEMETRY_EVENT_PARAM1(EventId, VarType1, varName1) \
  1827. DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1828. #define DEFINE_TELEMETRY_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \
  1829. DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1830. #define DEFINE_TELEMETRY_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  1831. DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1832. #define DEFINE_TELEMETRY_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  1833. DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1834. #define DEFINE_TELEMETRY_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  1835. DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1836. #define DEFINE_TELEMETRY_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  1837. DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1838. #define DEFINE_TELEMETRY_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  1839. DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1840. #define DEFINE_TELEMETRY_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  1841. DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1842. #define DEFINE_TELEMETRY_EVENT_CV(EventId) \
  1843. DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1844. #define DEFINE_TELEMETRY_EVENT_PARAM1_CV(EventId, VarType1, varName1) \
  1845. DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1846. #define DEFINE_TELEMETRY_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \
  1847. DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1848. #define DEFINE_TELEMETRY_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  1849. DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1850. #define DEFINE_TELEMETRY_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  1851. DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1852. #define DEFINE_TELEMETRY_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  1853. DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1854. #define DEFINE_TELEMETRY_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  1855. DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1856. #define DEFINE_TELEMETRY_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  1857. DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1858. #define DEFINE_TELEMETRY_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  1859. DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  1860. #define DEFINE_TELEMETRY_EVENT_UINT32(EventId, varName) DEFINE_TELEMETRY_EVENT_PARAM1(EventId, UINT32, varName)
  1861. #define DEFINE_TELEMETRY_EVENT_BOOL(EventId, varName) DEFINE_TELEMETRY_EVENT_PARAM1(EventId, bool, varName)
  1862. #define DEFINE_TELEMETRY_EVENT_STRING(EventId, varName) DEFINE_TELEMETRY_EVENT_PARAM1(EventId, PCWSTR, varName)
  1863. #define DEFINE_COMPLIANT_TELEMETRY_EVENT(EventId, PrivacyTag) \
  1864. DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1865. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \
  1866. DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1867. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \
  1868. DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1869. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  1870. DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1871. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  1872. DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1873. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  1874. DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1875. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  1876. DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1877. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  1878. DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1879. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  1880. DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1881. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_CV(EventId, PrivacyTag) \
  1882. DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1883. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1_CV(EventId, PrivacyTag, VarType1, varName1) \
  1884. DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1885. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM2_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \
  1886. DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1887. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM3_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  1888. DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1889. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM4_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  1890. DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1891. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM5_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  1892. DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1893. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM6_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  1894. DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1895. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM7_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  1896. DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1897. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM8_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  1898. DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  1899. #define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_CV(EventId, PrivacyTag, EventTag) \
  1900. DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  1901. #define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM1_CV(EventId, PrivacyTag, EventTag, VarType1, varName1) \
  1902. DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  1903. #define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM2_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2) \
  1904. DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  1905. #define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM3_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  1906. DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  1907. #define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM4_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  1908. DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  1909. #define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM5_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  1910. DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  1911. #define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM6_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  1912. DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  1913. #define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM7_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  1914. DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  1915. #define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM8_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  1916. DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  1917. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)
  1918. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)
  1919. #define DEFINE_COMPLIANT_TELEMETRY_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)
  1920. // [Optional] Simple Events
  1921. // Use these macros to define very simple measure events for a Provider.
  1922. #define DEFINE_MEASURES_EVENT(EventId) \
  1923. DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1924. #define DEFINE_MEASURES_EVENT_PARAM1(EventId, VarType1, varName1) \
  1925. DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1926. #define DEFINE_MEASURES_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \
  1927. DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1928. #define DEFINE_MEASURES_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  1929. DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1930. #define DEFINE_MEASURES_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  1931. DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1932. #define DEFINE_MEASURES_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  1933. DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1934. #define DEFINE_MEASURES_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  1935. DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1936. #define DEFINE_MEASURES_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  1937. DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1938. #define DEFINE_MEASURES_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  1939. DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1940. #define DEFINE_MEASURES_EVENT_CV(EventId) \
  1941. DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1942. #define DEFINE_MEASURES_EVENT_PARAM1_CV(EventId, VarType1, varName1) \
  1943. DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1944. #define DEFINE_MEASURES_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \
  1945. DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1946. #define DEFINE_MEASURES_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  1947. DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1948. #define DEFINE_MEASURES_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  1949. DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1950. #define DEFINE_MEASURES_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  1951. DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1952. #define DEFINE_MEASURES_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  1953. DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1954. #define DEFINE_MEASURES_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  1955. DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1956. #define DEFINE_MEASURES_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  1957. DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  1958. #define DEFINE_MEASURES_EVENT_UINT32(EventId, varName) DEFINE_MEASURES_EVENT_PARAM1(EventId, UINT32, varName)
  1959. #define DEFINE_MEASURES_EVENT_BOOL(EventId, varName) DEFINE_MEASURES_EVENT_PARAM1(EventId, bool, varName)
  1960. #define DEFINE_MEASURES_EVENT_STRING(EventId, varName) DEFINE_MEASURES_EVENT_PARAM1(EventId, PCWSTR, varName)
  1961. #define DEFINE_COMPLIANT_MEASURES_EVENT(EventId, PrivacyTag) \
  1962. DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1963. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \
  1964. DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1965. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \
  1966. DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1967. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  1968. DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1969. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  1970. DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1971. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  1972. DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1973. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  1974. DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1975. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  1976. DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1977. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  1978. DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1979. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM9(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9) \
  1980. DEFINE_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1981. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM10(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, VarType10, varName10) \
  1982. DEFINE_TRACELOGGING_EVENT_PARAM10(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, VarType10, varName10, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1983. #define DEFINE_COMPLIANT_MEASURES_EVENT_CV(EventId, PrivacyTag) \
  1984. DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1985. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1_CV(EventId, PrivacyTag, VarType1, varName1) \
  1986. DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1987. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM2_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \
  1988. DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1989. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM3_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  1990. DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1991. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM4_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  1992. DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1993. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM5_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  1994. DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1995. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM6_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  1996. DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1997. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM7_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  1998. DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  1999. #define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM8_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2000. DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  2001. #define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_CV(EventId, PrivacyTag, EventTag) \
  2002. DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2003. #define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM1_CV(EventId, PrivacyTag, EventTag, VarType1, varName1) \
  2004. DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2005. #define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM2_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2) \
  2006. DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2007. #define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM3_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2008. DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2009. #define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM4_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2010. DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2011. #define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM5_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2012. DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2013. #define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM6_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2014. DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2015. #define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM7_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2016. DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2017. #define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM8_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2018. DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2019. #define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM9_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9) \
  2020. DEFINE_TRACELOGGING_EVENT_PARAM9_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2021. #define DEFINE_COMPLIANT_MEASURES_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)
  2022. #define DEFINE_COMPLIANT_MEASURES_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)
  2023. #define DEFINE_COMPLIANT_MEASURES_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)
  2024. // [Optional] Simple Events
  2025. // Use these macros to define very simple critical data events for a Provider.
  2026. #define DEFINE_CRITICAL_DATA_EVENT(EventId) \
  2027. DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2028. #define DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, VarType1, varName1) \
  2029. DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2030. #define DEFINE_CRITICAL_DATA_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \
  2031. DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2032. #define DEFINE_CRITICAL_DATA_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2033. DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2034. #define DEFINE_CRITICAL_DATA_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2035. DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2036. #define DEFINE_CRITICAL_DATA_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2037. DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2038. #define DEFINE_CRITICAL_DATA_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2039. DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2040. #define DEFINE_CRITICAL_DATA_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2041. DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2042. #define DEFINE_CRITICAL_DATA_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2043. DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2044. #define DEFINE_CRITICAL_DATA_EVENT_CV(EventId) \
  2045. DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2046. #define DEFINE_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, VarType1, varName1) \
  2047. DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2048. #define DEFINE_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \
  2049. DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2050. #define DEFINE_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2051. DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2052. #define DEFINE_CRITICAL_DATA_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2053. DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2054. #define DEFINE_CRITICAL_DATA_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2055. DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2056. #define DEFINE_CRITICAL_DATA_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2057. DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2058. #define DEFINE_CRITICAL_DATA_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2059. DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2060. #define DEFINE_CRITICAL_DATA_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2061. DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2062. #define DEFINE_CRITICAL_DATA_EVENT_UINT32(EventId, varName) DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, UINT32, varName)
  2063. #define DEFINE_CRITICAL_DATA_EVENT_BOOL(EventId, varName) DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, bool, varName)
  2064. #define DEFINE_CRITICAL_DATA_EVENT_STRING(EventId, varName) DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, PCWSTR, varName)
  2065. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT(EventId, PrivacyTag) \
  2066. DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2067. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \
  2068. DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2069. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \
  2070. DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2071. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2072. DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2073. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2074. DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2075. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2076. DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2077. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2078. DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2079. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2080. DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2081. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2082. DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2083. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_CV(EventId, PrivacyTag) \
  2084. DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2085. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, PrivacyTag, VarType1, varName1) \
  2086. DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2087. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \
  2088. DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2089. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2090. DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2091. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM4_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2092. DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2093. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM5_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2094. DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2095. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM6_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2096. DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2097. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM7_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2098. DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2099. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM8_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2100. DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2101. #define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_CV(EventId, PrivacyTag, EventTag) \
  2102. DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2103. #define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, PrivacyTag, EventTag, VarType1, varName1) \
  2104. DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2105. #define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2) \
  2106. DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2107. #define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2108. DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2109. #define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM4_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2110. DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2111. #define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM5_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2112. DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2113. #define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM6_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2114. DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2115. #define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM7_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2116. DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2117. #define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM8_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2118. DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2119. #define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM9_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9) \
  2120. DEFINE_TRACELOGGING_EVENT_PARAM9_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag))
  2121. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)
  2122. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)
  2123. #define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)
  2124. // Custom Activities
  2125. // For these you pair the appropriate BEGIN and END macros to define your activity. Within the pair
  2126. // you can use the (TODO: LIST MACRO NAMES) macros to add behavior.
  2127. // [optional] params are: Options, Keyword, Level, PrivacyTag
  2128. #define BEGIN_CUSTOM_ACTIVITY_CLASS(ActivityClassName, ...) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, __VA_ARGS__) \
  2129. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2130. // [optional] param is: Level, PrivacyTag
  2131. #define BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName) \
  2132. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2133. #define BEGIN_TRACELOGGING_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::None, 0, Level) \
  2134. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2135. #define BEGIN_COMPLIANT_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::None, 0, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \
  2136. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2137. #define BEGIN_COMPLIANT_TRACELOGGING_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::None, 0, Level, PrivacyTag) \
  2138. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2139. // [optional] param is: Level
  2140. #define BEGIN_CALLCONTEXT_ACTIVITY_CLASS(ActivityClassName) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure) \
  2141. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2142. #define BEGIN_CALLCONTEXT_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, 0, Level) \
  2143. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2144. #define BEGIN_COMPLIANT_CALLCONTEXT_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, 0, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \
  2145. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2146. #define BEGIN_COMPLIANT_CALLCONTEXT_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, 0, Level, PrivacyTag) \
  2147. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2148. // [optional] param is: Level
  2149. #define BEGIN_TELEMETRY_ACTIVITY_CLASS(ActivityClassName) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY) \
  2150. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2151. #define BEGIN_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY, Level) \
  2152. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2153. #define BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \
  2154. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2155. #define BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY, Level, PrivacyTag) \
  2156. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2157. // [optional] param is: Level
  2158. #define BEGIN_MEASURES_ACTIVITY_CLASS(ActivityClassName) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES) \
  2159. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2160. #define BEGIN_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES, Level) \
  2161. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2162. #define BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \
  2163. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2164. #define BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES, Level, PrivacyTag) \
  2165. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2166. // [optional] param is: Level
  2167. #define BEGIN_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA) \
  2168. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2169. #define BEGIN_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA, Level) \
  2170. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2171. #define BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \
  2172. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2173. #define BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA, Level, PrivacyTag) \
  2174. __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName)
  2175. // Use to end ALL activity class definitions
  2176. #define END_ACTIVITY_CLASS() __END_TRACELOGGING_ACTIVITY_CLASS()
  2177. // Simple Activities
  2178. // For these you just use the appropriate macro to define the KIND of activity you want and specify
  2179. // the name (for tracelogging you can give other options)
  2180. // [optional] params are: Options, Keyword, Level
  2181. #define DEFINE_CUSTOM_ACTIVITY(ActivityClassName, ...) \
  2182. BEGIN_CUSTOM_ACTIVITY_CLASS(ActivityClassName, __VA_ARGS__) \
  2183. END_ACTIVITY_CLASS()
  2184. #define DEFINE_TRACELOGGING_ACTIVITY(ActivityClassName) \
  2185. BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName) \
  2186. END_ACTIVITY_CLASS()
  2187. #define DEFINE_TRACELOGGING_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \
  2188. BEGIN_TRACELOGGING_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \
  2189. END_ACTIVITY_CLASS()
  2190. #define DEFINE_CALLCONTEXT_ACTIVITY(ActivityClassName) \
  2191. BEGIN_CALLCONTEXT_ACTIVITY_CLASS(ActivityClassName) \
  2192. END_ACTIVITY_CLASS()
  2193. #define DEFINE_CALLCONTEXT_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \
  2194. BEGIN_CALLCONTEXT_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \
  2195. END_ACTIVITY_CLASS()
  2196. #define DEFINE_TELEMETRY_ACTIVITY(ActivityClassName) \
  2197. BEGIN_TELEMETRY_ACTIVITY_CLASS(ActivityClassName) \
  2198. END_ACTIVITY_CLASS()
  2199. #define DEFINE_TELEMETRY_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \
  2200. BEGIN_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \
  2201. END_ACTIVITY_CLASS()
  2202. #define DEFINE_COMPLIANT_TELEMETRY_ACTIVITY(ActivityClassName, PrivacyTag) \
  2203. BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \
  2204. END_ACTIVITY_CLASS()
  2205. #define DEFINE_COMPLIANT_TELEMETRY_ACTIVITY_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \
  2206. BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \
  2207. END_ACTIVITY_CLASS()
  2208. #define DEFINE_MEASURES_ACTIVITY(ActivityClassName) \
  2209. BEGIN_MEASURES_ACTIVITY_CLASS(ActivityClassName) \
  2210. END_ACTIVITY_CLASS()
  2211. #define DEFINE_MEASURES_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \
  2212. BEGIN_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \
  2213. END_ACTIVITY_CLASS()
  2214. #define DEFINE_COMPLIANT_MEASURES_ACTIVITY(ActivityClassName, PrivacyTag) \
  2215. BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \
  2216. END_ACTIVITY_CLASS()
  2217. #define DEFINE_COMPLIANT_MEASURES_ACTIVITY_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \
  2218. BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \
  2219. END_ACTIVITY_CLASS()
  2220. #define DEFINE_CRITICAL_DATA_ACTIVITY(ActivityClassName) \
  2221. BEGIN_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName) \
  2222. END_ACTIVITY_CLASS()
  2223. #define DEFINE_CRITICAL_DATA_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \
  2224. BEGIN_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \
  2225. END_ACTIVITY_CLASS()
  2226. #define DEFINE_COMPLIANT_CRITICAL_DATA_ACTIVITY(ActivityClassName, PrivacyTag) \
  2227. BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \
  2228. END_ACTIVITY_CLASS()
  2229. #define DEFINE_COMPLIANT_CRITICAL_DATA_ACTIVITY_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \
  2230. BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \
  2231. END_ACTIVITY_CLASS()
  2232. // [Optional] Custom Start or Stop Events for Activities
  2233. // Use these macros to define custom start or custom stop methods for an activity. Any activity can
  2234. // have multiple start or stop methods. To add custom start or stop events, define a StartActivity instance
  2235. // method or a Stop instance method within the BEGIN/END pair of a custom activity. Within that function, use
  2236. // TraceLoggingClassWriteStart or TraceLoggingClassWriteStop.
  2237. // Params: (EventId, ...)
  2238. #define TraceLoggingClassWriteStart __WRITE_ACTIVITY_START
  2239. #define TraceLoggingClassWriteStop __WRITE_ACTIVITY_STOP
  2240. // [Optional] Custom Tagged Events for Activities
  2241. // Use these macros to define a Custom Tagged Event for a Custom Activity. Use the
  2242. // TraceLoggingClassWriteTagged or TraceLoggingClassWriteTaggedTelemetry macros from within a custom event
  2243. // to write the event.
  2244. #define TraceLoggingClassWriteTagged(EventId, ...) \
  2245. __WI_TraceLoggingWriteTagged(*this, #EventId, __VA_ARGS__)
  2246. #define TraceLoggingClassWriteTaggedTelemetry(EventId, ...) \
  2247. __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), __VA_ARGS__)
  2248. #define TraceLoggingClassWriteTaggedMeasure(EventId, ...) \
  2249. __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), __VA_ARGS__)
  2250. #define TraceLoggingClassWriteTaggedCriticalData(EventId, ...) \
  2251. __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), __VA_ARGS__)
  2252. // [Optional] Simple Tagged Events for Activities
  2253. // Use these methods to define very simple tagged events for a Custom Activity.
  2254. #define DEFINE_TAGGED_TELEMETRY_EVENT(EventId) \
  2255. DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2256. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, VarType1, varName1) \
  2257. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2258. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \
  2259. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2260. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2261. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2262. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2263. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2264. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2265. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2266. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2267. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2268. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2269. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2270. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2271. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2272. #define DEFINE_TAGGED_TELEMETRY_EVENT_CV(EventId) \
  2273. DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2274. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1_CV(EventId, VarType1, varName1) \
  2275. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2276. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \
  2277. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2278. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2279. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2280. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2281. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2282. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2283. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2284. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2285. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2286. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2287. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2288. #define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2289. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY))
  2290. #define DEFINE_TAGGED_TELEMETRY_EVENT_UINT32(EventId, varName) DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, UINT32, varName)
  2291. #define DEFINE_TAGGED_TELEMETRY_EVENT_BOOL(EventId, varName) DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, bool, varName)
  2292. #define DEFINE_TAGGED_TELEMETRY_EVENT_STRING(EventId, varName) DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, PCWSTR, varName)
  2293. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT(EventId, PrivacyTag) \
  2294. DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  2295. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \
  2296. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  2297. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \
  2298. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  2299. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2300. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  2301. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2302. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  2303. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2304. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  2305. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2306. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  2307. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2308. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  2309. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2310. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag))
  2311. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)
  2312. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)
  2313. #define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)
  2314. // [Optional] Simple Tagged Events for Activities
  2315. // Use these methods to define very simple tagged measures events for a Custom Activity.
  2316. #define DEFINE_TAGGED_MEASURES_EVENT(EventId) \
  2317. DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2318. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, VarType1, varName1) \
  2319. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2320. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \
  2321. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2322. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2323. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2324. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2325. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2326. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2327. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2328. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2329. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2330. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2331. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2332. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2333. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2334. #define DEFINE_TAGGED_MEASURES_EVENT_CV(EventId) \
  2335. DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2336. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM1_CV(EventId, VarType1, varName1) \
  2337. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2338. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \
  2339. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2340. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2341. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2342. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2343. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2344. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2345. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2346. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2347. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2348. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2349. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2350. #define DEFINE_TAGGED_MEASURES_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2351. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES))
  2352. #define DEFINE_TAGGED_MEASURES_EVENT_UINT32(EventId, varName) DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, UINT32, varName)
  2353. #define DEFINE_TAGGED_MEASURES_EVENT_BOOL(EventId, varName) DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, bool, varName)
  2354. #define DEFINE_TAGGED_MEASURES_EVENT_STRING(EventId, varName) DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, PCWSTR, varName)
  2355. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT(EventId, PrivacyTag) \
  2356. DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  2357. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \
  2358. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  2359. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \
  2360. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  2361. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2362. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  2363. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2364. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  2365. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2366. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  2367. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2368. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  2369. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2370. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  2371. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2372. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag))
  2373. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)
  2374. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)
  2375. #define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)
  2376. // [Optional] Simple Tagged Events for Activities
  2377. // Use these methods to define very simple tagged CRITICAL_DATA events for a Custom Activity.
  2378. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT(EventId) \
  2379. DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2380. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, VarType1, varName1) \
  2381. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2382. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \
  2383. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2384. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2385. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2386. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2387. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2388. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2389. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2390. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2391. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2392. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2393. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2394. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2395. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2396. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9) \
  2397. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2398. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_CV(EventId) \
  2399. DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2400. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, VarType1, varName1) \
  2401. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2402. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \
  2403. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2404. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2405. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2406. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2407. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2408. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2409. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2410. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2411. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2412. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2413. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2414. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2415. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA))
  2416. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_UINT32(EventId, varName) DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, UINT32, varName)
  2417. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_BOOL(EventId, varName) DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, bool, varName)
  2418. #define DEFINE_TAGGED_CRITICAL_DATA_EVENT_STRING(EventId, varName) DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, PCWSTR, varName)
  2419. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT(EventId, PrivacyTag) \
  2420. DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2421. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \
  2422. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2423. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \
  2424. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2425. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \
  2426. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2427. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \
  2428. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2429. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \
  2430. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2431. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \
  2432. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2433. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \
  2434. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2435. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \
  2436. DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag))
  2437. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName)
  2438. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, bool, varName)
  2439. #define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName)
  2440. // Thread Activities [deprecated]
  2441. // These are desktop only and are not recommended by the fundamentals team. These activities lag behind regular activities in
  2442. // their ability to use CallContext or to be cross-thread portable, so their usage should be limited.
  2443. #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
  2444. #define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, level) \
  2445. class ActivityClassName final : public _TlgActivityBase<ActivityClassName, keyword, level> \
  2446. { \
  2447. static const UINT64 PrivacyTag = 0; \
  2448. friend class _TlgActivityBase<ActivityClassName, keyword, level>; \
  2449. void OnStarted() { PushThreadActivityId(); } \
  2450. void OnStopped() { PopThreadActivityId(); } \
  2451. public: \
  2452. ActivityClassName() : m_result(S_OK) \
  2453. { \
  2454. } \
  2455. private: \
  2456. template<typename... TArgs> \
  2457. ActivityClassName(_In_ void **, TArgs&&... args) : m_result(S_OK) \
  2458. { \
  2459. StartActivity(wistd::forward<TArgs>(args)...); \
  2460. } \
  2461. protected: \
  2462. void EnsureWatchingCurrentThread() {} \
  2463. void IgnoreCurrentThread() {} \
  2464. wil::FailureInfo const *GetFailureInfo() \
  2465. { \
  2466. return (FAILED(m_result) && (m_cache.GetFailure() != nullptr) && (m_result == m_cache.GetFailure()->hr)) ? m_cache.GetFailure() : nullptr; \
  2467. } \
  2468. HRESULT GetResult() \
  2469. { \
  2470. return m_result; \
  2471. } \
  2472. public: \
  2473. ~ActivityClassName() \
  2474. { \
  2475. Stop(HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)); \
  2476. } \
  2477. ActivityClassName(const ActivityClassName &) = default; \
  2478. ActivityClassName(ActivityClassName &&) = default; \
  2479. TraceLoggingHProvider Provider() const \
  2480. { \
  2481. return TraceLoggingType::Provider(); \
  2482. } \
  2483. void Stop(HRESULT hr = S_OK) \
  2484. { \
  2485. if (IsStarted()) \
  2486. { \
  2487. m_result = hr; \
  2488. TRACELOGGING_WRITE_ACTIVITY_STOP(ActivityClassName); \
  2489. } \
  2490. } \
  2491. template<typename... TArgs> \
  2492. void StopWithResult(HRESULT hr, TArgs&&... args) \
  2493. { \
  2494. m_result = hr; \
  2495. Stop(wistd::forward<TArgs>(args)...); \
  2496. } \
  2497. template<typename... TArgs> \
  2498. static ActivityClassName Start(TArgs&&... args) \
  2499. { \
  2500. return ActivityClassName(static_cast<void **>(__nullptr), wistd::forward<TArgs>(args)...); \
  2501. } \
  2502. void StartActivity() \
  2503. { \
  2504. TRACELOGGING_WRITE_ACTIVITY_START(ActivityClassName); \
  2505. } \
  2506. #define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD(ActivityClassName, keyword) \
  2507. BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, WINEVENT_LEVEL_VERBOSE)
  2508. #define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, level) \
  2509. BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, 0, level)
  2510. #define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS(ActivityClassName) \
  2511. BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, 0, WINEVENT_LEVEL_VERBOSE)
  2512. #define END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS() \
  2513. private: \
  2514. HRESULT m_result; \
  2515. wil::ThreadFailureCache m_cache; \
  2516. };
  2517. #define BEGIN_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS(ActivityClassName) \
  2518. BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD(ActivityClassName, MICROSOFT_KEYWORD_TELEMETRY)
  2519. #define END_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS() \
  2520. END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS()
  2521. #define DEFINE_TRACELOGGING_THREAD_ACTIVITY_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, level) \
  2522. BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, level) \
  2523. END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS()
  2524. #define DEFINE_TRACELOGGING_THREAD_ACTIVITY_WITH_KEYWORD(ActivityClassName, keyword) \
  2525. BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD(ActivityClassName, keyword) \
  2526. END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS()
  2527. #define DEFINE_TRACELOGGING_THREAD_ACTIVITY_WITH_LEVEL(ActivityClassName, level) \
  2528. BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, level) \
  2529. END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS()
  2530. #define DEFINE_TRACELOGGING_THREAD_ACTIVITY(ActivityClassName) \
  2531. BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS(ActivityClassName) \
  2532. END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS()
  2533. #define DEFINE_TELEMETRY_THREAD_ACTIVITY(ActivityClassName) \
  2534. BEGIN_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS(ActivityClassName) \
  2535. END_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS()
  2536. #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
  2537. // [deprecated]
  2538. // DO NOT USE these concepts
  2539. // These should be removed post RI/FI cycle...
  2540. #define DEFINE_TRACELOGGING_METHOD DEFINE_EVENT_METHOD
  2541. #define BEGIN_DEFINE_TELEMETRY_ACTIVITY_CLASS BEGIN_TELEMETRY_ACTIVITY_CLASS
  2542. #define END_DEFINE_TELEMETRY_ACTIVITY_CLASS END_ACTIVITY_CLASS
  2543. #define BEGIN_DEFINE_TRACELOGGING_ACTIVITY_CLASS BEGIN_TRACELOGGING_ACTIVITY_CLASS
  2544. #define END_DEFINE_TRACELOGGING_ACTIVITY_CLASS END_ACTIVITY_CLASS
  2545. #define TELEMETRY_WRITE_ACTIVITY_START TraceLoggingClassWriteStart
  2546. #define TRACELOGGING_WRITE_ACTIVITY_START TraceLoggingClassWriteStart
  2547. #define TELEMETRY_WRITE_ACTIVITY_STOP TraceLoggingClassWriteStop
  2548. #define TRACELOGGING_WRITE_ACTIVITY_STOP TraceLoggingClassWriteStop
  2549. #define WRITE_TRACELOGGING_EVENT TraceLoggingClassWrite
  2550. #define WRITE_TELEMETRY_EVENT TraceLoggingClassWriteTelemetry
  2551. #define TRACELOGGING_WRITE_TAGGED_EVENT TraceLoggingClassWriteTagged
  2552. #define TELEMETRY_WRITE_TAGGED_EVENT TraceLoggingClassWriteTaggedTelemetry
  2553. // [deprecated]
  2554. // DO NOT USE these concepts
  2555. // These should be removed post RI/FI cycle...
  2556. #define __DEFINE_EVENT DEFINE_TRACELOGGING_EVENT
  2557. #define __DEFINE_EVENT_PARAM1 DEFINE_TRACELOGGING_EVENT_PARAM1
  2558. #define __DEFINE_EVENT_PARAM2 DEFINE_TRACELOGGING_EVENT_PARAM2
  2559. #define __DEFINE_EVENT_PARAM3 DEFINE_TRACELOGGING_EVENT_PARAM3
  2560. #define __DEFINE_EVENT_PARAM4 DEFINE_TRACELOGGING_EVENT_PARAM4
  2561. #define __DEFINE_EVENT_PARAM5 DEFINE_TRACELOGGING_EVENT_PARAM5
  2562. #define __DEFINE_EVENT_PARAM6 DEFINE_TRACELOGGING_EVENT_PARAM6
  2563. #define __DEFINE_EVENT_PARAM7 DEFINE_TRACELOGGING_EVENT_PARAM7
  2564. #define __DEFINE_EVENT_UINT32 DEFINE_TRACELOGGING_EVENT_UINT32
  2565. #define __DEFINE_EVENT_BOOL DEFINE_TRACELOGGING_EVENT_BOOL
  2566. #define __DEFINE_EVENT_STRING DEFINE_TRACELOGGING_EVENT_STRING
  2567. // [deprecated]
  2568. // DO NOT USE these concepts
  2569. // These should be removed post RI/FI cycle...
  2570. #define __DEFINE_TAGGED_EVENT DEFINE_TAGGED_TRACELOGGING_EVENT
  2571. #define __DEFINE_TAGGED_EVENT_PARAM1 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1
  2572. #define __DEFINE_TAGGED_EVENT_PARAM2 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2
  2573. #define __DEFINE_TAGGED_EVENT_PARAM3 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3
  2574. #define __DEFINE_TAGGED_EVENT_PARAM4 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4
  2575. #define __DEFINE_TAGGED_EVENT_PARAM5 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5
  2576. #define __DEFINE_TAGGED_EVENT_PARAM6 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6
  2577. #define __DEFINE_TAGGED_EVENT_PARAM7 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7
  2578. #define __DEFINE_TAGGED_EVENT_UINT32 DEFINE_TAGGED_TRACELOGGING_EVENT_UINT32
  2579. #define __DEFINE_TAGGED_EVENT_BOOL DEFINE_TAGGED_TRACELOGGING_EVENT_BOOL
  2580. #define __DEFINE_TAGGED_EVENT_STRING DEFINE_TAGGED_TRACELOGGING_EVENT_STRING
  2581. template <typename T>
  2582. class ActivityErrorTracer
  2583. {
  2584. public:
  2585. ActivityErrorTracer(T const &) {}
  2586. };
  2587. using TelemetryBase = wil::TraceLoggingProvider;
  2588. #define TRACELOGGING_WRITE_EVENT(TraceLoggingClassName, EventId, ...) \
  2589. TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, __VA_ARGS__)
  2590. #define TELEMETRY_WRITE_EVENT(EventId, ...) \
  2591. TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), __VA_ARGS__)
  2592. #define DEFINE_TAGGED_EVENT_METHOD(MethodName) \
  2593. public: void MethodName
  2594. #define DEFINE_ACTIVITY_START(...) \
  2595. void StartActivity(__VA_ARGS__)
  2596. #define DEFINE_ACTIVITY_STOP(...) \
  2597. void Stop(__VA_ARGS__)
  2598. #define DECLARE_TRACELOGGING_CLASS(TraceLoggingClassName, ProviderName, ProviderId) \
  2599. class TraceLoggingClassName : public wil::TraceLoggingProvider \
  2600. { \
  2601. IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId); \
  2602. };
  2603. #define IMPLEMENT_TELEMETRY_CLASS(TelemetryClassName, TraceLoggingClassName) \
  2604. __IMPLEMENT_TRACELOGGING_CLASS_BASE(TelemetryClassName, TraceLoggingClassName) \
  2605. protected: \
  2606. void Create() \
  2607. { AttachProvider(TraceLoggingClassName::Provider()); \
  2608. __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(TelemetryClassName, TraceLoggingClassName); } \
  2609. public:
  2610. namespace wil
  2611. {
  2612. /// @cond
  2613. namespace details
  2614. {
  2615. #ifdef WIL_API_TELEMETRY_SUSPEND_HANDLER
  2616. #pragma detect_mismatch("ODR_violation_WIL_API_TELEMETRY_SUSPEND_HANDLER_mismatch", "1")
  2617. #else
  2618. #pragma detect_mismatch("ODR_violation_WIL_API_TELEMETRY_SUSPEND_HANDLER_mismatch", "0")
  2619. #endif
  2620. class ApiTelemetryLogger : public wil::TraceLoggingProvider
  2621. {
  2622. // {fb7fcbc6-7156-5a5b-eabd-0be47b14f453}
  2623. IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY(ApiTelemetryLogger, "Microsoft.Windows.ApiTelemetry", (0xfb7fcbc6, 0x7156, 0x5a5b, 0xea, 0xbd, 0x0b, 0xe4, 0x7b, 0x14, 0xf4, 0x53));
  2624. public:
  2625. // Used to store of list of APIs (with namespace, class, custom and call count data per API).
  2626. // This is public so that it can be unit tested.
  2627. class ApiDataList
  2628. {
  2629. public:
  2630. struct ApiData
  2631. {
  2632. PCWSTR className = nullptr;
  2633. PCWSTR apiName = nullptr;
  2634. PCSTR specialization = nullptr;
  2635. volatile long* counterReference = nullptr;
  2636. wistd::unique_ptr<ApiData> next;
  2637. ApiData(PCWSTR className_, PCWSTR apiName_, PCSTR specialization_, volatile long* counterReference_) :
  2638. className(className_), apiName(apiName_), specialization(specialization_), counterReference(counterReference_)
  2639. {
  2640. }
  2641. };
  2642. // Inserts a new Api call counter into the list, keeping the list sorted by className
  2643. void Insert(PCWSTR className, PCWSTR apiName, _In_opt_ PCSTR specialization, volatile long* counterReference)
  2644. {
  2645. wistd::unique_ptr<ApiData> newApiData(new(std::nothrow) ApiData(className, apiName, specialization, counterReference));
  2646. if (newApiData)
  2647. {
  2648. auto lock = m_lock.lock_exclusive();
  2649. // Insert the new ApiData, keeping the list sorted by className.
  2650. wistd::unique_ptr<ApiData>* currentNode = &m_root;
  2651. while (*currentNode)
  2652. {
  2653. wistd::unique_ptr<ApiData>& node = *currentNode;
  2654. if (wcscmp(className, node->className) <= 0)
  2655. {
  2656. break;
  2657. }
  2658. currentNode = &(node->next);
  2659. }
  2660. newApiData->next.reset(currentNode->release());
  2661. currentNode->reset(newApiData.release());
  2662. }
  2663. }
  2664. // For each distinct namespace, calls the provided flushCallback function.
  2665. // After returning, it will have deleted all ApiData elements, and zeroed the *counterReference stored in each ApiData.
  2666. void Flush(wistd::function<void(PCWSTR, PCWSTR, PCSTR, UINT32*, UINT16)> flushCallback)
  2667. {
  2668. wistd::unique_ptr<ApiData> root;
  2669. if (m_root)
  2670. {
  2671. auto lock = m_lock.lock_exclusive();
  2672. root.swap(m_root);
  2673. }
  2674. while (root)
  2675. {
  2676. // First find the number of characters we need to allocate for each string, and the number of items in the counter array to allocate
  2677. size_t totalApiListLength = 1; // Init to 1 to account for null terminator
  2678. size_t totalSpecializationsLength = 1; // Init to 1 to account for null terminator
  2679. UINT16 numCounts = 0;
  2680. ProcessSingleNamespace(&root,
  2681. [&](wistd::unique_ptr<ApiData>& node)
  2682. {
  2683. // Get the length needed for the class string
  2684. const wchar_t* strAfterNamespace = GetClassStringPointer(node->className);
  2685. size_t classStrLen = wcslen(strAfterNamespace ? strAfterNamespace : node->className);
  2686. totalApiListLength += (classStrLen + wcslen(node->apiName) + 1); // We add 1 to account for the comma delimeter
  2687. if (node->specialization)
  2688. {
  2689. totalSpecializationsLength += strlen(node->specialization) + 1; // We add 1 to account for the comma delimeter
  2690. }
  2691. else
  2692. {
  2693. totalSpecializationsLength += 2; // '-' plus comma delimeter
  2694. }
  2695. numCounts++;
  2696. });
  2697. // Fill arrays with the API data, and then pass it to the callback function
  2698. wistd::unique_ptr<wchar_t[]> apiList(new(std::nothrow) wchar_t[totalApiListLength]);
  2699. wistd::unique_ptr<char[]> specializationList(new(std::nothrow) char[totalSpecializationsLength]);
  2700. wistd::unique_ptr<UINT32[]> countArray(new(std::nothrow) UINT32[numCounts]);
  2701. size_t nameSpaceLength = GetNameSpaceLength(root->className) + 1;
  2702. wistd::unique_ptr<wchar_t[]> nameSpace(new(std::nothrow) wchar_t[nameSpaceLength]);
  2703. if (!apiList || !specializationList || !countArray || !nameSpace)
  2704. {
  2705. return;
  2706. }
  2707. ZeroMemory(apiList.get(), totalApiListLength * sizeof(wchar_t));
  2708. ZeroMemory(specializationList.get(), totalSpecializationsLength * sizeof(char));
  2709. ZeroMemory(countArray.get(), numCounts * sizeof(UINT32));
  2710. ZeroMemory(nameSpace.get(), nameSpaceLength * sizeof(wchar_t));
  2711. StringCchCopyNW(nameSpace.get(), STRSAFE_MAX_CCH, root->className, nameSpaceLength - 1);
  2712. int countArrayIndex = 0;
  2713. wistd::unique_ptr<ApiData>* lastNamespaceNode = ProcessSingleNamespace(&root,
  2714. [&](wistd::unique_ptr<ApiData>& node)
  2715. {
  2716. countArray[countArrayIndex] = static_cast<UINT32>(::InterlockedExchangeNoFence(node->counterReference, 0));
  2717. // Prepend the portion of the apiName group string that's after the '.'. So for example, if the
  2718. // className is "Windows.System.Launcher", then we prepend "Launcher." to the apiName string.
  2719. const wchar_t* strAfterNamespace = GetClassStringPointer(node->className);
  2720. if (strAfterNamespace)
  2721. {
  2722. FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, strAfterNamespace + 1));
  2723. FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, L"."));
  2724. }
  2725. FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, node->apiName));
  2726. if (node->specialization)
  2727. {
  2728. FAIL_FAST_IF(strncat_s(specializationList.get(), totalSpecializationsLength, node->specialization, strlen(node->specialization)) != 0);
  2729. }
  2730. else
  2731. {
  2732. FAIL_FAST_IF(strncat_s(specializationList.get(), totalSpecializationsLength, "-", 1) != 0);
  2733. }
  2734. if (countArrayIndex != (numCounts - 1))
  2735. {
  2736. FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, L","));
  2737. FAIL_FAST_IF(strncat_s(specializationList.get(), totalSpecializationsLength, ",", 1) != 0);
  2738. }
  2739. countArrayIndex++;
  2740. });
  2741. // Call the callback function with the data we've collected for this namespace
  2742. flushCallback(nameSpace.get(), apiList.get(), specializationList.get(), countArray.get(), numCounts);
  2743. if (*lastNamespaceNode)
  2744. {
  2745. root.swap((*lastNamespaceNode)->next);
  2746. }
  2747. else
  2748. {
  2749. root.reset();
  2750. }
  2751. }
  2752. }
  2753. private:
  2754. static wistd::unique_ptr<ApiData>* ProcessSingleNamespace(wistd::unique_ptr<ApiData>* root, wistd::function<void(wistd::unique_ptr<ApiData>&)> workerCallback)
  2755. {
  2756. wistd::unique_ptr<ApiData>* currentNode = root;
  2757. while (*currentNode)
  2758. {
  2759. wistd::unique_ptr<ApiData>& node = *currentNode;
  2760. workerCallback(node);
  2761. // Check if our next node would be a new namespace; if so, then break out
  2762. if (node->next && !IsSameNameSpace(node->className, node->next->className))
  2763. {
  2764. break;
  2765. }
  2766. currentNode = &(node->next);
  2767. }
  2768. return currentNode;
  2769. }
  2770. static bool IsSameNameSpace(PCWSTR namespaceClass1, PCWSTR namespaceClass2)
  2771. {
  2772. return (wcsncmp(namespaceClass1, namespaceClass2, GetNameSpaceLength(namespaceClass2) + 1) == 0);
  2773. }
  2774. static size_t GetNameSpaceLength(PCWSTR nameSpaceClass)
  2775. {
  2776. const wchar_t* strAfterNamespace = GetClassStringPointer(nameSpaceClass);
  2777. return (strAfterNamespace ? (strAfterNamespace - nameSpaceClass) : wcslen(nameSpaceClass));
  2778. }
  2779. static const wchar_t* GetClassStringPointer(PCWSTR nameSpaceClass)
  2780. {
  2781. // Note: Usage of wcsrchr can cause build errors in some components, so we implement a way of getting the pointer to the 'class' portion
  2782. // of the string ourselves.
  2783. int retIndex = 0;
  2784. while (nameSpaceClass[retIndex] != '\0')
  2785. {
  2786. retIndex++;
  2787. }
  2788. while (retIndex > 0 && nameSpaceClass[retIndex] != '.')
  2789. {
  2790. retIndex--;
  2791. }
  2792. return (retIndex != 0 ? &(nameSpaceClass[retIndex]) : nullptr);
  2793. }
  2794. wistd::unique_ptr<ApiData> m_root;
  2795. wil::srwlock m_lock;
  2796. };
  2797. public:
  2798. // Initializes an entry that holds the className.apiName, along with a counter for that className.apiName.
  2799. // The counterReference passed to this should later be passed to LogApiInfo.
  2800. //
  2801. // A separate entry will be created for each apiName that has a distinct specialization value.
  2802. //
  2803. // This function only needs to be called once for each API, although it doesn't hurt if it gets called more than once.
  2804. //
  2805. // The apiName, className, and specialization parameters should be compile time constants. specialization can be null.
  2806. DEFINE_EVENT_METHOD(InitApiData)(PCWSTR className, PCWSTR apiName, _In_opt_ PCSTR specialization, volatile long* counterReference)
  2807. {
  2808. // TODO: Validate that apiName and className are a compile-time constants; validate that specialization is
  2809. // either compile-time constant or nullptr; validate that counterReference points to static variable.
  2810. // Can do this by making sure address is <= (GetModuleHandle() + DLL size).
  2811. m_apiDataList.Insert(className, apiName, specialization, counterReference);
  2812. }
  2813. // Fires a telemetry event that contains the method call apiName that has been logged by the component,
  2814. // since the last FireEvent() call, or since the component was loaded.
  2815. DEFINE_EVENT_METHOD(FireEvent)()
  2816. {
  2817. m_apiDataList.Flush(
  2818. [](PCWSTR nameSpace, PCWSTR apiList, PCSTR specializationList, UINT32* countArray, UINT16 numCounters)
  2819. {
  2820. if (::wil::details::IsDebuggerPresent())
  2821. {
  2822. TraceLoggingWrite(Provider(), "ApiCallCountsWithDebuggerPresent", TraceLoggingValue(nameSpace, "Namespace"), TraceLoggingValue(apiList, "ApiDataList"),
  2823. TraceLoggingValue(specializationList, "CustomList"), TraceLoggingUInt32Array(countArray, numCounters, "HitCounts"), TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"),
  2824. TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA));
  2825. }
  2826. else
  2827. {
  2828. TraceLoggingWrite(Provider(), "ApiCallCounts", TraceLoggingValue(nameSpace, "Namespace"), TraceLoggingValue(apiList, "ApiDataList"),
  2829. TraceLoggingValue(specializationList, "CustomList"), TraceLoggingUInt32Array(countArray, numCounters, "HitCounts"), TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"),
  2830. TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES));
  2831. }
  2832. __TRACELOGGING_TEST_HOOK_VERIFY_API_TELEMETRY(nameSpace, apiList, specializationList, countArray, numCounters);
  2833. });
  2834. if (m_fireEventDelay < c_fireEventDelayLimit)
  2835. {
  2836. // Double the exponential backoff timer, until it reaches the maximum
  2837. m_fireEventDelay *= 2;
  2838. if (m_fireEventDelay > c_fireEventDelayLimit)
  2839. {
  2840. m_fireEventDelay = c_fireEventDelayLimit;
  2841. }
  2842. }
  2843. ScheduleFireEventCallback();
  2844. }
  2845. // Used to declare that the component will handle calling FireEvent() in its own suspend handler.
  2846. // This optimizes the frequency at which the event will be fired.
  2847. DEFINE_EVENT_METHOD(UsingOwnSuspendHandler)()
  2848. {
  2849. m_fireEventDelay = c_fireEventDelayLimit;
  2850. ScheduleFireEventCallback();
  2851. }
  2852. private:
  2853. void Initialize() WI_NOEXCEPT override
  2854. {
  2855. #ifdef WIL_API_TELEMETRY_SUSPEND_HANDLER
  2856. m_fireEventDelay = c_fireEventDelayLimit;
  2857. PPSM_APPSTATE_REGISTRATION psmReg;
  2858. BOOLEAN quiesced;
  2859. PsmRegisterAppStateChangeNotification(
  2860. [](BOOLEAN quiesced, PVOID, HANDLE)
  2861. {
  2862. if (quiesced)
  2863. {
  2864. FireEvent();
  2865. }
  2866. },
  2867. StateChangeCategoryApplication, 0, nullptr, &quiesced, &psmReg);
  2868. #else
  2869. m_fireEventDelay = __TRACELOGGING_TEST_HOOK_API_TELEMETRY_EVENT_DELAY_MS;
  2870. #endif
  2871. m_fireEventThreadPoolTimer.reset(::CreateThreadpoolTimer(
  2872. [](PTP_CALLBACK_INSTANCE, PVOID, PTP_TIMER)
  2873. {
  2874. FireEvent();
  2875. },
  2876. nullptr,
  2877. nullptr));
  2878. ScheduleFireEventCallback();
  2879. }
  2880. ~ApiTelemetryLogger() WI_NOEXCEPT override
  2881. {
  2882. FireEvent();
  2883. // release handle to thread pool timer instead of its destructor being call, if process is being terminated and dll is not being unloaded dynamically
  2884. // destruction of threadpool timer is considered invalid during process termination
  2885. if (ProcessShutdownInProgress())
  2886. {
  2887. m_fireEventThreadPoolTimer.release();
  2888. }
  2889. }
  2890. void ScheduleFireEventCallback()
  2891. {
  2892. // do not schedule thread pool timer callback, if process is being terminated and dll is not being unloaded dynamically
  2893. if (m_fireEventThreadPoolTimer && !ProcessShutdownInProgress())
  2894. {
  2895. // Note this will override any pending scheduled callback
  2896. FILETIME dueTime;
  2897. *reinterpret_cast<PLONGLONG>(&dueTime) = -static_cast<LONGLONG>(m_fireEventDelay * 10000);
  2898. SetThreadpoolTimer(m_fireEventThreadPoolTimer.get(), &dueTime, 0, 0);
  2899. }
  2900. }
  2901. ApiDataList m_apiDataList;
  2902. wil::unique_threadpool_timer m_fireEventThreadPoolTimer;
  2903. // The timer used to determine when to fire the next telemetry event (when it's fired based on a timer).
  2904. UINT m_fireEventDelay;
  2905. DWORD const c_fireEventDelayLimit = 20 * 60 * 1000; // 20 minutes
  2906. };
  2907. } // namespace details
  2908. /// @endcond
  2909. } // namespace wil
  2910. // Insert WI_LOG_API_USE near the top of a WinRT method to log that a method was called.
  2911. // The parameter should be the method name, for example:
  2912. // - WI_LOG_API_USE(L"LaunchUriAsync");
  2913. //
  2914. // To log that the WinRT method reached a certain line of code, pass an override string:
  2915. // - WI_LOG_API_USE(L"LaunchUriAsync", "PointA");
  2916. //
  2917. // If the class name can't be obtained at runtime, or if instrumenting a non-WinRT API, use the below macro,
  2918. // and pass the fully qualified class name (in the case of WinRT), or a string identifying the group of the non-WinRT API:
  2919. // - WI_LOG_CLASS_API_USE(RuntimeClass_Windows_System_Launcher, L"LaunchUriAsync");
  2920. //
  2921. // Note: If the component can have a suspend handler, the following line should be added before including TraceLogging.h:
  2922. // - #define WIL_API_TELEMETRY_SUSPEND_HANDLER
  2923. // This will optimize the component's ability to upload telemetry, as it will upload on suspend. It will also disable
  2924. // frequent telemetry upload early in process execution.
  2925. //
  2926. // Alternatively, a component can call wil::details:ApiTelemetryLogger::FireEvent() from it's own suspend handler.
  2927. // If this is done, then in DLLMain it should also call wil::details::ApiTelemetryLogger::UsingOwnSuspendHandler().
  2928. //
  2929. // Note: In your DLLMain method, please also add following code snippet
  2930. //
  2931. // wil::details::g_processShutdownInProgress = (lpReserved == nullptr);
  2932. //
  2933. // Adding this code snippet ensures that during process termination, thread pool timer
  2934. // destructor or SetThreadPoolTimer methods are not called, because they are invalid to call
  2935. // when dll is not getting dynamically unloaded. Skipping this code block will result in a continuable
  2936. // exception being thrown if process is getting terminated and dll in which ApiTelemetryLogger is not getting dynamically
  2937. // unloaded. For more details about lpReserved parameter, please refer to MSDN.
  2938. #define __WI_LOG_CLASS_API_USE3(className, apiName, specialization) \
  2939. do \
  2940. { \
  2941. static volatile long __wil_apiCallCounter = 0; \
  2942. if (1 == ::InterlockedIncrementNoFence(&__wil_apiCallCounter)) \
  2943. { \
  2944. ::wil::details::ApiTelemetryLogger::InitApiData(className, apiName, specialization, &__wil_apiCallCounter); \
  2945. } \
  2946. } \
  2947. while (0,0)
  2948. #define __WI_LOG_CLASS_API_USE2(className, apiName) \
  2949. __WI_LOG_CLASS_API_USE3(className, apiName, nullptr)
  2950. #define __WI_LOG_API_USE2(apiName, specialization) \
  2951. __WI_LOG_CLASS_API_USE3(InternalGetRuntimeClassName(), apiName, specialization)
  2952. #define __WI_LOG_API_USE1(apiName) \
  2953. __WI_LOG_CLASS_API_USE3(InternalGetRuntimeClassName(), apiName, nullptr)
  2954. #define WI_LOG_CLASS_API_USE(...) \
  2955. WI_MACRO_DISPATCH(__WI_LOG_CLASS_API_USE, __VA_ARGS__)
  2956. #define WI_LOG_API_USE(...) \
  2957. WI_MACRO_DISPATCH(__WI_LOG_API_USE, __VA_ARGS__)
  2958. #ifdef __clang__
  2959. #pragma clang diagnostic pop
  2960. #endif
  2961. #pragma warning(pop)
  2962. #endif // __WIL_TRACELOGGING_H_INCLUDED