/*++ Copyright (c) 1998 Microsoft Corporation Module Name: logging.c Abstract: Commands to control how logging information is performed. Revision History: --*/ #include "precomp.h" #pragma hdrstop static const WCHAR g_pszRegValTracingFile[] = L"EnableFileTracing"; static const WCHAR g_pszRegKeyTracing[] = L"SOFTWARE\\Microsoft\\Tracing"; typedef struct _TRACING_DATA { HKEY hkMachine; HKEY hkFlags; DWORD dwServerFlags; } TRACING_DATA; // // Opens the root tracing registry key // DWORD TraceOpenRoot( OUT PHKEY phKey) { DWORD dwErr = NO_ERROR; dwErr = RegOpenKeyExW( g_pServerInfo->hkMachine, g_pszRegKeyTracing, 0, KEY_ALL_ACCESS, phKey); return dwErr; } DWORD TraceOpenKey( IN HKEY hkRoot, IN LPCWSTR pszKey, OUT PHKEY phKey) { return RegOpenKeyExW( hkRoot, pszKey, 0, KEY_ALL_ACCESS, phKey); } DWORD TraceCloseKey( IN HKEY hKey) { return RegCloseKey(hKey); } DWORD TraceWrite( IN HKEY hkComp, IN DWORD dwEnable) { return RutlRegWriteDword( hkComp, (PWCHAR)g_pszRegValTracingFile, dwEnable); } DWORD TraceRead( IN HKEY hkComp, IN LPDWORD lpdwEnable) { return RutlRegReadDword( hkComp, (PWCHAR)g_pszRegValTracingFile, lpdwEnable); } DWORD TraceShow( IN LPCWSTR pszName, IN HKEY hKey, IN HANDLE hData) { DWORD dwErr = NO_ERROR, dwEnabled = 0; do { // Get the enabling of the current component // dwErr = TraceRead(hKey, &dwEnabled); BREAK_ON_DWERR(dwErr); // Display the status // DisplayMessage( g_hModule, MSG_TRACE_SHOW, pszName, (dwEnabled) ? TOKEN_ENABLED : TOKEN_DISABLED); } while (FALSE); // Cleanup { } return dwErr; } DWORD TraceDumpComponent( IN LPCWSTR pszName, IN HKEY hKey, IN HANDLE hData) { PWCHAR pszComp = NULL, pszEnable = NULL, pszQuote = NULL; DWORD dwErr = NO_ERROR, dwEnabled = 0; DWORD* pdwShowDisable = (DWORD*)hData; do { dwErr = TraceRead(hKey, &dwEnabled); BREAK_ON_DWERR(dwErr); pszQuote = MakeQuotedString(pszName); pszComp = RutlAssignmentFromTokens( g_hModule, TOKEN_COMPONENT, pszQuote); pszEnable = RutlAssignmentFromTokens( g_hModule, TOKEN_STATE, (dwEnabled) ? TOKEN_ENABLED : TOKEN_DISABLED); if (pszQuote == NULL || pszComp == NULL || pszEnable == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } if (dwEnabled || (pdwShowDisable && *pdwShowDisable)) { DisplayMessage( g_hModule, MSG_TRACE_DUMP, DMP_TRACE_SET, pszComp, pszEnable); } } while (FALSE); // Cleanup { RutlFree(pszComp); RutlFree(pszEnable); RutlFree(pszQuote); } return dwErr; } DWORD TraceEnableDisable( IN LPCWSTR pszName, IN HKEY hKey, IN HANDLE hData) { DWORD dwErr = NO_ERROR, dwEnabled = 0; DWORD* pdwEnable = (DWORD*)hData; do { // Get the enabling of the current component // dwErr = TraceWrite(hKey, *pdwEnable); BREAK_ON_DWERR(dwErr); } while (FALSE); // Cleanup { } return dwErr; } // // Dumps configuration // DWORD TraceDumpConfig( IN HANDLE hFile ) { PWCHAR pszComp = NULL, pszEnable = NULL; DWORD dwErr = NO_ERROR; HKEY hkRoot = NULL; do { pszComp = RutlAssignmentFromTokens( g_hModule, TOKEN_COMPONENT, L"*"); pszEnable = RutlAssignmentFromTokens( g_hModule, TOKEN_STATE, TOKEN_DISABLED); if (pszComp == NULL || pszEnable == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } DisplayMessage( g_hModule, MSG_TRACE_DUMP, DMP_TRACE_SET, pszComp, pszEnable); dwErr = TraceOpenRoot(&hkRoot); BREAK_ON_DWERR(dwErr); dwErr = RutlRegEnumKeys( hkRoot, TraceDumpComponent, NULL); BREAK_ON_DWERR(dwErr); } while (FALSE); // Cleanup { RutlFree(pszComp); RutlFree(pszEnable); if (hkRoot) { RegCloseKey(hkRoot); } } return NO_ERROR; } DWORD HandleTraceSet( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR, dwEnable; PWCHAR pszComponent = NULL; HKEY hkRoot = NULL, hkComp = NULL; TOKEN_VALUE rgEnumState[] = { {TOKEN_ENABLED, 1}, {TOKEN_DISABLED, 0} }; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_COMPONENT, TRUE, FALSE}, NULL, 0, NULL }, { RASMONTR_CMD_TYPE_ENUM, {TOKEN_STATE, TRUE, FALSE}, rgEnumState, sizeof(rgEnumState)/sizeof(*rgEnumState), NULL } }; do { // Parse the command line // dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr ); pszComponent = RASMON_CMD_ARG_GetPsz(&pArgs[0]); dwEnable = RASMON_CMD_ARG_GetDword(&pArgs[1]); // Whistler bug 259800 PREFIX // if(pszComponent == NULL) { dwErr = ERROR_INVALID_SYNTAX; break; } dwErr = TraceOpenRoot(&hkRoot); BREAK_ON_DWERR(dwErr); if (wcscmp(pszComponent, L"*") == 0) { dwErr = RutlRegEnumKeys( hkRoot, TraceEnableDisable, (HANDLE)&dwEnable); BREAK_ON_DWERR(dwErr); } else { dwErr = TraceOpenKey(hkRoot, pszComponent, &hkComp); BREAK_ON_DWERR(dwErr); TraceWrite(hkComp, dwEnable); BREAK_ON_DWERR(dwErr); } } while (FALSE); // Cleanup { RutlFree(pszComponent); if (hkRoot) { RegCloseKey(hkRoot); } if (hkComp) { RegCloseKey(hkComp); } } return dwErr; } DWORD HandleTraceShow( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR; PWCHAR pszComponent = NULL; HKEY hkRoot = NULL, hkComp = NULL; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_COMPONENT, FALSE, FALSE}, NULL, 0, NULL } }; do { // Parse the command line // dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr ); pszComponent = RASMON_CMD_ARG_GetPsz(&pArgs[0]); dwErr = TraceOpenRoot(&hkRoot); BREAK_ON_DWERR(dwErr); if (pszComponent) { dwErr = TraceOpenKey(hkRoot, pszComponent, &hkComp); BREAK_ON_DWERR(dwErr); TraceShow(pszComponent, hkComp, NULL); BREAK_ON_DWERR(dwErr); } else { dwErr = RutlRegEnumKeys( hkRoot, TraceShow, NULL); BREAK_ON_DWERR(dwErr); } } while (FALSE); // Cleanup { RutlFree(pszComponent); if (hkRoot) { RegCloseKey(hkRoot); } if (hkComp) { RegCloseKey(hkComp); } } return dwErr; }