summaryrefslogblamecommitdiffstats
path: root/private/ntos/ex/logger.c
blob: 388ad8263ef944db23ae45b4b5d77fcc4392e030 (plain) (tree)













































































































































                                                                            
/*++

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;
}