1
0
mirror of https://github.com/wolfpld/tracy synced 2025-05-01 21:23:52 +00:00

Keep event trace properties to terminate trace on exit.

This commit is contained in:
Bartosz Taudul 2019-08-13 01:58:16 +02:00
parent 7f856a1b16
commit b313e46139

View File

@ -20,6 +20,7 @@ namespace tracy
TRACEHANDLE s_traceHandle; TRACEHANDLE s_traceHandle;
TRACEHANDLE s_traceHandle2; TRACEHANDLE s_traceHandle2;
EVENT_TRACE_PROPERTIES* s_prop;
struct CSwitch struct CSwitch
{ {
@ -87,33 +88,36 @@ bool SysTraceStart()
if( status != ERROR_SUCCESS ) return false; if( status != ERROR_SUCCESS ) return false;
const auto psz = sizeof( EVENT_TRACE_PROPERTIES ) + sizeof( KERNEL_LOGGER_NAME ); const auto psz = sizeof( EVENT_TRACE_PROPERTIES ) + sizeof( KERNEL_LOGGER_NAME );
auto prop = (EVENT_TRACE_PROPERTIES*)tracy_malloc( psz ); s_prop = (EVENT_TRACE_PROPERTIES*)tracy_malloc( psz );
memset( prop, 0, sizeof( EVENT_TRACE_PROPERTIES ) ); memset( s_prop, 0, sizeof( EVENT_TRACE_PROPERTIES ) );
prop->EnableFlags = EVENT_TRACE_FLAG_CSWITCH; s_prop->EnableFlags = EVENT_TRACE_FLAG_CSWITCH;
prop->LogFileMode = EVENT_TRACE_REAL_TIME_MODE; s_prop->LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
prop->Wnode.BufferSize = psz; s_prop->Wnode.BufferSize = psz;
prop->Wnode.Flags = WNODE_FLAG_TRACED_GUID; s_prop->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
prop->Wnode.ClientContext = 3; s_prop->Wnode.ClientContext = 3;
prop->Wnode.Guid = SystemTraceControlGuid; s_prop->Wnode.Guid = SystemTraceControlGuid;
prop->LoggerNameOffset = sizeof( EVENT_TRACE_PROPERTIES ); s_prop->LoggerNameOffset = sizeof( EVENT_TRACE_PROPERTIES );
memcpy( ((char*)prop) + sizeof( EVENT_TRACE_PROPERTIES ), KERNEL_LOGGER_NAME, sizeof( KERNEL_LOGGER_NAME ) ); memcpy( ((char*)s_prop) + sizeof( EVENT_TRACE_PROPERTIES ), KERNEL_LOGGER_NAME, sizeof( KERNEL_LOGGER_NAME ) );
auto backup = tracy_malloc( psz ); auto backup = tracy_malloc( psz );
memcpy( backup, prop, psz ); memcpy( backup, s_prop, psz );
const auto controlStatus = ControlTrace( 0, KERNEL_LOGGER_NAME, prop, EVENT_TRACE_CONTROL_STOP ); const auto controlStatus = ControlTrace( 0, KERNEL_LOGGER_NAME, s_prop, EVENT_TRACE_CONTROL_STOP );
if( controlStatus != ERROR_SUCCESS && controlStatus != ERROR_WMI_INSTANCE_NOT_FOUND ) if( controlStatus != ERROR_SUCCESS && controlStatus != ERROR_WMI_INSTANCE_NOT_FOUND )
{ {
tracy_free( prop ); tracy_free( s_prop );
return false; return false;
} }
memcpy( prop, backup, psz ); memcpy( s_prop, backup, psz );
tracy_free( backup ); tracy_free( backup );
const auto startStatus = StartTrace( &s_traceHandle, KERNEL_LOGGER_NAME, prop ); const auto startStatus = StartTrace( &s_traceHandle, KERNEL_LOGGER_NAME, s_prop );
tracy_free( prop ); if( startStatus != ERROR_SUCCESS )
if( startStatus != ERROR_SUCCESS ) return false; {
tracy_free( s_prop );
return false;
}
EVENT_TRACE_LOGFILE log = {}; EVENT_TRACE_LOGFILE log = {};
log.LoggerName = KERNEL_LOGGER_NAME; log.LoggerName = KERNEL_LOGGER_NAME;
@ -124,6 +128,7 @@ bool SysTraceStart()
if( s_traceHandle2 == (TRACEHANDLE)INVALID_HANDLE_VALUE ) if( s_traceHandle2 == (TRACEHANDLE)INVALID_HANDLE_VALUE )
{ {
CloseTrace( s_traceHandle ); CloseTrace( s_traceHandle );
tracy_free( s_prop );
return false; return false;
} }
@ -139,6 +144,8 @@ void SysTraceStop()
void SysTraceWorker( void* ptr ) void SysTraceWorker( void* ptr )
{ {
ProcessTrace( &s_traceHandle2, 1, 0, 0 ); ProcessTrace( &s_traceHandle2, 1, 0, 0 );
ControlTrace( 0, KERNEL_LOGGER_NAME, s_prop, EVENT_TRACE_CONTROL_STOP );
tracy_free( s_prop );
} }
} }