585 lines
17 KiB
C
585 lines
17 KiB
C
/*++
|
|
|
|
Copyright (c) 1999, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
sample\samplegetopt.c
|
|
|
|
Abstract:
|
|
|
|
The file contains functions to handle SAMPLE commands.
|
|
|
|
All command handlers take the following parameters...
|
|
pwszMachineName
|
|
*ppwcArguments argument array
|
|
dwCurrentIndex ppwcArguments[dwCurrentIndex] is the first argument
|
|
dwArgCount ppwcArguments[dwArgCount - 1] is the last argument
|
|
dwFlags
|
|
hMibServer
|
|
*pbDone
|
|
|
|
|
|
The handlers return the following values
|
|
Success...
|
|
NO_ERROR command succeeded, don't display another message.
|
|
ERROR_OKAY command succeeded, display "Ok." message.
|
|
|
|
Failure...
|
|
ERROR_SUPPRESS_OUTPUT command failed, don't display another message.
|
|
ERROR_SHOW_USAGE display extended help for the command.
|
|
ERROR_INVALID_SYNTAX display invalid syntax message and extended help.
|
|
|
|
|
|
The command handlers call the following function to parse arguments
|
|
PreprocessCommand(
|
|
IN HANDLE hModule, // handle passed to DllMain
|
|
IN PCHAR *ppwcArguments, // argument array
|
|
IN DWORD dwCurrentIndex, // ppwcArguments[dwCurrentIndex]: first
|
|
IN DWORD dwArgCount, // ppwcArguments[dwArgCount-1] : last
|
|
IN TAG_TYPE *pttTags, // legal tags
|
|
IN DWORD dwTagCount, // # entries in pttTags
|
|
IN DWORD dwMinArgs, // min # arguments required
|
|
IN DWORD dwMaxArgs, // max # arguments required
|
|
OUT DWORD *pdwTagType // output
|
|
)
|
|
The preprocessor performs the following functions
|
|
. ensures the number of tags present is valid.
|
|
. ensures there are no duplicate or unrecognized tags.
|
|
. ensures every 'required' tag is present.
|
|
. leaves the tag index of each argument in pdwTagType.
|
|
. removes 'tag=' from each argument.
|
|
|
|
|
|
For tags that take a specific set of values, this function is called
|
|
MatchEnumTag(
|
|
IN HANDLE hModule, // handle passed to DllMain
|
|
IN LPWSTR pwcArgument,// argument to process
|
|
IN DWORD dwNumValues,// number of possible values
|
|
IN PTOKEN_VALUE pEnumTable, // array of possible values
|
|
OUT PDWORD pdwValue // output
|
|
)
|
|
This performs the following functions
|
|
. matches argument with the set of values specified.
|
|
. returns corresponding value.
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
DWORD
|
|
WINAPI
|
|
HandleSampleSetGlobal(
|
|
IN LPCWSTR pwszMachineName,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN MIB_SERVER_HANDLE hMibServer,
|
|
IN BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Gets options for SET GLOBAL
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
|
|
TAG_TYPE pttTags[] =
|
|
{
|
|
{TOKEN_LOGLEVEL, FALSE, FALSE} // LOGLEVEL tag optional
|
|
};
|
|
DWORD pdwTagType[NUM_TAGS_IN_TABLE(pttTags)];
|
|
DWORD dwNumArg;
|
|
ULONG i;
|
|
|
|
IPSAMPLE_GLOBAL_CONFIG igcGlobalConfiguration;
|
|
DWORD dwBitVector = 0;
|
|
|
|
|
|
// SAMPLE should be installed for this command to complete
|
|
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
|
|
|
|
// preprocess the command
|
|
dwErr = PreprocessCommand(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
0,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
pdwTagType);
|
|
if (dwErr isnot NO_ERROR)
|
|
return dwErr;
|
|
|
|
// process all arguments
|
|
dwNumArg = dwArgCount - dwCurrentIndex;
|
|
for (i = 0; i < dwNumArg; i++)
|
|
{
|
|
switch (pdwTagType[i])
|
|
{
|
|
case 0 :
|
|
{
|
|
// tag LOGLEVEL
|
|
DWORD dwLogLevel;
|
|
TOKEN_VALUE rgtvEnums[] =
|
|
{
|
|
{TOKEN_NONE, IPSAMPLE_LOGGING_NONE},
|
|
{TOKEN_ERROR, IPSAMPLE_LOGGING_ERROR},
|
|
{TOKEN_WARN, IPSAMPLE_LOGGING_WARN},
|
|
{TOKEN_INFO, IPSAMPLE_LOGGING_INFO}
|
|
};
|
|
|
|
dwErr = MatchEnumTag(g_hModule,
|
|
ppwcArguments[i + dwCurrentIndex],
|
|
NUM_TOKENS_IN_TABLE(rgtvEnums),
|
|
rgtvEnums,
|
|
&dwLogLevel);
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
igcGlobalConfiguration.dwLoggingLevel = dwLogLevel;
|
|
dwBitVector |= SAMPLE_LOG_MASK;
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
dwErr = ERROR_INVALID_SYNTAX;
|
|
break;
|
|
}
|
|
} // switch
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
break ;
|
|
} // for
|
|
|
|
|
|
// process error
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
ProcessError();
|
|
return dwErr;
|
|
}
|
|
|
|
// update SAMPLE global configuration
|
|
if (dwBitVector)
|
|
dwErr = SgcUpdate(&igcGlobalConfiguration, dwBitVector);
|
|
|
|
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr ;
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
HandleSampleShowGlobal(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Gets options for SHOW GLOBAL
|
|
|
|
--*/
|
|
{
|
|
// SAMPLE should be installed for this command to complete
|
|
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
|
|
|
|
// does not expect any arguments. report error if any specified.
|
|
if (dwCurrentIndex isnot dwArgCount)
|
|
return ERROR_INVALID_SYNTAX;
|
|
|
|
// show SAMPLE global configuration
|
|
return SgcShow(FORMAT_VERBOSE);
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
GetInterfaceOptions(
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
OUT PWCHAR pwszInterfaceGuid,
|
|
OUT PIPSAMPLE_IF_CONFIG piicNew,
|
|
OUT DWORD *pdwBitVector
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Gets options for SET INTERFACE and ADD INTERFACE.
|
|
|
|
Arguments:
|
|
pwszInterfaceGuid guid for the specified interface. Size of this
|
|
buffer should be
|
|
(MAX_INTERFACE_NAME_LEN+1)*sizeof(WCHAR)
|
|
piicNew configuration containing changed values
|
|
pdwBitVector which values have changed
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
|
|
TAG_TYPE pttTags[] =
|
|
{
|
|
{TOKEN_NAME, TRUE, FALSE}, // NAME tag required
|
|
{TOKEN_METRIC, FALSE, FALSE}, // METRIC tag optional
|
|
};
|
|
DWORD pdwTagType[NUM_TAGS_IN_TABLE(pttTags)];
|
|
DWORD dwNumArg;
|
|
DWORD dwBufferSize = MAX_INTERFACE_NAME_LEN + 1;
|
|
ULONG i;
|
|
|
|
// dwBufferSize is the size of the pwszInterfaceGuid buffer.
|
|
// All invocations of this api should pass in a
|
|
// (MAX_INTERFACE_NAME_LEN+1) element array of WCHARs as
|
|
// the pwszInterfaceGuid parameter.
|
|
dwBufferSize = (MAX_INTERFACE_NAME_LEN + 1)*sizeof(WCHAR);
|
|
|
|
// preprocess the command
|
|
dwErr = PreprocessCommand(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
1,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
pdwTagType);
|
|
if (dwErr isnot NO_ERROR)
|
|
return dwErr;
|
|
|
|
// process all arguments
|
|
dwNumArg = dwArgCount - dwCurrentIndex;
|
|
for (i = 0; i < dwNumArg; i++)
|
|
{
|
|
switch (pdwTagType[i])
|
|
{
|
|
case 0 :
|
|
{
|
|
// tag NAME
|
|
dwErr = InterfaceGuidFromName(
|
|
ppwcArguments[i+dwCurrentIndex],
|
|
pwszInterfaceGuid,
|
|
&dwBufferSize);
|
|
break;
|
|
}
|
|
|
|
case 1:
|
|
{
|
|
// tag METRIC
|
|
piicNew->ulMetric = wcstoul(ppwcArguments[i+dwCurrentIndex],
|
|
NULL,
|
|
10);
|
|
*pdwBitVector |= SAMPLE_IF_METRIC_MASK;
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
dwErr = ERROR_INVALID_SYNTAX;
|
|
break;
|
|
}
|
|
} // switch
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
break ;
|
|
} // for
|
|
|
|
|
|
// process error
|
|
if (dwErr isnot NO_ERROR)
|
|
ProcessError();
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
HandleSampleAddIf(
|
|
IN PWCHAR pwszMachineName,
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN MIB_SERVER_HANDLE hMibServer,
|
|
IN BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Gets options for ADD INTERFACE
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
WCHAR pwszInterfaceGuid[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
IPSAMPLE_IF_CONFIG iicNew;
|
|
DWORD dwBitVector = 0;
|
|
|
|
|
|
// SAMPLE should be installed for this command to complete
|
|
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
|
|
|
|
// get optional parameters that are also being set
|
|
dwErr = GetInterfaceOptions(ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pwszInterfaceGuid,
|
|
&iicNew,
|
|
&dwBitVector);
|
|
if (dwErr isnot NO_ERROR)
|
|
return dwErr;
|
|
|
|
// make sure that the interface does not already exist in the config
|
|
if (IsInterfaceInstalled(pwszInterfaceGuid, MS_IP_SAMPLE))
|
|
{
|
|
DisplayError(g_hModule, EMSG_INTERFACE_EXISTS, pwszInterfaceGuid);
|
|
return ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
|
|
// add SAMPLE interface configuration
|
|
dwErr = SicUpdate(pwszInterfaceGuid, &iicNew, dwBitVector, TRUE);
|
|
|
|
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr;
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
HandleSampleDelIf(
|
|
IN PWCHAR pwszMachineName,
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN MIB_SERVER_HANDLE hMibServer,
|
|
IN BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Gets options for DELETE INTERFACE
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
WCHAR pwszInterfaceGuid[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
IPSAMPLE_IF_CONFIG iicNew;
|
|
DWORD dwBitVector = 0;
|
|
|
|
|
|
// SAMPLE should be installed for this command to complete
|
|
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
|
|
|
|
// get interface name.
|
|
dwErr = GetInterfaceOptions(ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pwszInterfaceGuid,
|
|
&iicNew,
|
|
&dwBitVector);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
return dwErr ;
|
|
if (dwBitVector) // ensure that no other option is set.
|
|
return ERROR_INVALID_SYNTAX;
|
|
|
|
// delete interface
|
|
dwErr = DeleteInterfaceConfiguration(pwszInterfaceGuid, MS_IP_SAMPLE);
|
|
|
|
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr;
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
HandleSampleSetIf(
|
|
IN PWCHAR pwszMachineName,
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN MIB_SERVER_HANDLE hMibServer,
|
|
IN BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Gets options for SET INTERFACE
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
WCHAR pwszInterfaceGuid[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
IPSAMPLE_IF_CONFIG iicNew;
|
|
DWORD dwBitVector = 0;
|
|
|
|
|
|
// SAMPLE should be installed for this command to complete
|
|
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
|
|
|
|
// get parameters being set
|
|
dwErr = GetInterfaceOptions(ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pwszInterfaceGuid,
|
|
&iicNew,
|
|
&dwBitVector);
|
|
if (dwErr isnot NO_ERROR)
|
|
return dwErr;
|
|
|
|
// set SAMPLE interface configuration
|
|
dwErr = SicUpdate(pwszInterfaceGuid, &iicNew, dwBitVector, FALSE);
|
|
|
|
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr;
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
HandleSampleShowIf(
|
|
IN PWCHAR pwszMachineName,
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN MIB_SERVER_HANDLE hMibServer,
|
|
IN BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Gets options for SHOW INTERFACE
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
WCHAR pwszInterfaceGuid[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
IPSAMPLE_IF_CONFIG iicNew;
|
|
DWORD dwBitVector = 0;
|
|
|
|
|
|
// SAMPLE should be installed for this command to complete
|
|
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
|
|
|
|
|
|
// no interface specified, show SAMPLE configuration for all interfaces
|
|
if (dwCurrentIndex is dwArgCount)
|
|
return SicShowAll(FORMAT_TABLE) ;
|
|
|
|
|
|
// get interface name.
|
|
dwErr = GetInterfaceOptions(ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pwszInterfaceGuid,
|
|
&iicNew,
|
|
&dwBitVector);
|
|
if (dwErr isnot NO_ERROR)
|
|
return dwErr ;
|
|
if (dwBitVector) // ensure that no other option is set.
|
|
return ERROR_INVALID_SYNTAX;
|
|
|
|
// show SAMPLE interface configuration
|
|
return SicShow(FORMAT_VERBOSE, pwszInterfaceGuid) ;
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
HandleSampleInstall(
|
|
IN PWCHAR pwszMachineName,
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN MIB_SERVER_HANDLE hMibServer,
|
|
IN BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Gets options for INSTALL
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
PBYTE pbGlobalConfiguration = NULL;
|
|
DWORD dwSize;
|
|
|
|
// no options expected for install command.
|
|
if (dwCurrentIndex isnot dwArgCount)
|
|
return ERROR_INVALID_SYNTAX;
|
|
|
|
do // breakout loop
|
|
{
|
|
dwErr = SgcMake(&pbGlobalConfiguration, &dwSize);
|
|
if (dwErr isnot NO_ERROR)
|
|
break;
|
|
|
|
// add SAMPLE global configuration
|
|
dwErr = SetGlobalConfiguration(MS_IP_SAMPLE,
|
|
pbGlobalConfiguration,
|
|
dwSize,
|
|
1);
|
|
if (dwErr isnot NO_ERROR)
|
|
break;
|
|
}while (FALSE);
|
|
|
|
if (pbGlobalConfiguration) FREE(pbGlobalConfiguration);
|
|
|
|
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr;
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
HandleSampleUninstall(
|
|
IN PWCHAR pwszMachineName,
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN MIB_SERVER_HANDLE hMibServer,
|
|
IN BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Gets options for UNINSTALL
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
|
|
// no options expected for uninstall command.
|
|
if (dwCurrentIndex isnot dwArgCount)
|
|
return ERROR_INVALID_SYNTAX;
|
|
|
|
dwErr = DeleteProtocol(MS_IP_SAMPLE);
|
|
|
|
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr;
|
|
}
|