#include <tier0/valve_tracelogging.h>
#if IsTraceLoggingEnabled()
typedef ULONG (__stdcall *tEventRegister)( LPCGUID ProviderId, PENABLECALLBACK EnableCallback, PVOID CallbackContext, PREGHANDLE RegHandle );
static tEventRegister s_pEventRegister;
typedef ULONG (__stdcall *tEventUnregister)( REGHANDLE RegHandle );
static tEventUnregister s_pEventUnregister;
typedef ULONG (__stdcall *tEventWriteTransfer)( REGHANDLE RegHandle, PCEVENT_DESCRIPTOR EventDescriptor, LPCGUID ActivityId, LPCGUID RelatedActivityId, ULONG UserDataCount, PEVENT_DATA_DESCRIPTOR UserData );
static ULONG __stdcall Dummy_EventWriteTransfer( REGHANDLE RegHandle, PCEVENT_DESCRIPTOR EventDescriptor, LPCGUID ActivityId, LPCGUID RelatedActivityId, ULONG UserDataCount, PEVENT_DATA_DESCRIPTOR UserData ) { return 0; }
static tEventWriteTransfer s_pEventWriteTransfer = Dummy_EventWriteTransfer;
typedef ULONG (__stdcall *tEventActivityIdControl)( ULONG ControlCode, LPGUID ActivityId );
static ULONG __stdcall Dummy_EventActivityIdControl( ULONG ControlCode, LPGUID ActivityId ) { return ERROR_NOT_SUPPORTED; }
static tEventActivityIdControl s_pEventActivityIdControl = Dummy_EventActivityIdControl;
PLATFORM_INTERFACE ULONG Plat_EventRegister( LPCGUID ProviderId, PENABLECALLBACK EnableCallback, PVOID CallbackContext, PREGHANDLE RegHandle )
{
static bool once = [](){
HMODULE pAdvapiDLL = ::LoadLibraryA( "advapi32.dll" );
if ( pAdvapiDLL )
{
tEventWriteTransfer pEventWriteTranfer = ( tEventWriteTransfer )GetProcAddress( pAdvapiDLL, "EventWriteTransfer" );
tEventActivityIdControl pEventActivityIdControl = ( tEventActivityIdControl )GetProcAddress( pAdvapiDLL, "EventActivityIdControl" );
if ( pEventWriteTranfer && pEventActivityIdControl )
{
s_pEventRegister = ( tEventRegister )GetProcAddress( pAdvapiDLL, "EventRegister" );
s_pEventUnregister = ( tEventUnregister )GetProcAddress( pAdvapiDLL, "EventUnregister" );
s_pEventWriteTransfer = pEventWriteTranfer;
s_pEventActivityIdControl = pEventActivityIdControl;
}
}
return true;
}();
if ( s_pEventRegister )
return s_pEventRegister( ProviderId, EnableCallback, CallbackContext, RegHandle );
*RegHandle = 0;
return 0;
}
PLATFORM_INTERFACE ULONG Plat_EventUnregister( REGHANDLE RegHandle )
{
if ( s_pEventUnregister )
return s_pEventUnregister( RegHandle );
return 0;
}
PLATFORM_INTERFACE ULONG __stdcall Plat_EventWriteTransfer( REGHANDLE RegHandle, PCEVENT_DESCRIPTOR EventDescriptor, LPCGUID ActivityId, LPCGUID RelatedActivityId, ULONG UserDataCount, PEVENT_DATA_DESCRIPTOR UserData )
{
return (*s_pEventWriteTransfer)( RegHandle, EventDescriptor, ActivityId, RelatedActivityId, UserDataCount, UserData );
}
PLATFORM_INTERFACE ULONG __stdcall Plat_EventActivityIdControl( ULONG ControlCode, LPGUID ActivityId )
{
return (*s_pEventActivityIdControl)( ControlCode, ActivityId );
}
#endif