/*++ Copyright (c) 1992 Microsoft Corporation Module Name: logger.c Abstract: This file contains the code for the debug logging facility. Author: Steve Wood (stevewo) 20-Jun-1992 Environment: kernel mode callable only. Revision History: 20-Jun-1992 Steve Wood (stevewo) Created. --*/ #include "exp.h" PEX_DEBUG_LOG ExCreateDebugLog( IN UCHAR MaximumNumberOfTags, IN ULONG MaximumNumberOfEvents ) { PEX_DEBUG_LOG Log; ULONG Size; Size = sizeof( EX_DEBUG_LOG ) + (MaximumNumberOfTags * sizeof( EX_DEBUG_LOG_TAG ) ) + (MaximumNumberOfEvents * sizeof( EX_DEBUG_LOG_EVENT ) ); Log = ExAllocatePool( NonPagedPool, Size ); if (Log != NULL) { RtlZeroMemory( Log, Size ); KeInitializeSpinLock( &Log->Lock ); Log->MaximumNumberOfTags = MaximumNumberOfTags; Log->Tags = (PEX_DEBUG_LOG_TAG)(Log + 1); Log->First = (PEX_DEBUG_LOG_EVENT)(Log->Tags + MaximumNumberOfTags); Log->Last = Log->First + MaximumNumberOfEvents; Log->Next = Log->First; } return Log; } UCHAR ExCreateDebugLogTag( IN PEX_DEBUG_LOG Log, IN PCHAR Name, IN UCHAR Format1, IN UCHAR Format2, IN UCHAR Format3, IN UCHAR Format4 ) { KIRQL OldIrql; ULONG Size; PEX_DEBUG_LOG_TAG Tag; UCHAR TagIndex; PCHAR CapturedName; Size = strlen( Name ); CapturedName = ExAllocatePool( NonPagedPool, Size ); RtlMoveMemory( CapturedName, Name, Size + 1 ); ExAcquireSpinLock( &Log->Lock, &OldIrql ); if (Log->NumberOfTags < Log->MaximumNumberOfTags) { TagIndex = (UCHAR)(Log->NumberOfTags++); Tag = &Log->Tags[ TagIndex ]; Tag->Name = CapturedName; Tag->Format[ 0 ] = Format1; Tag->Format[ 1 ] = Format2; Tag->Format[ 2 ] = Format3; Tag->Format[ 3 ] = Format4; CapturedName = NULL; } else { TagIndex = (UCHAR)0xFF; } ExReleaseSpinLock( &Log->Lock, OldIrql ); if (CapturedName != NULL) { ExFreePool( CapturedName ); } return TagIndex; } VOID ExDebugLogEvent( IN PEX_DEBUG_LOG Log, IN UCHAR Tag, IN ULONG Data1, IN ULONG Data2, IN ULONG Data3, IN ULONG Data4 ) { KIRQL OldIrql; PEX_DEBUG_LOG_EVENT p; PETHREAD Thread = PsGetCurrentThread(); LARGE_INTEGER CurrentTime; KeQuerySystemTime( &CurrentTime ); ExAcquireSpinLock( &Log->Lock, &OldIrql ); p = Log->Next; if (p == Log->Last) { p = Log->First; } Log->Next = p + 1; p->ThreadId = Thread->Cid.UniqueThread; p->ProcessId = Thread->Cid.UniqueProcess; p->Time = CurrentTime.LowPart; p->Tag = Tag; p->Data[ 0 ] = Data1; p->Data[ 1 ] = Data2; p->Data[ 2 ] = Data3; p->Data[ 3 ] = Data4; ExReleaseSpinLock( &Log->Lock, OldIrql ); return; }