|
|
#ifndef _TRACEP_H
#define _TRACEP_H
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
tracep.h
Abstract:
Private header for trace component
Author:
JeePang
Environment:
Revision History:
--*/ #define MAX_WMI_BUFFER_SIZE 1024 // in KBytes
#define MAX_FILE_TABLE_SIZE 64
#define KERNEL_LOGGER (0)
// NOTE: Consider allowing user to change the two values below
#define TRACE_MAXIMUM_NP_POOL_USAGE 10 // maximum per cent of NP used
#define BYTES_PER_MB 1048576 // Conversion for FileSizeLimit
#define REQUEST_FLAG_NEW_FILE 0x00000001 // request for new file
#define REQUEST_FLAG_FLUSH_BUFFERS 0x00000002 // request for flush
#define REQUEST_FLAG_CIRCULAR_PERSIST 0x00010000
#define REQUEST_FLAG_CIRCULAR_TRANSITION 0x00020000
#define TRACEPOOLTAG 'timW'
//
// Increase refcount on a logger context
#define WmipReferenceLogger(Id) InterlockedIncrement(&WmipRefCount[Id])
// Decrease refcount on a logger context
#define WmipDereferenceLogger(Id) InterlockedDecrement(&WmipRefCount[Id])
// Macro to retrieve Logger Context from LoggerId as index
//
#define WmipGetLoggerContext(LoggerId) \
(LoggerId < MAXLOGGERS) ? \ WmipLoggerContext[LoggerId] : NULL
#define WmipIsValidLogger(L) \
(((L) != NULL) && ((L) != (PWMI_LOGGER_CONTEXT) &WmipLoggerContext[0])\ ? TRUE : FALSE)
#define WmipInitializeMutex(x) KeInitializeMutex((x), 0)
#define WmipAcquireMutex(x) KeWaitForSingleObject((x), Executive, KernelMode,\
FALSE, NULL) #define WmipReleaseMutex(x) KeReleaseMutex((x), FALSE)
//
// Wmi Buffer states
//
#define BUFFER_STATE_UNUSED 0 // Buffer is empty, not used
#define BUFFER_STATE_DIRTY 1 // Buffer is being used
#define BUFFER_STATE_FULL 2 // Buffer is filled up
#define BUFFER_STATE_FLUSH 4 // Buffer ready for flush
//
// Context Swap Trace Constants
//
#define WMI_CTXSWAP_EVENTSIZE_ALIGNMENT 8
//
// Private local data structures used
//
__inline __int64 WmipGetSystemTime( VOID ) { LARGE_INTEGER Time; KiQuerySystemTime(&Time); return Time.QuadPart; }
__inline __int64 WmipGetPerfCounter( VOID ) { LARGE_INTEGER Time; Time = KeQueryPerformanceCounter(NULL); return Time.QuadPart; }
#if _MSC_VER >= 1200
#pragma warning( push )
#endif
#pragma warning( disable:4214 )
#pragma warning( disable:4201 )
//
// Perf logging states
//
#define PERF_LOG_NO_TRANSITION 0 // No Perf Logging transition
#define PERF_LOG_START_TRANSITION 1 // Perf Logging is starting
#define PERF_LOG_STOP_TRANSITION 2 // Perf logging is ending
typedef struct _WMI_LOGGER_MODE { ULONG SequentialFile:1; ULONG CircularFile:1; ULONG AppendFile:1; ULONG Unused1:5; ULONG RealTime:1; ULONG DelayOpenFile:1; ULONG BufferOnly:1; ULONG PrivateLogger:1; ULONG AddHeader:1; ULONG UseExisting:1; ULONG UseGlobalSequence:1; ULONG UseLocalSequence:1; ULONG Unused2:16; } WMI_LOGGER_MODE, *PWMI_LOGGER_MODE;
typedef struct _WMI_LOGGER_CONTEXT { //
// the following are private context used by the buffer manager
//
KSPIN_LOCK BufferSpinLock; LARGE_INTEGER StartTime; HANDLE LogFileHandle; KSEMAPHORE LoggerSemaphore; PETHREAD LoggerThread; KEVENT LoggerEvent; KEVENT FlushEvent; NTSTATUS LoggerStatus; ULONG LoggerId;
LONG BuffersAvailable; ULONG UsePerfClock; ULONG WriteFailureLimit; #ifdef WMI_NON_BLOCKING
ULONG BuffersDirty; ULONG BuffersInUse; ULONG SwitchingInProgress; SLIST_HEADER FreeList; SLIST_HEADER FlushList; SLIST_HEADER GlobalList; SLIST_HEADER* ProcessorBuffers; // Per Processor Buffer
#else
LIST_ENTRY FreeList; LIST_ENTRY FlushList; PLIST_ENTRY TransitionBuffer; // Used to find Buffer
PWMI_BUFFER_HEADER* ProcessorBuffers; // Per Processor Buffer
#endif //WMI_NON_BLOCKING
UNICODE_STRING LoggerName; // points to paged pool
UNICODE_STRING LogFileName; UNICODE_STRING LogFilePattern; UNICODE_STRING NewLogFileName; // for updating log file name
PUCHAR EndPageMarker;
LONG CollectionOn; ULONG KernelTraceOn; LONG PerfLogInTransition; // perf logging transition status
ULONG RequestFlag; ULONG EnableFlags; ULONG MaximumFileSize; union { ULONG LoggerMode; WMI_LOGGER_MODE LoggerModeFlags; }; ULONG LastFlushedBuffer; ULONG RefCount; #ifdef WMI_NON_BLOCKING
ULONG FlushTimer; #else
LARGE_INTEGER FlushTimer; #endif //WMI_NON_BLOCKING
LARGE_INTEGER FirstBufferOffset; LARGE_INTEGER ByteOffset; LARGE_INTEGER BufferAgeLimit;
// the following are attributes available for query
ULONG MaximumBuffers; ULONG MinimumBuffers; ULONG EventsLost; ULONG BuffersWritten; ULONG LogBuffersLost; ULONG RealTimeBuffersLost; ULONG BufferSize; LONG NumberOfBuffers; PLONG SequencePtr;
GUID InstanceGuid; PVOID LoggerHeader; WMI_GET_CPUCLOCK_ROUTINE GetCpuClock; SECURITY_CLIENT_CONTEXT ClientSecurityContext; // logger specific extension to context
PVOID LoggerExtension; LONG ReleaseQueue; TRACE_ENABLE_FLAG_EXTENSION EnableFlagExtension; ULONG LocalSequence; ULONG MaximumIrql; PULONG EnableFlagArray; #ifndef WMI_MUTEX_FREE
KMUTEX LoggerMutex; LONG MutexCount; #endif
ULONG FileCounter; WMI_TRACE_BUFFER_CALLBACK BufferCallback; PVOID CallbackContext; POOL_TYPE PoolType; LARGE_INTEGER ReferenceSystemTime; // always in SystemTime
LARGE_INTEGER ReferenceTimeStamp; // by specified clocktype
} WMI_LOGGER_CONTEXT, *PWMI_LOGGER_CONTEXT;
#if _MSC_VER >= 1200
#pragma warning( pop )
#endif
extern LONG WmipRefCount[MAXLOGGERS]; // Global refcount on loggercontext
extern PWMI_LOGGER_CONTEXT WmipLoggerContext[MAXLOGGERS]; extern PWMI_BUFFER_HEADER WmipContextSwapProcessorBuffers[MAXIMUM_PROCESSORS]; extern PFILE_OBJECT* WmipFileTable; // Filename hashing table
#ifdef WMI_NON_BLOCKING
extern KSPIN_LOCK WmiSlistLock; #endif //WMI_NON_BLOCKING
extern ULONG WmipGlobalSequence; extern ULONG WmipPtrSize; // temporary for wmikd to work
extern ULONG WmipKernelLogger; extern ULONG WmipEventLogger;
extern ULONG WmiUsePerfClock; extern ULONG WmiTraceAlignment; extern ULONG WmiWriteFailureLimit; extern FAST_MUTEX WmipTraceFastMutex; extern WMI_TRACE_BUFFER_CALLBACK WmipGlobalBufferCallback;
//
// Private routines for tracing support
//
//
// from tracelog.c
//
NTSTATUS WmipFlushBuffer( IN PWMI_LOGGER_CONTEXT LoggerContext, IN PWMI_BUFFER_HEADER Buffer );
NTSTATUS WmipStartLogger( IN OUT PWMI_LOGGER_INFORMATION LoggerInfo );
NTSTATUS WmipQueryLogger( IN OUT PWMI_LOGGER_INFORMATION LoggerInfo, IN PWMI_LOGGER_CONTEXT LoggerContext );
#if DBG
NTSTATUS WmipVerifyLoggerInfo( IN PWMI_LOGGER_INFORMATION LoggerInfo, OUT PWMI_LOGGER_CONTEXT *LoggerContext, LPSTR Caller ); #else
NTSTATUS WmipVerifyLoggerInfo( IN PWMI_LOGGER_INFORMATION LoggerInfo, OUT PWMI_LOGGER_CONTEXT *LoggerContext ); #endif
VOID WmipFreeLoggerContext( IN PWMI_LOGGER_CONTEXT LoggerContext );
NTSTATUS WmipStopLoggerInstance( IN PWMI_LOGGER_CONTEXT LoggerContext );
NTSTATUS WmipFlushActiveBuffers( IN PWMI_LOGGER_CONTEXT, IN ULONG FlushAll );
PSYSTEM_TRACE_HEADER FASTCALL WmiReserveWithSystemHeader( IN ULONG LoggerId, IN ULONG AuxSize, IN PETHREAD Thread, OUT PVOID *BufferResource );
PVOID FASTCALL WmipReserveTraceBuffer( IN PWMI_LOGGER_CONTEXT LoggerContext, IN ULONG RequiredSize, OUT PWMI_BUFFER_HEADER *BufferResource );
ULONG FASTCALL WmipReleaseTraceBuffer( IN PWMI_BUFFER_HEADER Buffer, IN PWMI_LOGGER_CONTEXT LoggerContext );
PWMI_BUFFER_HEADER WmipGetFreeBuffer( IN PWMI_LOGGER_CONTEXT LoggerContext );
#ifdef WMI_NON_BLOCKING
ULONG WmipAllocateFreeBuffers( IN PWMI_LOGGER_CONTEXT LoggerContext, IN ULONG NumberOfBuffers );
NTSTATUS WmipAdjustFreeBuffers( IN PWMI_LOGGER_CONTEXT LoggerContext ); #endif //NWMI_NON_BLOCKING
NTSTATUS WmipShutdown( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
VOID WmipLogger( IN PWMI_LOGGER_CONTEXT LoggerContext );
NTSTATUS WmipSendNotification( PWMI_LOGGER_CONTEXT LoggerContext, NTSTATUS Status, ULONG Flag );
#if DBG
VOID TraceDebugPrint( ULONG DebugPrintLevel, PCCHAR DebugMessage, ... );
#define TraceDebug(x) TraceDebugPrint x
#else
#define TraceDebug(x)
#endif
PWMI_BUFFER_HEADER FASTCALL WmipPopFreeContextSwapBuffer (UCHAR CurrentProcessor );
VOID FASTCALL WmipPushDirtyContextSwapBuffer (UCHAR CurrentProcessor, PWMI_BUFFER_HEADER Buffer );
// from callouts.c
VOID WmipSetTraceNotify( IN PDEVICE_OBJECT DeviceObject, IN ULONG TraceClass, IN ULONG Enable );
VOID FASTCALL WmipEnableKernelTrace( IN ULONG EnableFlags );
VOID FASTCALL WmipDisableKernelTrace( IN ULONG EnableFlags );
NTSTATUS WmipDelayCreate( OUT PHANDLE FileHandle, IN OUT PUNICODE_STRING FileName, IN ULONG Append );
PWMI_LOGGER_CONTEXT FASTCALL WmipIsLoggerOn(IN ULONG LoggerId);
// from globalog.c
VOID WmipStartGlobalLogger();
NTSTATUS WmipQueryGLRegistryRoutine( IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext );
NTSTATUS WmipAddLogHeader( IN PWMI_LOGGER_CONTEXT LoggerContext, IN OUT PWMI_BUFFER_HEADER Buffer );
NTSTATUS WmipCreateDirectoryFile( IN PWCHAR DirFileName, IN ULONG IsDirectory, OUT PHANDLE FileHandle, ULONG Append );
NTSTATUS WmipCreateNtFileName( IN PWCHAR strFileName, OUT PWCHAR * strNtFileName );
NTSTATUS WmipFlushLogger( IN OUT PWMI_LOGGER_CONTEXT LoggerContext, IN ULONG Wait );
NTSTATUS FASTCALL WmipNotifyLogger( IN PWMI_LOGGER_CONTEXT LoggerContext );
PVOID WmipExtendBase( IN PWMI_LOGGER_CONTEXT Base, IN ULONG Size );
NTSTATUS WmipGenerateFileName( IN PUNICODE_STRING FilePattern, IN OUT PLONG FileCounter, OUT PUNICODE_STRING FileName );
VOID WmipValidateClockType( IN OUT PWMI_LOGGER_INFORMATION LoggerInfo );
ULONG WmipDumpGuidMaps( IN PWMI_LOGGER_CONTEXT LoggerContext, IN PLIST_ENTRY TraceGMHeadPtr );
PVOID WmipGetTraceBuffer( IN PWMI_LOGGER_CONTEXT LoggerContext, IN HANDLE LogFileHandle, IN PWMI_BUFFER_HEADER Buffer, IN ULONG GroupType, IN ULONG RequiredSize, OUT PULONG GuidMapBuffers );
#ifdef NTPERF
NTSTATUS WmipSwitchPerfmemBuffer( PWMI_SWITCH_PERFMEM_BUFFER_INFORMATION SwitchBufferInfo ); #endif //NTPERF
NTSTATUS WmipNtDllLoggerInfo( PWMINTDLLLOGGERINFO Buffer );
#endif // _TRACEP_H
|