#include "pch.h" #pragma hdrstop #include "diag.h" #include "nb30.h" #define SZ_CMD_SHOW_LANA_DIAG L"showlanadiag" #define SZ_CMD_SHOW_LANA_PATHS L"showlanapaths" #define SZ_CMD_SET_LANA_NUMBER L"setlananumber" #define SZ_CMD_REWRITE_LANA_INFO L"rewritelanainfo" // Parameter strings for SZ_CMD_FULL_DIAGNOSTIC // #define SZ_PARAM_LEAK_CHECK L"leakcheck" VOID Usage ( IN PCTSTR pszProgramName, IN COMMAND Command) { switch (Command) { case CMD_SHOW_LANA_DIAG: break; case CMD_SHOW_LANA_PATHS: break; case CMD_SET_LANA_NUMBER: g_pDiagCtx->Printf (ttidNcDiag, "\n" "%S %S \n" "\n", pszProgramName, SZ_CMD_SET_LANA_NUMBER); break; case CMD_REWRITE_LANA_INFO: break; default: g_pDiagCtx->Printf (ttidNcDiag, "\n" "Network Configuration Diagnostic\n" " View, manipulate, or test network configuration.\n" "\n" "%S [options]\n" " %-15S - Show bind paths and component descriptions for each exported lana\n" " %-15S - Change the lana number of a bind path\n" " %-15S - Verify and write out lana info to the registry\n" " %-15S - Show lana diagnostic info\n" "\n\n", pszProgramName, SZ_CMD_SHOW_LANA_PATHS, SZ_CMD_SET_LANA_NUMBER, SZ_CMD_REWRITE_LANA_INFO, SZ_CMD_SHOW_LANA_DIAG); break; } } #define NthArgIsPresent(_i) (_i < argc) #define NthArgIs(_i, _sz) ((_i < argc) && (0 == _wcsicmp(argv[_i], _sz))) EXTERN_C VOID __cdecl wmain ( IN INT argc, IN PCWSTR argv[]) { CDiagContext DiagCtx; DIAG_OPTIONS Options; INT iArg; DiagCtx.SetFlags (DF_SHOW_CONSOLE_OUTPUT); g_pDiagCtx = &DiagCtx; ZeroMemory (&Options, sizeof(Options)); Options.pDiagCtx = g_pDiagCtx; Options.Command = CMD_INVALID; if (argc < 2) { Usage (argv[0], Options.Command); return; } iArg = 1; if (NthArgIs (iArg, SZ_CMD_SHOW_LANA_DIAG)) { Options.Command = CMD_SHOW_LANA_DIAG; } else if (NthArgIs (iArg, SZ_CMD_SHOW_LANA_PATHS)) { Options.Command = CMD_SHOW_LANA_PATHS; iArg++; if (NthArgIs (iArg, SZ_PARAM_LEAK_CHECK)) { Options.fLeakCheck = TRUE; } } else if (NthArgIs (iArg, SZ_CMD_SET_LANA_NUMBER)) { Options.Command = CMD_SET_LANA_NUMBER; iArg++; if (NthArgIsPresent (iArg) && NthArgIsPresent (iArg+1)) { ULONG Lana; PWSTR pszStop; BOOL fBadLana = FALSE; Lana = wcstoul (argv[iArg], &pszStop, 10); if ((MAX_LANA < Lana) || !pszStop || *pszStop) { fBadLana = TRUE; } else { Options.OldLanaNumber = (BYTE)Lana; Lana = wcstoul (argv[iArg+1], &pszStop, 10); if ((MAX_LANA < Lana) || !pszStop || *pszStop) { fBadLana = TRUE; } else { Options.NewLanaNumber = (BYTE)Lana; } } if (fBadLana) { g_pDiagCtx->Printf (ttidNcDiag, "\n" "Lana Numbers must be in 0-%u range, inclusive.\n" "\n", MAX_LANA); return; } } else { Usage (argv[0], Options.Command); return; } } else if (NthArgIs (iArg, SZ_CMD_REWRITE_LANA_INFO)) { Options.Command = CMD_REWRITE_LANA_INFO; } else { Usage (argv[0], Options.Command); return; } HRESULT hr = CoInitializeEx ( NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED); if (FAILED(hr)) { g_pDiagCtx->Printf (ttidNcDiag, "Problem 0x%08x initializing COM library", hr); return; } LanaCfgFromCommandArgs (&Options); g_pDiagCtx->Printf (ttidNcDiag, "\n"); }