You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
6.1 KiB
137 lines
6.1 KiB
//---------------------------------------------------------------------------
|
|
// File: EtwTrace
|
|
//
|
|
// A Managed wrapper for Event Tracing for Windows
|
|
//
|
|
// Author: Melur Raghuraman
|
|
// Date: 01 Oct 2001
|
|
//---------------------------------------------------------------------------
|
|
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Microsoft.Win32.Diagnostics
|
|
{
|
|
[System.CLSCompliant(false)]
|
|
[StructLayout(LayoutKind.Explicit, Size=16)]
|
|
internal struct MofField
|
|
{
|
|
[FieldOffset(0)]
|
|
internal unsafe void * DataPointer;
|
|
[FieldOffset(8)]
|
|
internal uint DataLength;
|
|
[FieldOffset(12)]
|
|
internal uint DataType;
|
|
}
|
|
|
|
[System.CLSCompliant(false)]
|
|
[StructLayout(LayoutKind.Explicit, Size=208)] // Full Size 192
|
|
internal struct BaseEvent
|
|
{
|
|
[FieldOffset(0)]
|
|
internal uint BufferSize;
|
|
[FieldOffset(4)]
|
|
internal uint ProviderId;
|
|
[FieldOffset(8)]
|
|
internal ulong HistoricalContext;
|
|
[FieldOffset(16)]
|
|
internal Int64 TimeStamp;
|
|
[FieldOffset(24)]
|
|
internal System.Guid Guid;
|
|
[FieldOffset(40)]
|
|
internal uint ClientContext;
|
|
[FieldOffset(44)]
|
|
internal uint Flags;
|
|
//
|
|
// We have allocated enough space for 10 MOF_FIELD structures
|
|
// at the bottom. That is 1 argument descriptor, 1 FormatString and 8 arguments.
|
|
//
|
|
[FieldOffset(48)]
|
|
internal MofField UserData;
|
|
}
|
|
|
|
[System.CLSCompliant(false)]
|
|
[StructLayout(LayoutKind.Explicit, Size=8)]
|
|
internal struct TraceGuidRegistration
|
|
{
|
|
[FieldOffset(0)]
|
|
internal unsafe System.Guid *Guid;
|
|
[FieldOffset(4)]
|
|
internal unsafe void* RegHandle;
|
|
}
|
|
|
|
|
|
[System.CLSCompliant(false)]
|
|
[System.Security.SuppressUnmanagedCodeSecurity]
|
|
public sealed class EtwTrace
|
|
{
|
|
// Ensure class cannot be instantiated by making the constructor private
|
|
private EtwTrace() {}
|
|
// Enumerations
|
|
//
|
|
public sealed class RequestCodes
|
|
{
|
|
// Ensure class cannot be instantiated
|
|
private RequestCodes() {}
|
|
public const uint GetAllData = 0; // Never Used
|
|
public const uint GetSingleInstance = 1; // Never Used
|
|
public const uint SetSingleInstance = 2; // Never Used
|
|
public const uint SetSingleItem = 3; // Never Used
|
|
public const uint EnableEvents = 4; // Enable Tracing
|
|
public const uint DisableEvents = 5; // Disable Tracing
|
|
public const uint EnableCollection = 6; // Never Used
|
|
public const uint DisableCollection = 7; // Never Used
|
|
public const uint RegInfo = 8; // Registration Information
|
|
public const uint ExecuteMethod = 9; // Never Used
|
|
}
|
|
//
|
|
// Flags used by ETW Trace Message
|
|
// Note that the order or value of these flags should NOT be changed as they are processed
|
|
// in this order.
|
|
//
|
|
public sealed class TraceMessageCodes
|
|
{
|
|
// Ensure class cannot be instantiated
|
|
private TraceMessageCodes() {}
|
|
public const uint TRACE_MESSAGE_SEQUENCE = 1; // Message should include a sequence number
|
|
public const uint TRACE_MESSAGE_GUID = 2; // Message includes a GUID
|
|
public const uint TRACE_MESSAGE_COMPONENTID = 4; // Message has no GUID, Component ID instead
|
|
public const uint TRACE_MESSAGE_TIMESTAMP = 8; // Message includes a timestamp
|
|
public const uint TRACE_MESSAGE_PERFORMANCE_TIMESTAMP = 16; // Timestamp is the Performance Counter not the system clock
|
|
public const uint TRACE_MESSAGE_SYSTEMINFO = 32; // Message includes system information TID,PID
|
|
public const uint TRACE_MESSAGE_FLAG_MASK = 0xFFFF; // Only the lower 16 bits of flags are placed in the message
|
|
// those above 16 bits are reserved for local processing
|
|
public const uint TRACE_MESSAGE_MAXIMUM_SIZE = 8*1024; // the maximum size allowed for a single trace message
|
|
// longer messages will return ERROR_BUFFER_OVERFLOW
|
|
}
|
|
|
|
// Structures
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct CSTRACE_GUID_REGISTRATION
|
|
{
|
|
public unsafe System.Guid *Guid;
|
|
public uint RegHandle;
|
|
}
|
|
|
|
// Function Signatures
|
|
|
|
public unsafe delegate uint EtwProc(uint requestCode, System.IntPtr requestContext, System.IntPtr bufferSize, byte* buffer);
|
|
[DllImport("advapi32", ExactSpelling=true, EntryPoint="GetTraceEnableFlags", CharSet=System.Runtime.InteropServices.CharSet.Unicode)]
|
|
internal static extern int GetTraceEnableFlags(ulong traceHandle);
|
|
|
|
[DllImport("advapi32", ExactSpelling=true, EntryPoint="GetTraceEnableLevel", CharSet=System.Runtime.InteropServices.CharSet.Unicode)]
|
|
internal static extern char GetTraceEnableLevel(ulong traceHandle);
|
|
|
|
[DllImport("advapi32", ExactSpelling=true, EntryPoint="RegisterTraceGuidsW", CharSet=System.Runtime.InteropServices.CharSet.Unicode)]
|
|
internal static extern unsafe uint RegisterTraceGuids([In]EtwProc cbFunc, [In]void* context, [In] ref System.Guid controlGuid, [In] uint guidCount, ref TraceGuidRegistration guidReg, [In]string mofImagePath, [In] string mofResourceName, [Out] out ulong regHandle);
|
|
|
|
[DllImport("advapi32", ExactSpelling=true, EntryPoint="UnregisterTraceGuids", CharSet=System.Runtime.InteropServices.CharSet.Unicode)]
|
|
internal static extern int UnregisterTraceGuids(ulong regHandle);
|
|
|
|
[DllImport("advapi32", ExactSpelling=true, EntryPoint="TraceEvent", CharSet=System.Runtime.InteropServices.CharSet.Unicode)]
|
|
internal static extern unsafe uint TraceEvent(ulong traceHandle, char *header);
|
|
|
|
|
|
}
|
|
}
|