mirror of https://github.com/tongzx/nt5src
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
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( )
|