// Copyright (c) 1998-1999 Microsoft Corporation /****************************************************************************** * * DBGTRACE.C * * enable or disable tracing * * * *******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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" : "" ); } }