Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

608 lines
17 KiB

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000 Microsoft Corporation
//
// Module Name:
// SWTracingSrc.cpp
//
// Description:
// Software tracing functions.
//
// Documentation:
// Spec\Admin\Debugging.ppt
//
// Maintained By:
// Galen Barbee (GalenB) 05-DEC-2000
//
//////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <tchar.h>
//#define DebugDumpWMITraceFlags( _arg ) // NOP
//
// TODO: remove this when WMI is more dynamic
//
static const int cchDEBUG_OUTPUT_BUFFER_SIZE = 512;
//****************************************************************************
//
// WMI Tracing Routines
//
// These routines are only in the DEBUG version.
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// void
// DebugDumpWMITraceFlags(
// DEBUG_WMI_CONTROL_GUIDS * pdwcgIn
// )
//
// Description:
// Dumps the currently set flags.
//
// Arguments:
// pdwcgIn - Pointer to the DEBUG_WMI_CONTROL_GUIDS to explore.
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
void
DebugDumpWMITraceFlags(
DEBUG_WMI_CONTROL_GUIDS * pdwcgIn
)
{
DWORD dwFlag;
signed int nCount;
if ( pdwcgIn->pMapFlagsToComments == NULL )
{
DebugMsg( TEXT("DEBUG: no flag mappings available.") );
return; // NOP
} // if: no mapping table
dwFlag = 0x80000000;
for ( nCount = 31; nCount >= 0; nCount-- )
{
if ( pdwcgIn->dwFlags & dwFlag )
{
DebugMsg( TEXT("DEBUG: 0x%08x = %s"),
dwFlag,
( pdwcgIn->pMapFlagsToComments[ nCount ].pszName != NULL ? pdwcgIn->pMapFlagsToComments[ nCount ].pszName : g_szUnknown )
);
} // if: flag set
dwFlag = dwFlag >> 1;
} // for: nCount
} //*** DebugDumpWMITraceFlags( )
//****************************************************************************
//
// WMI Tracing Routines
//
// These routines are in both DEBUG and RETAIL versions.
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// ULONG
// UlWMIControlCallback(
// IN WMIDPREQUESTCODE RequestCode,
// IN PVOID RequestContext,
// IN OUT ULONG * BufferSize,
// IN OUT PVOID Buffer
// )
//
// Description:
// WMI's tracing control callback entry point.
//
// Arguments:
// See EVNTRACE.H
//
// Return Values:
// ERROR_SUCCESS - success.
// ERROR_INVALID_PARAMETER - invalid RequestCode passed in.
//
//--
//////////////////////////////////////////////////////////////////////////////
ULONG
WINAPI
UlWMIControlCallback(
IN WMIDPREQUESTCODE RequestCode,
IN PVOID RequestContext,
IN OUT ULONG * BufferSize,
IN OUT PVOID Buffer
)
{
ULONG ulResult = ERROR_SUCCESS;
DEBUG_WMI_CONTROL_GUIDS * pdwcg = (DEBUG_WMI_CONTROL_GUIDS *) RequestContext;
switch ( RequestCode )
{
case WMI_ENABLE_EVENTS:
{
TRACEHANDLE hTrace;
if ( pdwcg->hTrace == NULL )
{
hTrace = GetTraceLoggerHandle( Buffer );
} // if:
else
{
hTrace = pdwcg->hTrace;
} // else:
pdwcg->dwFlags = GetTraceEnableFlags( hTrace );
pdwcg->bLevel = GetTraceEnableLevel( hTrace );
if ( pdwcg->dwFlags == 0 )
{
if ( pdwcg->pMapLevelToFlags != NULL
&& pdwcg->bSizeOfLevelList != 0
)
{
if ( pdwcg->bLevel >= pdwcg->bSizeOfLevelList )
{
pdwcg->bLevel = pdwcg->bSizeOfLevelList - 1;
}
pdwcg->dwFlags = pdwcg->pMapLevelToFlags[ pdwcg->bLevel ].dwFlags;
DebugMsg( TEXT("DEBUG: WMI tracing level set to %u - %s, flags = 0x%08x"),
pdwcg->pszName,
pdwcg->bLevel,
pdwcg->pMapLevelToFlags[ pdwcg->bLevel ].pszName,
pdwcg->dwFlags
);
} // if: level->flag mapping available
else
{
DebugMsg( TEXT("DEBUG: WMI tracing level set to %u, flags = 0x%08x"),
pdwcg->pszName,
pdwcg->bLevel,
pdwcg->dwFlags
);
} // else: no mappings
} // if: no flags set
else
{
DebugMsg( TEXT("DEBUG: WMI tracing level set to %u, flags = 0x%08x"),
pdwcg->pszName,
pdwcg->bLevel,
pdwcg->dwFlags
);
} // else: flags set
DebugDumpWMITraceFlags( pdwcg );
pdwcg->hTrace = hTrace;
} // WMI_ENABLE_EVENTS
break;
case WMI_DISABLE_EVENTS:
pdwcg->dwFlags = 0;
pdwcg->bLevel = 0;
pdwcg->hTrace = NULL;
DebugMsg( TEXT("DEBUG: %s WMI tracing disabled."), pdwcg->pszName );
break;
default:
ulResult = ERROR_INVALID_PARAMETER;
break;
} // switch: RequestCode
return ulResult;
} //*** UlWMIControlCallback( )
//////////////////////////////////////////////////////////////////////////////
//++
//
// void
// WMIInitializeTracing(
// DEBUG_WMI_CONTROL_GUIDS dwcgControlListIn[],
// int nCountOfCOntrolGuidsIn
// )
//
// Description:
// Initialize the WMI tracing.
//
// Arguments:
// None.
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
void
WMIInitializeTracing(
DEBUG_WMI_CONTROL_GUIDS dwcgControlListIn[],
int nCountOfControlGuidsIn
)
{
TCHAR szPath[ MAX_PATH ];
ULONG ulStatus;
int nCount;
#if defined( DEBUG )
static BOOL fRegistered = FALSE;
AssertMsg( fRegistered == FALSE, "Re-entrance into InitializeWMITracing!!!" );
#endif // DEBUG
GetModuleFileName( g_hInstance, szPath, MAX_PATH );
for( nCount = 0; nCount < nCountOfControlGuidsIn; nCount++ )
{
TRACE_GUID_REGISTRATION * pList;
pList = (TRACE_GUID_REGISTRATION *)
HeapAlloc( GetProcessHeap(), 0,
sizeof( TRACE_GUID_REGISTRATION ) * dwcgControlListIn[ nCount ].dwSizeOfTraceList );
if ( pList != NULL )
{
CopyMemory( pList,
dwcgControlListIn[ nCount ].pTraceList,
sizeof( TRACE_GUID_REGISTRATION ) * dwcgControlListIn[ nCount ].dwSizeOfTraceList );
ulStatus = RegisterTraceGuids( UlWMIControlCallback, // IN RequestAddress
dwcgControlListIn, // IN RequestContext
dwcgControlListIn[ nCount ].guidControl, // IN ControlGuid
dwcgControlListIn[ nCount ].dwSizeOfTraceList, // IN GuidCount
pList, // IN GuidReg
(LPCTSTR) szPath, // IN MofImagePath
__MODULE__, // IN MofResourceName
&dwcgControlListIn[ nCount ].hRegistration // OUT RegistrationHandle
);
AssertMsg( ulStatus == ERROR_SUCCESS, "Trace registration failed" );
HeapFree( GetProcessHeap(), 0, pList );
} // if: list allocated successfully
} // for: each control GUID
#if defined( DEBUG )
fRegistered = TRUE;
#endif // DEBUG
} //*** WMIInitializeTracing( )
//////////////////////////////////////////////////////////////////////////////
//++
//
// void
// WMITerminateTracing(
// DEBUG_WMI_CONTROL_GUIDS dwcgControlListIn[],
// int nCountOfCOntrolGuidsIn
// )
//
// Description:
// Terminates WMI tracing and unregisters the interfaces.
//
// Arguments:
// dwcgControlListIn -
// nCountOfControlGuidsIn -
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
void
WMITerminateTracing(
DEBUG_WMI_CONTROL_GUIDS dwcgControlListIn[],
int nCountOfControlGuidsIn
)
{
int nCount;
for( nCount = 0; nCount < nCountOfControlGuidsIn; nCount++ )
{
dwcgControlListIn[ nCount ].dwFlags = 0;
dwcgControlListIn[ nCount ].bLevel = 0;
dwcgControlListIn[ nCount ].hTrace = NULL;
UnregisterTraceGuids( dwcgControlListIn[ nCount ].hRegistration );
} // for: each control GUID
} //*** WMITerminateTracing( )
typedef struct
{
EVENT_TRACE_HEADER EHeader; // storage for the WMI trace event header
BYTE bSize; // Size of the string - MAX 255!
WCHAR szMsg[ cchDEBUG_OUTPUT_BUFFER_SIZE ]; // Message
} DEBUG_WMI_EVENT_W;
typedef struct
{
EVENT_TRACE_HEADER EHeader; // storage for the WMI trace event header
BYTE bSize; // Size of the string - MAX 255!
CHAR szMsg[ cchDEBUG_OUTPUT_BUFFER_SIZE ]; // Message
} DEBUG_WMI_EVENT_A;
//////////////////////////////////////////////////////////////////////////////
//++
//
// void
// WMIMessageByFlags(
// DEBUG_WMI_CONTROL_GUIDS * pEntryIn,
// const DWORD dwFlagsIn,
// LPCWSTR pszFormatIn,
// ...
// )
//
// Description:
//
// Arguments:
// pEntry -
// dwFlagsIn -
// pszFormatIn -
// ... -
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
void
__cdecl
WMIMessageByFlags(
DEBUG_WMI_CONTROL_GUIDS * pEntry,
const DWORD dwFlagsIn,
LPCWSTR pszFormatIn,
...
)
{
va_list valist;
if ( pEntry->hTrace == NULL )
{
return; // NOP
} // if: no trace logger
if ( dwFlagsIn == mtfALWAYS
|| pEntry->dwFlags & dwFlagsIn
)
{
ULONG ulStatus;
DEBUG_WMI_EVENT_W DebugEvent;
PEVENT_TRACE_HEADER peth = (PEVENT_TRACE_HEADER ) &DebugEvent;
PWNODE_HEADER pwnh = (PWNODE_HEADER) &DebugEvent;
ZeroMemory( &DebugEvent, sizeof( DebugEvent ) );
#ifndef UNICODE
TCHAR szFormat[ cchDEBUG_OUTPUT_BUFFER_SIZE ];
wcstombs( szFormat, pszFormatIn, StrLenW( pszFormatIn ) + 1 );
va_start( valist, pszFormatIn );
_vsntprintf( DebugEvent.szMsg, 256, szFormat, valist );
va_end( valist );
#else
va_start( valist, pszFormatIn );
_vsntprintf( DebugEvent.szMsg, 256, pszFormatIn, valist );
va_end( valist );
#endif // UNICODE
//
// Fill in the blanks
//
Assert( wcslen( DebugEvent.szMsg ) <= 255 ); // make sure the cast doesn't fail.
DebugEvent.bSize = (BYTE) wcslen( DebugEvent.szMsg );
peth->Size = sizeof( DebugEvent );
peth->Class.Type = 10;
peth->Class.Level = pEntry->bLevel;
// peth->Class.Version = 0;
// peth->ThreadId = GetCurrentThreadId( ); - done by system
pwnh->Guid = *pEntry->guidControl;
// peth->ClientContext = NULL;
pwnh->Flags = WNODE_FLAG_TRACED_GUID;
// GetSystemTimeAsFileTime( (FILETIME *) &peth->TimeStamp ); - done by the system
ulStatus = TraceEvent( pEntry->hTrace, (PEVENT_TRACE_HEADER) &DebugEvent );
} // if: flags set
} //*** WMIMsg( )
//////////////////////////////////////////////////////////////////////////////
//++
//
// void
// WMIMessageByFlagsAndLevel(
// DEBUG_WMI_CONTROL_GUIDS * pEntry,
// const DWORD dwFlagsIn,
// const BYTE bLogLevelIn,
// LPCWSTR pszFormatIn,
// ...
// )
//
// Description:
//
// Arguments:
// pEntry -
// dwFlagsIn -
// bLogLevelIn -
// pszFormatIn -
// ... -
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
void
__cdecl
WMIMessageByFlagsAndLevel(
DEBUG_WMI_CONTROL_GUIDS * pEntry,
const DWORD dwFlagsIn,
const BYTE bLogLevelIn,
LPCWSTR pszFormatIn,
...
)
{
va_list valist;
if ( pEntry->hTrace == NULL )
{
return; // NOP
} // if: no trace logger
if ( bLogLevelIn > pEntry->bLevel )
{
return; // NOP
} // if: level not high enough
if ( dwFlagsIn == mtfALWAYS
|| pEntry->dwFlags & dwFlagsIn
)
{
ULONG ulStatus;
DEBUG_WMI_EVENT_W DebugEvent;
PEVENT_TRACE_HEADER peth = (PEVENT_TRACE_HEADER ) &DebugEvent;
PWNODE_HEADER pwnh = (PWNODE_HEADER) &DebugEvent;
ZeroMemory( &DebugEvent, sizeof( DebugEvent ) );
#ifndef UNICODE
TCHAR szFormat[ cchDEBUG_OUTPUT_BUFFER_SIZE ];
wcstombs( szFormat, pszFormatIn, StrLenW( pszFormatIn ) + 1 );
va_start( valist, pszFormatIn );
_vsntprintf( DebugEvent.szMsg, 256,szFormat, valist);
va_end( valist );
#else
va_start( valist, pszFormatIn );
_vsntprintf( DebugEvent.szMsg, 256,pszFormatIn, valist);
va_end( valist );
#endif // UNICODE
//
// Fill in the blanks
//
Assert( wcslen( DebugEvent.szMsg ) <= 255 ); // make sure the cast doesn't fail.
DebugEvent.bSize = (BYTE) wcslen( DebugEvent.szMsg );
peth->Size = sizeof( DebugEvent );
peth->Class.Type = 10;
peth->Class.Level = pEntry->bLevel;
// peth->Class.Version = 0;
// peth->ThreadId = GetCurrentThreadId( ); - done by system
pwnh->Guid = *pEntry->guidControl;
// peth->ClientContext = NULL;
pwnh->Flags = WNODE_FLAG_TRACED_GUID;
// GetSystemTimeAsFileTime( (FILETIME *) &peth->TimeStamp ); - done by the system
ulStatus = TraceEvent( pEntry->hTrace, (PEVENT_TRACE_HEADER) &DebugEvent );
} // if: flags set
} //*** WMIMessageByFlagsAndLevel( )
//////////////////////////////////////////////////////////////////////////////
//++
//
// void
// WMIMessageByLevel(
// DEBUG_WMI_CONTROL_GUIDS * pEntry,
// const BYTE bLogLevelIn,
// LPCWSTR pszFormatIn,
// ...
// )
//
// Description:
//
// Arguments:
// pEntry -
// bLogLevelIn -
// pszFormatIn -
// ... -
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
void
__cdecl
WMIMessageByLevel(
DEBUG_WMI_CONTROL_GUIDS * pEntry,
const BYTE bLogLevelIn,
LPCWSTR pszFormatIn,
...
)
{
ULONG ulStatus;
DEBUG_WMI_EVENT_W DebugEvent;
PEVENT_TRACE_HEADER peth = (PEVENT_TRACE_HEADER ) &DebugEvent;
PWNODE_HEADER pwnh = (PWNODE_HEADER) &DebugEvent;
va_list valist;
if ( pEntry->hTrace == NULL )
{
return; // NOP
} // if: no trace logger
if ( bLogLevelIn > pEntry->bLevel )
{
return; // NOP
} // if: level no high enough
ZeroMemory( &DebugEvent, sizeof( DebugEvent ) );
#ifndef UNICODE
TCHAR szFormat[ cchDEBUG_OUTPUT_BUFFER_SIZE ];
wcstombs( szFormat, pszFormatIn, StrLenW( pszFormatIn ) + 1 );
va_start( valist, pszFormatIn );
_vsntprintf( DebugEvent.szMsg, 256,szFormat, valist);
va_end( valist );
#else
va_start( valist, pszFormatIn );
_vsntprintf( DebugEvent.szMsg, 256,pszFormatIn, valist);
va_end( valist );
#endif // UNICODE
//
// Fill in the blanks
//
Assert( wcslen( DebugEvent.szMsg ) <= 255 ); // make sure the cast doesn't fail.
DebugEvent.bSize = (BYTE) wcslen( DebugEvent.szMsg );
peth->Size = sizeof( DebugEvent );
peth->Class.Type = 10;
peth->Class.Level = pEntry->bLevel;
// peth->Class.Version = 0;
// peth->ThreadId = GetCurrentThreadId( ); - done by system
pwnh->Guid = *pEntry->guidControl;
// peth->ClientContext = NULL;
pwnh->Flags = WNODE_FLAG_TRACED_GUID;
// GetSystemTimeAsFileTime( (FILETIME *) &peth->TimeStamp ); - done by the system
ulStatus = TraceEvent( pEntry->hTrace, (PEVENT_TRACE_HEADER) &DebugEvent );
} //*** WMIMessageByLevel( )