/* File: rasdiag.c 'ras diag' sub context 07/26/01 */ #include "precomp.h" // // The guid for this context // GUID g_RasDiagGuid = RASDIAG_GUID; // // The commands supported in this context // CMD_ENTRY g_RasDiagSetCmdTable[] = { CREATE_CMD_ENTRY(RASDIAG_SET_RASTRACE, HandleTraceSet), CREATE_CMD_ENTRY(RASDIAG_SET_TRACEALL, RasDiagHandleSetTraceAll), CREATE_CMD_ENTRY(RASDIAG_SET_MODEMTRACE, RasDiagHandleSetModemTrace), CREATE_CMD_ENTRY(RASDIAG_SET_CMTRACE, RasDiagHandleSetCmTrace), CREATE_CMD_ENTRY(RASDIAG_SET_AUDITING, RasDiagHandleSetAuditing), }; CMD_ENTRY g_RasDiagShowCmdTable[] = { CREATE_CMD_ENTRY(RASDIAG_SHOW_RASTRACE, HandleTraceShow), CREATE_CMD_ENTRY(RASDIAG_SHOW_TRACEALL, RasDiagHandleShowTraceAll), CREATE_CMD_ENTRY(RASDIAG_SHOW_MODEMTRACE, RasDiagHandleShowModemTrace), CREATE_CMD_ENTRY(RASDIAG_SHOW_CMTRACE, RasDiagHandleShowCmTrace), CREATE_CMD_ENTRY(RASDIAG_SHOW_AUDITING, RasDiagHandleShowAuditing), CREATE_CMD_ENTRY(RASDIAG_SHOW_LOGS, RasDiagHandleShowLogs), CREATE_CMD_ENTRY(RASDIAG_SHOW_ALL, RasDiagHandleShowAll), CREATE_CMD_ENTRY(RASDIAG_SHOW_RASCHK, RasDiagHandleShowInstallation), CREATE_CMD_ENTRY(RASDIAG_SHOW_CONFIG, RasDiagHandleShowConfiguration), }; CMD_GROUP_ENTRY g_RasDiagCmdGroups[] = { CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_RasDiagSetCmdTable), CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_RasDiagShowCmdTable), }; static CONST ULONG g_ulRasDiagNumGroups = sizeof(g_RasDiagCmdGroups) / sizeof(CMD_GROUP_ENTRY); // // This command was never approved or properly tested, disabling but not // removing (for future consideration). // /*CMD_ENTRY g_TopCmds[] = { CREATE_CMD_ENTRY_EX(RASDIAG_REPAIR, RasDiagHandleRepairRas, CMD_FLAG_HIDDEN), }; static CONST ULONG g_ulNumOfTopCmds = sizeof(g_TopCmds) / sizeof(CMD_ENTRY);*/ // // Declarations from rasnetcfg // HRESULT HrInstallRas( IN CONST PWCHAR pszFilePath); HRESULT HrUninstallRas(); PWCHAR RasDiagVerifyAnswerFile( IN CONST PWCHAR pwszFilePath); // // Local declarations // DWORD RasDiagHandleReport( IN RASDIAG_HANDLE_REPORT_FUNC_CB pCallback, IN OUT LPWSTR* ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, OUT BOOL* pbDone); // // Entry called by rasmontr to register this context // DWORD WINAPI RasDiagStartHelper( IN CONST GUID* pguidParent, IN DWORD dwVersion) { DWORD dwErr = NO_ERROR; NS_CONTEXT_ATTRIBUTES attMyAttributes; // // Initialize // ZeroMemory(&attMyAttributes, sizeof(attMyAttributes)); attMyAttributes.dwVersion = RASDIAG_VERSION; attMyAttributes.pwszContext = L"diagnostics"; attMyAttributes.guidHelper = g_RasDiagGuid; attMyAttributes.dwFlags = CMD_FLAG_LOCAL | CMD_FLAG_ONLINE; // attMyAttributes.ulNumTopCmds = g_ulNumOfTopCmds; // attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_TopCmds; attMyAttributes.ulNumGroups = g_ulRasDiagNumGroups; attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_RasDiagCmdGroups; attMyAttributes.pfnDumpFn = RasDiagDump; dwErr = RegisterContext(&attMyAttributes); return dwErr; } DWORD RasDiagDumpScriptHeader() { DisplayMessage(g_hModule, MSG_RASDIAG_SCRIPTHEADER); DisplayMessageT(DMP_RASDIAG_PUSHD); return NO_ERROR; } DWORD RasDiagDumpScriptFooter() { DisplayMessageT(DMP_RAS_POPD); DisplayMessage(g_hModule, MSG_RASDIAG_SCRIPTFOOTER); return NO_ERROR; } DWORD WINAPI RasDiagDump( IN LPCWSTR pwszRouter, IN OUT LPWSTR* ppwcArguments, IN DWORD dwArgCount, IN LPCVOID pvData) { RasDiagDumpScriptHeader(); TraceDumpConfig(); DisplayMessageT(MSG_NEWLINE); TraceDumpModem(); DisplayMessageT(MSG_NEWLINE); TraceDumpCm(); DisplayMessageT(MSG_NEWLINE); TraceDumpAuditing(); DisplayMessageT(MSG_NEWLINE); RasDiagDumpScriptFooter(); return NO_ERROR; } DWORD RasDiagHandleSetTraceAll( 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; TOKEN_VALUE rgEnumState[] = { {TOKEN_DISABLED, 0}, {TOKEN_ENABLED, 1}, {TOKEN_CLEARED, 2} }; RASMON_CMD_ARG pArgs[] = { { 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); // // Get EnumState // dwEnable = RASMON_CMD_ARG_GetDword(&pArgs[0]); if (dwEnable != 2) { DiagSetAll(dwEnable ? TRUE : FALSE, TRUE); } else { DiagClearAll(TRUE); } } while (FALSE); return dwErr; } DWORD RasDiagHandleShowTraceAll( 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; do { // // Verify zero args // if ((dwArgCount - dwCurrentIndex) > 0) { dwErr = ERROR_INVALID_SYNTAX; break; } TraceShowAll(); } while (FALSE); return dwErr; } DWORD RasDiagHandleSetModemTrace( 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; TOKEN_VALUE rgEnumState[] = { {TOKEN_DISABLED, 0}, {TOKEN_ENABLED, 1}, }; RASMON_CMD_ARG pArgs[] = { { 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); // // Get EnumState // dwEnable = RASMON_CMD_ARG_GetDword(&pArgs[0]); if (TraceEnableDisableModem(dwEnable ? TRUE : FALSE)) { DisplayMessage(g_hModule, MSG_RASDIAG_SET_MODEMTRACE_OK); } else { DisplayMessage(g_hModule, EMSG_RASDIAG_SET_MODEMTRACE_FAIL); } } while (FALSE); return dwErr; } DWORD RasDiagHandleShowModemTrace( 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; do { // // Verify zero args // if ((dwArgCount - dwCurrentIndex) > 0) { dwErr = ERROR_INVALID_SYNTAX; break; } if (TraceShowModem()) { DisplayMessage(g_hModule, MSG_RASDIAG_SHOW_MODEMTRACE_ENABLED); } else { DisplayMessage(g_hModule, EMSG_RASDIAG_SHOW_MODEMTRACE_DISABLED); } } while (FALSE); return dwErr; } DWORD RasDiagHandleSetCmTrace( 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; TOKEN_VALUE rgEnumState[] = { {TOKEN_DISABLED, 0}, {TOKEN_ENABLED, 1}, }; RASMON_CMD_ARG pArgs[] = { { 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); // // Get EnumState // dwEnable = RASMON_CMD_ARG_GetDword(&pArgs[0]); if (TraceEnableDisableCm(dwEnable ? TRUE : FALSE)) { DisplayMessage(g_hModule, MSG_RASDIAG_SET_CMTRACE_OK); } else { DisplayMessage(g_hModule, EMSG_RASDIAG_SET_CMTRACE_FAIL); } } while (FALSE); return dwErr; } DWORD RasDiagHandleShowCmTrace( 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; do { // // Verify zero args // if ((dwArgCount - dwCurrentIndex) > 0) { dwErr = ERROR_INVALID_SYNTAX; break; } if (TraceShowCm()) { DisplayMessage(g_hModule, MSG_RASDIAG_SHOW_CMTRACE_ENABLED); } else { DisplayMessage(g_hModule, EMSG_RASDIAG_SHOW_CMTRACE_DISABLED); } } while (FALSE); return dwErr; } DWORD RasDiagHandleSetAuditing( 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; TOKEN_VALUE rgEnumState[] = { {TOKEN_DISABLED, 0}, {TOKEN_ENABLED, 1}, }; RASMON_CMD_ARG pArgs[] = { { 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); // // Get EnumState // dwEnable = RASMON_CMD_ARG_GetDword(&pArgs[0]); if (TraceEnableDisableAuditing(FALSE, dwEnable ? TRUE : FALSE)) { DisplayMessage(g_hModule, MSG_RASDIAG_SET_AUDITING_OK); } else { DisplayMessage(g_hModule, EMSG_RASDIAG_SET_AUDITING_FAIL); } } while (FALSE); return dwErr; } DWORD RasDiagHandleShowAuditing( 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; do { // // Verify zero args // if ((dwArgCount - dwCurrentIndex) > 0) { dwErr = ERROR_INVALID_SYNTAX; break; } if (TraceEnableDisableAuditing(TRUE, FALSE)) { DisplayMessage(g_hModule, MSG_RASDIAG_SHOW_AUDITING_ENABLED); } else { DisplayMessage(g_hModule, EMSG_RASDIAG_SHOW_AUDITING_DISABLED); } } while (FALSE); return dwErr; } VOID RasDiagHandleShowLogsCb( IN REPORT_INFO* pInfo) { PrintTableOfContents(pInfo, SHOW_LOGS); TraceCollectAll(pInfo); return; } DWORD RasDiagHandleShowLogs( IN LPCWSTR pwszMachine, IN OUT LPWSTR* ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL* pbDone) { return RasDiagHandleReport( RasDiagHandleShowLogsCb, ppwcArguments, dwCurrentIndex, dwArgCount, pbDone); } VOID RasDiagHandleShowAllCb( IN REPORT_INFO* pInfo) { PrintTableOfContents(pInfo, SHOW_ALL); RasDiagShowAll(pInfo); return; } DWORD RasDiagHandleShowAll( IN LPCWSTR pwszMachine, IN OUT LPWSTR* ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL* pbDone) { return RasDiagHandleReport( RasDiagHandleShowAllCb, ppwcArguments, dwCurrentIndex, dwArgCount, pbDone); } VOID RasDiagHandleShowInstallationCb( IN REPORT_INFO* pInfo) { PrintTableOfContents(pInfo, SHOW_INSTALL); RasDiagShowInstallation(pInfo); return; } DWORD RasDiagHandleShowInstallation( IN LPCWSTR pwszMachine, IN OUT LPWSTR* ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL* pbDone) { return RasDiagHandleReport( RasDiagHandleShowInstallationCb, ppwcArguments, dwCurrentIndex, dwArgCount, pbDone); } VOID RasDiagHandleShowConfigurationCb( IN REPORT_INFO* pInfo) { PrintTableOfContents(pInfo, SHOW_CONFIG); RasDiagShowConfiguration(pInfo); return; } DWORD RasDiagHandleShowConfiguration( IN LPCWSTR pwszMachine, IN OUT LPWSTR* ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL* pbDone) { return RasDiagHandleReport( RasDiagHandleShowConfigurationCb, ppwcArguments, dwCurrentIndex, dwArgCount, pbDone); } DWORD RasDiagHandleRepairRas( 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 pszFilePath = NULL; HRESULT hr = S_OK; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_ANSWERFILE, 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); // // Check for answer file // if (RASMON_CMD_ARG_Present(&pArgs[0])) { pszFilePath = RasDiagVerifyAnswerFile( RASMON_CMD_ARG_GetPsz(&pArgs[0])); if (!pszFilePath) { DisplayMessage(g_hModule, EMSG_RASDIAG_BAD_ANSWERFILE); break; } } hr = HrUninstallRas(); if (SUCCEEDED(hr)) { hr = HrInstallRas(pszFilePath); if (SUCCEEDED(hr)) { DisplayMessage(g_hModule, MSG_RASDIAG_REPAIR_SUCCESS_REBOOT); } else { DisplayMessage(g_hModule, EMSG_RASDIAG_REPAIR_FAIL); } } else { DisplayMessage(g_hModule, EMSG_RASDIAG_REPAIR_FAIL); } } while (FALSE); // // Cleanup // RutlFree(pszFilePath); return dwErr; } DWORD RasDiagHandleReport( IN RASDIAG_HANDLE_REPORT_FUNC_CB pCallback, IN OUT LPWSTR* ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, OUT BOOL* pbDone) { DWORD dwErr = NO_ERROR, dwCompress = 0, dwDest; WCHAR wszTempFileName[MAX_PATH + 1]; PWCHAR pwszDest = NULL, pwszCabFile = NULL, pwszTempFile = NULL; REPORT_INFO ReportInfo; BUFFER_WRITE_FILE Buff; TOKEN_VALUE rgEnumDest[] = { {TOKEN_FILE, 0}, {TOKEN_EMAIL, 1}, }; TOKEN_VALUE rgEnumCompress[] = { {TOKEN_DISABLED, 0}, {TOKEN_ENABLED, 1}, }; TOKEN_VALUE rgEnumVerbose[] = { {TOKEN_DISABLED, 0}, {TOKEN_ENABLED, 1}, }; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_ENUM, {TOKEN_TYPE, TRUE, FALSE}, rgEnumDest, sizeof(rgEnumDest) / sizeof(*rgEnumDest), NULL }, { RASMONTR_CMD_TYPE_STRING, {TOKEN_DESTINATION, TRUE, FALSE}, NULL, 0, NULL }, { RASMONTR_CMD_TYPE_ENUM, {TOKEN_COMPRESSION, FALSE, FALSE}, rgEnumCompress, sizeof(rgEnumCompress) / sizeof(*rgEnumCompress), NULL }, { RASMONTR_CMD_TYPE_DWORD, {TOKEN_HOURS, FALSE, FALSE}, NULL, 0, NULL }, { RASMONTR_CMD_TYPE_ENUM, {TOKEN_VERBOSE, FALSE, FALSE}, rgEnumVerbose, sizeof(rgEnumVerbose) / sizeof(*rgEnumVerbose), NULL }, }; do { if (!pCallback) { dwErr = ERROR_INVALID_SYNTAX; break; } // // Parse the command line // dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs) / sizeof(*pArgs)); BREAK_ON_DWERR(dwErr); // // Init the Report Information structure // ZeroMemory(&ReportInfo, sizeof(REPORT_INFO)); ZeroMemory(&Buff, sizeof(BUFFER_WRITE_FILE)); ReportInfo.fDisplay = TRUE; ReportInfo.pBuff = &Buff; dwDest = RASMON_CMD_ARG_GetEnum(&pArgs[0]); pwszDest = RASMON_CMD_ARG_GetPsz(&pArgs[1]); if (!pwszDest) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } if (RASMON_CMD_ARG_Present(&pArgs[2])) { dwCompress = RASMON_CMD_ARG_GetEnum(&pArgs[2]); } else if (dwDest) { // // def is to compress for email // dwCompress = 1; } if (RASMON_CMD_ARG_Present(&pArgs[3])) { ReportInfo.dwHours = RASMON_CMD_ARG_GetDword(&pArgs[3]); if (ReportInfo.dwHours < 1 || ReportInfo.dwHours > 24) { dwErr = ERROR_INVALID_SYNTAX; break; } } if (RASMON_CMD_ARG_Present(&pArgs[4]) && RASMON_CMD_ARG_GetDword(&pArgs[4])) { ReportInfo.fVerbose = TRUE; } // // email or display // if (dwDest) { dwErr = CopyTempFileName(wszTempFileName); BREAK_ON_DWERR(dwErr); pwszTempFile = CreateHtmFileName(wszTempFileName); if (!pwszTempFile) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } } else { pwszTempFile = CreateHtmFileName(pwszDest); if (!pwszTempFile) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } } if (CreateReportFile(ReportInfo.pBuff, pwszTempFile)) { DisplayMessage( g_hModule, EMSG_RASDIAG_REPORT_FAIL, pwszTempFile); break; } PrintHtmlHeader(ReportInfo.pBuff); // // Call the callback // pCallback(&ReportInfo); PrintHtmlFooter(ReportInfo.pBuff); CloseReportFile(ReportInfo.pBuff); if (dwCompress) { pwszCabFile = CabCompressFile(pwszTempFile); if (!pwszCabFile) { DisplayMessage( g_hModule, EMSG_RASDIAG_REPORT_CAB_FAIL, pwszTempFile); break; } } if (dwDest) { if (!MapiSendMail( pwszDest, pwszCabFile ? pwszCabFile : pwszTempFile)) { DisplayMessage( g_hModule, MSG_RASDIAG_REPORT_EMAIL_OK, pwszDest); } else { DisplayMessage( g_hModule, EMSG_RASDIAG_REPORT_EMAIL_FAIL, pwszDest); } if (pwszCabFile) { DeleteFile(pwszCabFile); } DeleteFile(pwszTempFile); } else { DisplayMessage( g_hModule, MSG_RASDIAG_REPORT_OK, pwszCabFile ? pwszCabFile : pwszTempFile); if (pwszCabFile) { DeleteFile(pwszTempFile); } } } while (FALSE); // // Clean up // RutlFree(pwszCabFile); RutlFree(pwszTempFile); RutlFree(pwszDest); return dwErr; }