windows-nt/Source/XPSP1/NT/termsrv/admtools/dbgtrace/dbgtrace.c
2020-09-26 16:20:57 +08:00

258 lines
6.3 KiB
C

// Copyright (c) 1998-1999 Microsoft Corporation
/******************************************************************************
*
* DBGTRACE.C
*
* enable or disable tracing
*
*
*
*******************************************************************************/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <ntddkbd.h>
#include <ntddmou.h>
#include <windows.h>
#include <winbase.h>
#include <winerror.h>
#include <winstaw.h>
#include <icadd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
#include <utilsub.h>
#include "dbgtrace.h"
#include "printfoa.h"
WCHAR CurDir[ 256 ];
WCHAR WinStation[MAX_IDS_LEN+1];
WCHAR TraceOption[MAX_OPTION];
int bTraceOption = FALSE;
int fDebugger = FALSE;
int fTimestamp = FALSE;
int fHelp = FALSE;
int fSystem = FALSE;
int fAll = FALSE;
ULONG TraceClass = 0;
ULONG TraceEnable = 0;
ULONG LogonId;
TOKMAP ptm[] = {
{L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, WinStation},
{L"/c", TMFLAG_OPTIONAL, TMFORM_LONGHEX, sizeof(ULONG), &TraceClass},
{L"/e", TMFLAG_OPTIONAL, TMFORM_LONGHEX, sizeof(ULONG), &TraceEnable},
{L"/d", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &fDebugger},
{L"/t", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &fTimestamp},
{L"/o", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_OPTION, TraceOption},
{L"/system", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &fSystem},
{L"/all", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &fAll},
{L"/?", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fHelp},
{0, 0, 0, 0, 0}
};
void SetSystemTrace( PICA_TRACE );
void SetStackTrace( PICA_TRACE );
/*******************************************************************************
*
* main
*
******************************************************************************/
int __cdecl
main(INT argc, CHAR **argv)
{
WCHAR *CmdLine;
WCHAR **argvW;
ULONG rc;
int i;
ICA_TRACE Trace;
setlocale(LC_ALL, ".OCP");
/*
* Massage the command line.
*/
argvW = MassageCommandLine((DWORD)argc);
if (argvW == NULL) {
ErrorPrintf(IDS_ERROR_MALLOC);
return(FAILURE);
}
/*
* parse the cmd line without parsing the program name (argc-1, argv+1)
*/
rc = ParseCommandLine(argc-1, argvW+1, ptm, 0);
/*
* Check for error from ParseCommandLine
*/
if ( fHelp || (rc && !(rc & PARSE_FLAG_NO_PARMS)) ) {
if ( !fHelp ) {
ErrorPrintf(IDS_ERROR_PARAMS);
ErrorPrintf(IDS_USAGE_1);
ErrorPrintf(IDS_USAGE_2);
return(FAILURE);
} else {
Message(IDS_USAGE_1);
Message(IDS_USAGE_2);
return(SUCCESS);
}
}
//Check if we are running under Terminal Server
if(!AreWeRunningTerminalServices())
{
ErrorPrintf(IDS_ERROR_NOT_TS);
return(FAILURE);
}
if ( fAll ) {
TraceClass = 0xffffffff;
TraceEnable = 0xffffffff;
}
/*
* Get current directory
*/
(VOID) GetCurrentDirectory( 256, CurDir );
/*
* Get the LogonId
*/
if ( ptm[0].tmFlag & TMFLAG_PRESENT ) {
if ( iswdigit( WinStation[0] ) ) {
LogonId = (ULONG) wcstol( WinStation, NULL, 10 );
} else {
if ( !LogonIdFromWinStationName( SERVERNAME_CURRENT, WinStation, &LogonId ) ) {
StringErrorPrintf( IDS_ERROR_SESSION, WinStation );
return(-1);
}
}
if ( fSystem )
wsprintf( Trace.TraceFile, L"%s\\winframe.log", CurDir );
else
wsprintf( Trace.TraceFile, L"%s\\%s.log", CurDir, WinStation );
} else {
LogonId = GetCurrentLogonId();
if ( fSystem )
wsprintf( Trace.TraceFile, L"%s\\winframe.log", CurDir );
else
wsprintf( Trace.TraceFile, L"%s\\%u.log", CurDir, LogonId );
}
/*
* Build trace structure
*/
Trace.fDebugger = fDebugger ? TRUE : FALSE;
Trace.fTimestamp = fTimestamp ? FALSE : TRUE;
Trace.TraceClass = TraceClass;
Trace.TraceEnable = TraceEnable;
if ( TraceClass == 0 || TraceEnable == 0 )
Trace.TraceFile[0] = '\0';
/*
* Fill in the trace option if any
*/
bTraceOption = ptm[5].tmFlag & TMFLAG_PRESENT;
if ( bTraceOption )
memcpy(Trace.TraceOption, TraceOption, sizeof(TraceOption));
else
memset(Trace.TraceOption, 0, sizeof(TraceOption));
/*
* Set trace information
*/
if ( fSystem )
SetSystemTrace( &Trace );
else
SetStackTrace( &Trace );
return(0);
}
void
SetSystemTrace( PICA_TRACE pTrace )
{
/*
* Set trace information
*/
if ( !WinStationSetInformation( SERVERNAME_CURRENT,
LogonId,
WinStationSystemTrace,
pTrace,
sizeof(ICA_TRACE) ) ) {
Message(IDS_ERROR_SET_TRACE, GetLastError());
return;
}
if ( pTrace->TraceClass == 0 || pTrace->TraceEnable == 0 ) {
Message( IDS_TRACE_DIS_LOG );
} else {
Message( IDS_TRACE_EN_LOG );
wprintf( L"- %08x %08x [%s] %s\n", pTrace->TraceClass, pTrace->TraceEnable,
pTrace->TraceFile, fDebugger ? TEXT("Debugger") : TEXT("") );
}
}
void
SetStackTrace( PICA_TRACE pTrace )
{
WINSTATIONINFOCLASS InfoClass;
ULONG InfoSize;
/*
* Check for console
*/
if ( LogonId == 0 ) {
Message( IDS_TRACE_UNSUPP );
return;
}
/*
* Set trace information
*/
if ( !WinStationSetInformation( SERVERNAME_CURRENT,
LogonId,
WinStationTrace,
pTrace,
sizeof(ICA_TRACE))) {
Message(IDS_ERROR_SET_TRACE, GetLastError());
return;
}
if ( pTrace->TraceClass == 0 || pTrace->TraceEnable == 0 ) {
Message( IDS_TRACE_DISABLED, LogonId );
} else {
Message( IDS_TRACE_ENABLED, LogonId );
wprintf( L"- %08x %08x [%s] %s\n", pTrace->TraceClass, pTrace->TraceEnable,
pTrace->TraceFile, fDebugger ? "Debugger" : "" );
}
}