You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
691 lines
20 KiB
691 lines
20 KiB
#include "pch.h"
|
|
#pragma hdrstop
|
|
#include "diag.h"
|
|
|
|
// Command strings
|
|
//
|
|
#define SZ_CMD_SHOW_BINDINGS L"showbindings"
|
|
#define SZ_CMD_SHOW_COMPONENTS L"showcomponents"
|
|
#define SZ_CMD_SHOW_STACK_TABLE L"showstacktable"
|
|
#define SZ_CMD_SHOW_LAN_ADAPTER_PNPIDS L"showlanpnpids"
|
|
#define SZ_CMD_ADD_COMPONENT L"addcomponent"
|
|
#define SZ_CMD_REMOVE_COMPONENT L"removecomponent"
|
|
#define SZ_CMD_UPDATE_COMPONENT L"updatecomponent"
|
|
#define SZ_CMD_REMOVE_REFS L"removerefs"
|
|
#define SZ_CMD_ENABLE_BINDING L"enablebinding"
|
|
#define SZ_CMD_DISABLE_BINDING L"disablebinding"
|
|
#define SZ_CMD_MOVE_BINDING L"movebinding"
|
|
#define SZ_CMD_WRITE_BINDINGS L"writebindings"
|
|
#define SZ_CMD_SET_WANORDER L"setwanorder"
|
|
#define SZ_CMD_FULL_DIAGNOSTIC L"full"
|
|
#define SZ_CMD_CLEANUP L"cleanup"
|
|
#define SZ_CMD_ADD_REMOVE_STRESS L"arstress"
|
|
|
|
#define SZ_CMD_SHOW_LAN_CONNECTIONS L"showlan"
|
|
#define SZ_CMD_SHOW_LAN_DETAILS L"showlandetails"
|
|
#define SZ_CMD_LAN_CHANGE_STATE L"changelanstate"
|
|
#define SZ_CMD_SHOW_ALL_DEVICES L"showalldevices"
|
|
|
|
#define SZ_PARAM_CONNECT L"connect"
|
|
#define SZ_PARAM_DISCONNECT L"disconnect"
|
|
|
|
// Parameter strings for SZ_CMD_SHOW_BINDINGS
|
|
//
|
|
#define SZ_PARAM_BELOW L"below"
|
|
#define SZ_PARAM_INVOLVING L"involving"
|
|
#define SZ_PARAM_UPPER L"upper"
|
|
#define SZ_PARAM_DISABLED L"disabled"
|
|
|
|
// Parameter strings for SZ_CMD_ADD_COMPONENT
|
|
//
|
|
#define SZ_PARAM_NET L"net"
|
|
#define SZ_PARAM_INFRARED L"irda"
|
|
#define SZ_PARAM_TRANS L"trans"
|
|
#define SZ_PARAM_CLIENT L"client"
|
|
#define SZ_PARAM_SERVICE L"service"
|
|
|
|
// Parameter strings for SZ_CMD_MOVE_BINDING
|
|
//
|
|
#define SZ_PARAM_BEFORE L"before"
|
|
#define SZ_PARAM_AFTER L"after"
|
|
|
|
// Parameter strings for SZ_CMD_SET_WANORDER
|
|
//
|
|
#define SZ_PARAM_FIRST L"first"
|
|
#define SZ_PARAM_LAST L"last"
|
|
|
|
// Parameter strings for SZ_CMD_FULL_DIAGNOSTIC
|
|
//
|
|
#define SZ_PARAM_LEAK_CHECK L"leakcheck"
|
|
|
|
// Aliases used when refering to components
|
|
//
|
|
#define SZ_ALIAS_ALL L"all"
|
|
|
|
VOID
|
|
Usage (
|
|
IN PCTSTR pszProgramName,
|
|
IN COMMAND Command)
|
|
{
|
|
switch (Command)
|
|
{
|
|
case CMD_SHOW_BINDINGS:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"%S %S [below | involving | upper | disabled] [all | <infid> | <pnpid>]\n"
|
|
"\n"
|
|
" below : show bindings below component\n"
|
|
" involving : show bindings involving component\n"
|
|
" upper : show adapter's upper bindings\n"
|
|
" disabled : show disabled bindings\n"
|
|
"\n"
|
|
" to specify the component:\n"
|
|
" all : matches all components\n"
|
|
" <infid> : matches component with specified Inf Id\n"
|
|
" <pnpid> : matches component with specified PpP Id\n"
|
|
"\n",
|
|
pszProgramName,
|
|
SZ_CMD_SHOW_BINDINGS);
|
|
break;
|
|
|
|
case CMD_SHOW_COMPONENTS:
|
|
break;
|
|
|
|
case CMD_SHOW_STACK_TABLE:
|
|
break;
|
|
|
|
case CMD_SHOW_LAN_ADAPTER_PNPIDS:
|
|
break;
|
|
|
|
case CMD_ADD_COMPONENT:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"%S %S <class> <infid>\n"
|
|
"\n"
|
|
" <class> : one of 'net', 'irda', 'trans', 'client', 'service'\n"
|
|
" <infid> : the Inf ID of the component to add\n"
|
|
"\n",
|
|
pszProgramName,
|
|
SZ_CMD_ADD_COMPONENT);
|
|
break;
|
|
|
|
case CMD_REMOVE_COMPONENT:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"%S %S [<infid> | <pnpid>]\n"
|
|
"\n"
|
|
" <infid> : matches component with specified Inf Id\n"
|
|
" <pnpid> : matches component with specified PnP Id\n"
|
|
"\n",
|
|
pszProgramName,
|
|
SZ_CMD_REMOVE_COMPONENT);
|
|
break;
|
|
|
|
case CMD_UPDATE_COMPONENT:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"%S %S [<infid> | <pnpid>]\n"
|
|
"\n"
|
|
" <infid> : matches component with specified Inf Id\n"
|
|
" <pnpid> : matches component with specified PnP Id\n"
|
|
"\n",
|
|
pszProgramName,
|
|
SZ_CMD_UPDATE_COMPONENT);
|
|
break;
|
|
|
|
case CMD_REMOVE_REFS:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"%S %S <infid>\n"
|
|
"\n"
|
|
" <infid> : matches component with specified Inf Id\n"
|
|
"\n",
|
|
pszProgramName,
|
|
SZ_CMD_REMOVE_REFS);
|
|
break;
|
|
|
|
|
|
case CMD_ENABLE_BINDING:
|
|
case CMD_DISABLE_BINDING:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"%S %S <bindpath>\n"
|
|
"\n"
|
|
" <bindpath> : bindpath as specified like output of 'showbindings'\n"
|
|
"\n",
|
|
pszProgramName,
|
|
(CMD_ENABLE_BINDING == Command)
|
|
? SZ_CMD_ENABLE_BINDING
|
|
: SZ_CMD_DISABLE_BINDING);
|
|
break;
|
|
|
|
case CMD_MOVE_BINDING:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"%S %S <srcbindpath> [before | after] <dstbindpath>\n"
|
|
"\n"
|
|
" <srcbindpath> : bindpath as specified like output of 'showbindings'\n"
|
|
" <dstbindpath> : bindpath as specified like output of 'showbindings'\n"
|
|
" or 'null' to make srcbindpath first if 'before'\n"
|
|
" is specified, or last if 'after' is specified\n"
|
|
"\n",
|
|
pszProgramName,
|
|
SZ_CMD_MOVE_BINDING);
|
|
break;
|
|
|
|
case CMD_SET_WANORDER:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"%S %S [first | last]\n"
|
|
"\n"
|
|
" first : order WAN adapters before LAN adapters\n"
|
|
" last : order WAN adapters after LAN adapters\n"
|
|
"\n",
|
|
pszProgramName,
|
|
SZ_CMD_SET_WANORDER);
|
|
break;
|
|
|
|
case CMD_FULL_DIAGNOSTIC:
|
|
break;
|
|
|
|
case CMD_ADD_REMOVE_STRESS:
|
|
break;
|
|
|
|
case CMD_SHOW_LAN_CONNECTIONS:
|
|
break;
|
|
|
|
case CMD_SHOW_ALL_DEVICES:
|
|
break;
|
|
|
|
case CMD_SHOW_LAN_DETAILS:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"%S %S <lan connection name>\n"
|
|
"\n"
|
|
" <lan connection name> : friendly name of LAN connection\n"
|
|
" (note: use quotes if name contains spaces\n"
|
|
"\n",
|
|
pszProgramName,
|
|
SZ_CMD_SHOW_LAN_DETAILS);
|
|
break;
|
|
|
|
case CMD_LAN_CHANGE_STATE:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"%S %S <lan connection name> [connect | disconnect]\n"
|
|
"\n"
|
|
" <lan connection name> : friendly name of LAN connection\n"
|
|
" (note: use quotes if name contains spaces\n\n"
|
|
" <connect> : connects the given lan connection\n"
|
|
" <disconnect> : disconnects the given lan connection\n"
|
|
"\n",
|
|
pszProgramName,
|
|
SZ_CMD_LAN_CHANGE_STATE);
|
|
break;
|
|
|
|
default:
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"\n"
|
|
"Network Configuration Diagnostic\n"
|
|
" View, manipulate, or test network configuration.\n"
|
|
"\n"
|
|
"%S [options]\n"
|
|
" %-15S - Show the current bindings\n"
|
|
" %-15S - Show the currently installed components\n"
|
|
" %-15S - Show the current stack table\n"
|
|
" %-15S - Show PnP ids of LAN adapters\n"
|
|
" %-15S - Add a component\n"
|
|
" %-15S - Remove a component\n"
|
|
" %-15S - Update a component\n"
|
|
" %-15S - Enable a binding\n"
|
|
" %-15S - Disable a binding\n"
|
|
" %-15S - Change binding order\n"
|
|
" %-15S - Rewrite all bindings\n"
|
|
" %-15S - Change WAN adapter order\n"
|
|
" %-15S - Perform a full (non-destructive) diagnostic\n"
|
|
" %-15S - Perform Add/Remove component stress\n"
|
|
" %-15S - Show the current LAN connections\n"
|
|
" %-15S - Show details for a specific LAN connection\n"
|
|
" %-15S - Connects or disconnects a specific LAN connection\n"
|
|
" %-15S - Lists all devices\n"
|
|
"\n\n",
|
|
pszProgramName,
|
|
SZ_CMD_SHOW_BINDINGS,
|
|
SZ_CMD_SHOW_COMPONENTS,
|
|
SZ_CMD_SHOW_STACK_TABLE,
|
|
SZ_CMD_SHOW_LAN_ADAPTER_PNPIDS,
|
|
SZ_CMD_ADD_COMPONENT,
|
|
SZ_CMD_REMOVE_COMPONENT,
|
|
SZ_CMD_UPDATE_COMPONENT,
|
|
SZ_CMD_ENABLE_BINDING,
|
|
SZ_CMD_DISABLE_BINDING,
|
|
SZ_CMD_MOVE_BINDING,
|
|
SZ_CMD_WRITE_BINDINGS,
|
|
SZ_CMD_SET_WANORDER,
|
|
SZ_CMD_FULL_DIAGNOSTIC,
|
|
SZ_CMD_ADD_REMOVE_STRESS,
|
|
SZ_CMD_SHOW_LAN_CONNECTIONS,
|
|
SZ_CMD_SHOW_LAN_DETAILS,
|
|
SZ_CMD_LAN_CHANGE_STATE,
|
|
SZ_CMD_SHOW_ALL_DEVICES);
|
|
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_BINDINGS))
|
|
{
|
|
Options.Command = CMD_SHOW_BINDINGS;
|
|
iArg++;
|
|
|
|
if (NthArgIs (iArg, SZ_PARAM_BELOW))
|
|
{
|
|
Options.ShowBindParam = SHOW_BELOW;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_PARAM_INVOLVING))
|
|
{
|
|
Options.ShowBindParam = SHOW_INVOLVING;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_PARAM_UPPER))
|
|
{
|
|
Options.ShowBindParam = SHOW_UPPER;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_PARAM_DISABLED))
|
|
{
|
|
Options.ShowBindParam = SHOW_DISABLED;
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
|
|
if (SHOW_DISABLED != Options.ShowBindParam)
|
|
{
|
|
iArg++;
|
|
if (NthArgIs (iArg, SZ_ALIAS_ALL))
|
|
{
|
|
Options.CompSpecifier.Type = CST_ALL;
|
|
}
|
|
else if (NthArgIsPresent (iArg))
|
|
{
|
|
Options.CompSpecifier.Type = CST_BY_NAME;
|
|
Options.CompSpecifier.pszInfOrPnpId = argv[iArg];
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_SHOW_COMPONENTS))
|
|
{
|
|
Options.Command = CMD_SHOW_COMPONENTS;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_SHOW_STACK_TABLE))
|
|
{
|
|
Options.Command = CMD_SHOW_STACK_TABLE;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_SHOW_LAN_ADAPTER_PNPIDS))
|
|
{
|
|
Options.Command = CMD_SHOW_LAN_ADAPTER_PNPIDS;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_ADD_COMPONENT))
|
|
{
|
|
Options.Command = CMD_ADD_COMPONENT;
|
|
iArg++;
|
|
|
|
if (NthArgIs (iArg, SZ_PARAM_NET))
|
|
{
|
|
Options.ClassGuid = GUID_DEVCLASS_NET;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_PARAM_INFRARED))
|
|
{
|
|
Options.ClassGuid = GUID_DEVCLASS_INFRARED;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_PARAM_TRANS))
|
|
{
|
|
Options.ClassGuid = GUID_DEVCLASS_NETTRANS;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_PARAM_CLIENT))
|
|
{
|
|
Options.ClassGuid = GUID_DEVCLASS_NETCLIENT;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_PARAM_SERVICE))
|
|
{
|
|
Options.ClassGuid = GUID_DEVCLASS_NETSERVICE;
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
|
|
iArg++;
|
|
if (NthArgIsPresent (iArg))
|
|
{
|
|
Options.pszInfId = argv[iArg];
|
|
|
|
iArg++;
|
|
if (NthArgIs (iArg, SZ_PARAM_LEAK_CHECK))
|
|
{
|
|
Options.fLeakCheck = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_REMOVE_COMPONENT))
|
|
{
|
|
Options.Command = CMD_REMOVE_COMPONENT;
|
|
|
|
iArg++;
|
|
if (NthArgIsPresent (iArg))
|
|
{
|
|
Options.pszInfId = argv[iArg];
|
|
|
|
iArg++;
|
|
if (NthArgIs (iArg, SZ_PARAM_LEAK_CHECK))
|
|
{
|
|
Options.fLeakCheck = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_UPDATE_COMPONENT))
|
|
{
|
|
Options.Command = CMD_UPDATE_COMPONENT;
|
|
|
|
iArg++;
|
|
if (NthArgIsPresent (iArg))
|
|
{
|
|
Options.pszInfId = argv[iArg];
|
|
|
|
iArg++;
|
|
if (NthArgIs (iArg, SZ_PARAM_LEAK_CHECK))
|
|
{
|
|
Options.fLeakCheck = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_REMOVE_REFS))
|
|
{
|
|
Options.Command = CMD_REMOVE_REFS;
|
|
|
|
iArg++;
|
|
if (NthArgIsPresent (iArg))
|
|
{
|
|
Options.pszInfId = argv[iArg];
|
|
|
|
iArg++;
|
|
if (NthArgIs (iArg, SZ_PARAM_LEAK_CHECK))
|
|
{
|
|
Options.fLeakCheck = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_ENABLE_BINDING))
|
|
{
|
|
Options.Command = CMD_ENABLE_BINDING;
|
|
iArg++;
|
|
if (NthArgIsPresent (iArg))
|
|
{
|
|
Options.pszBindPath = argv[iArg];
|
|
|
|
iArg++;
|
|
if (NthArgIs (iArg, SZ_PARAM_LEAK_CHECK))
|
|
{
|
|
Options.fLeakCheck = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_DISABLE_BINDING))
|
|
{
|
|
Options.Command = CMD_DISABLE_BINDING;
|
|
iArg++;
|
|
if (NthArgIsPresent (iArg))
|
|
{
|
|
Options.pszBindPath = argv[iArg];
|
|
|
|
iArg++;
|
|
if (NthArgIs (iArg, SZ_PARAM_LEAK_CHECK))
|
|
{
|
|
Options.fLeakCheck = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_MOVE_BINDING))
|
|
{
|
|
Options.Command = CMD_MOVE_BINDING;
|
|
iArg++;
|
|
if (NthArgIsPresent (iArg) &&
|
|
NthArgIsPresent (iArg+1) &&
|
|
NthArgIsPresent (iArg+2))
|
|
{
|
|
Options.pszBindPath = argv[iArg];
|
|
Options.pszOtherBindPath = argv[iArg+2];
|
|
|
|
if (NthArgIs (iArg+1, SZ_PARAM_BEFORE))
|
|
{
|
|
Options.fMoveBefore = TRUE;
|
|
}
|
|
else if (NthArgIs (iArg+1, SZ_PARAM_AFTER))
|
|
{
|
|
Options.fMoveBefore = FALSE;
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_WRITE_BINDINGS))
|
|
{
|
|
Options.Command = CMD_WRITE_BINDINGS;
|
|
|
|
iArg++;
|
|
if (NthArgIs (iArg, SZ_PARAM_LEAK_CHECK))
|
|
{
|
|
Options.fLeakCheck = TRUE;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_SET_WANORDER))
|
|
{
|
|
Options.Command = CMD_SET_WANORDER;
|
|
iArg++;
|
|
if (NthArgIs (iArg+1, SZ_PARAM_FIRST))
|
|
{
|
|
Options.fWanAdaptersFirst = TRUE;
|
|
}
|
|
else if (NthArgIs (iArg+1, SZ_PARAM_LAST))
|
|
{
|
|
Options.fWanAdaptersFirst = FALSE;
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_FULL_DIAGNOSTIC))
|
|
{
|
|
Options.Command = CMD_FULL_DIAGNOSTIC;
|
|
|
|
iArg++;
|
|
if (NthArgIs (iArg, SZ_PARAM_LEAK_CHECK))
|
|
{
|
|
Options.fLeakCheck = TRUE;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_CLEANUP))
|
|
{
|
|
Options.Command = CMD_CLEANUP;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_ADD_REMOVE_STRESS))
|
|
{
|
|
Options.Command = CMD_ADD_REMOVE_STRESS;
|
|
|
|
iArg++;
|
|
if (NthArgIs (iArg, SZ_PARAM_LEAK_CHECK))
|
|
{
|
|
Options.fLeakCheck = TRUE;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_SHOW_LAN_CONNECTIONS))
|
|
{
|
|
Options.Command = CMD_SHOW_LAN_CONNECTIONS;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_SHOW_ALL_DEVICES))
|
|
{
|
|
Options.Command = CMD_SHOW_ALL_DEVICES;
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_SHOW_LAN_DETAILS))
|
|
{
|
|
Options.Command = CMD_SHOW_LAN_DETAILS;
|
|
iArg++;
|
|
|
|
if (NthArgIsPresent (iArg))
|
|
{
|
|
Options.szLanConnection = argv[iArg];
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else if (NthArgIs (iArg, SZ_CMD_LAN_CHANGE_STATE))
|
|
{
|
|
Options.Command = CMD_LAN_CHANGE_STATE;
|
|
iArg++;
|
|
|
|
if (NthArgIsPresent (iArg))
|
|
{
|
|
Options.szLanConnection = argv[iArg];
|
|
|
|
if (NthArgIs (iArg + 1, SZ_PARAM_CONNECT))
|
|
{
|
|
Options.fConnect = TRUE;
|
|
}
|
|
else if (NthArgIs (iArg + 1, SZ_PARAM_DISCONNECT))
|
|
{
|
|
Options.fConnect = FALSE;
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage (argv[0], Options.Command);
|
|
return;
|
|
}
|
|
|
|
// If we're doing leak checking, preload some DLLs that are delayloaded.
|
|
// If we don't do this, we see a buncn of "leaks" associated with
|
|
// the loader bringing in DLLs in the middle of our tests.
|
|
//
|
|
if (Options.fLeakCheck)
|
|
{
|
|
LoadLibraryW (L"mswsock.dll");
|
|
LoadLibraryW (L"comctl32.dll");
|
|
LoadLibraryW (L"comdlg32.dll");
|
|
LoadLibraryW (L"mprapi.dll");
|
|
LoadLibraryW (L"mswsock.dll");
|
|
LoadLibraryW (L"netapi32.dll");
|
|
LoadLibraryW (L"rtutils.dll");
|
|
LoadLibraryW (L"setupapi.dll");
|
|
LoadLibraryW (L"shell32.dll");
|
|
LoadLibraryW (L"userenv.dll");
|
|
LoadLibraryW (L"winspool.drv");
|
|
LoadLibraryW (L"ws2_32.dll");
|
|
}
|
|
|
|
HRESULT hr = CoInitializeEx (
|
|
NULL,
|
|
COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
g_pDiagCtx->Printf (ttidNcDiag,
|
|
"Problem 0x%08x initializing COM library", hr);
|
|
return;
|
|
}
|
|
|
|
// Call each of the external command processors
|
|
//
|
|
NetCfgDiagFromCommandArgs (&Options);
|
|
NetManDiagFromCommandArgs (&Options);
|
|
|
|
g_pDiagCtx->Printf (ttidNcDiag, "\n");
|
|
}
|