windows-nt/Source/XPSP1/NT/net/config/tools/lanacfg/lanacfg.cpp
2020-09-26 16:20:57 +08:00

177 lines
4.4 KiB
C++

#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 <old lana number> <new lana number>\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 = Lana;
Lana = wcstoul (argv[iArg+1], &pszStop, 10);
if ((MAX_LANA < Lana) || !pszStop || *pszStop)
{
fBadLana = TRUE;
}
else
{
Options.NewLanaNumber = 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");
}