/*++

Copyright (c) 2000 Microsoft Corporation

Module Name:

    kerbtrace.cxx

Abstract:

    Set up event tracing for Kerberos

Author:

    15 June 2000  t-ryanj     (* largely stolen from kdctrace.cxx *)

Revision History:

--*/


#include <kerb.hxx>
#include <wmistr.h>
#define INITGUID
#include "kerbdbg.h"

#define RESOURCE_NAME       __TEXT("MOF_RESOURCE")  // kerberos.mof => kerberos.bmf => MOF_RESOURCE
#define IMAGE_PATH          __TEXT("kerberos.dll")

BOOLEAN          KerbEventTraceFlag = FALSE;
TRACEHANDLE      KerbTraceRegistrationHandle = (TRACEHANDLE) 0;
TRACEHANDLE      KerbTraceLoggerHandle = (TRACEHANDLE) 0;


ULONG
KerbTraceControlCallback(
    IN WMIDPREQUESTCODE RequestCode,
    IN PVOID RequestContext,
    IN OUT ULONG *InOutBufferSize,
    IN OUT PVOID Buffer
    );

TRACE_GUID_REGISTRATION KerbTraceGuids[] =
{
    { &KerbLogonGuid,      NULL },
    { &KerbInitSCGuid,     NULL },
    { &KerbAcceptSCGuid,   NULL },
    { &KerbSetPassGuid,    NULL },
    { &KerbChangePassGuid, NULL }
};

#define KerbGuidCount (sizeof(KerbTraceGuids) / sizeof(TRACE_GUID_REGISTRATION))

ULONG
KerbInitializeTrace(
    VOID
    )
{
    ULONG status;
    HMODULE hModule;
    TCHAR FileName[MAX_PATH+1];
    DWORD nLen = 0;

    hModule = GetModuleHandle(IMAGE_PATH);
    if (hModule != NULL) {
        nLen = GetModuleFileName(hModule, FileName, MAX_PATH);
    }
    if (nLen == 0) {
        lstrcpy(FileName, IMAGE_PATH);
    }

    status = RegisterTraceGuids(
                KerbTraceControlCallback,
                NULL,
                &KerbControlGuid,
                KerbGuidCount,
                KerbTraceGuids,
                (LPCWSTR) FileName,
                (LPCWSTR) RESOURCE_NAME,
                &KerbTraceRegistrationHandle);


    if (status != ERROR_SUCCESS) {
        DebugLog((DEB_ERROR,"Trace registration failed with %x\n",status));
    }
    return status;
}


ULONG
KerbTraceControlCallback(
    IN WMIDPREQUESTCODE RequestCode,
    IN PVOID RequestContext,
    IN OUT ULONG *InOutBufferSize,
    IN OUT PVOID Buffer
    )
{
    ULONG Status;
    ULONG RetSize;

    Status = ERROR_SUCCESS;

    switch (RequestCode)
    {
        case WMI_ENABLE_EVENTS:
        {
            KerbTraceLoggerHandle =
                GetTraceLoggerHandle(Buffer);
            KerbEventTraceFlag = TRUE;
            RetSize = 0;
            break;
        }

        case WMI_DISABLE_EVENTS:
        {
            KerbEventTraceFlag = FALSE;
            RetSize = 0;
            KerbTraceLoggerHandle = (TRACEHANDLE) 0;
            break;
        }
        default:
        {
            RetSize = 0;
            Status = ERROR_INVALID_PARAMETER;
            break;
        }

    }

    *InOutBufferSize = RetSize;
    return Status;
}