windows-nt/Source/XPSP1/NT/net/rras/netsh/ip/sample/samplecfg.c
2020-09-26 16:20:57 +08:00

462 lines
12 KiB
C

/*++
Copyright (c) 1999, Microsoft Corporation
Module Name:
sample\samplecfg.c
Abstract:
The file contains functions to change configuration for IP SAMPLE.
--*/
#include "precomp.h"
#pragma hdrstop
DWORD
SgcMake (
OUT PBYTE *ppbStart,
OUT PDWORD pdwSize
)
/*++
Routine Description:
Creates a SAMPLE global configuration block.
Callee should take care to deallocate the configuration block once done.
Arguments:
ppbStart pointer to the configuration block address
pdwSize pointer to size of the configuration block
Return Value:
NO_ERROR, ERROR_NOT_ENOUGH_MEMORY
--*/
{
*pdwSize = sizeof(IPSAMPLE_GLOBAL_CONFIG);
*ppbStart = MALLOC(*pdwSize);
if (*ppbStart is NULL)
return ERROR_NOT_ENOUGH_MEMORY;
CopyMemory(*ppbStart, g_ceSample.pDefaultGlobal, *pdwSize);
return NO_ERROR;
}
DWORD
SgcShow (
IN FORMAT fFormat
)
/*++
Routine Description:
Displays SAMPLE global configuration.
Used for dump as well as show commands.
Arguments:
hFile NULL, or dump file handle
Return Value:
NO_ERROR
--*/
{
DWORD dwErr = NO_ERROR;
PIPSAMPLE_GLOBAL_CONFIG pigc = NULL;
DWORD dwBlockSize, dwNumBlocks;
PWCHAR pwszLogLevel = NULL;
VALUE_TOKEN vtLogLevelTable[] =
{
IPSAMPLE_LOGGING_NONE, TOKEN_NONE,
IPSAMPLE_LOGGING_ERROR, TOKEN_ERROR,
IPSAMPLE_LOGGING_WARN, TOKEN_WARN,
IPSAMPLE_LOGGING_INFO, TOKEN_INFO
};
VALUE_STRING vsLogLevelTable[] =
{
IPSAMPLE_LOGGING_NONE, STRING_LOGGING_NONE,
IPSAMPLE_LOGGING_ERROR, STRING_LOGGING_ERROR,
IPSAMPLE_LOGGING_WARN, STRING_LOGGING_WARN,
IPSAMPLE_LOGGING_INFO, STRING_LOGGING_INFO
};
do // breakout loop
{
// get global configuration
dwErr = GetGlobalConfiguration(MS_IP_SAMPLE,
(PBYTE *) &pigc,
&dwBlockSize,
&dwNumBlocks);
if (dwErr isnot NO_ERROR)
{
if (dwErr is ERROR_NOT_FOUND)
dwErr = EMSG_PROTO_NO_GLOBAL_CONFIG;
break;
}
// getting logging mode string
dwErr = GetString(g_hModule,
fFormat,
pigc->dwLoggingLevel,
vtLogLevelTable,
vsLogLevelTable,
NUM_VALUES_IN_TABLE(vtLogLevelTable),
&pwszLogLevel);
if (dwErr isnot NO_ERROR)
break;
// dump or show
if (fFormat is FORMAT_DUMP)
{
// dump SAMPLE global configuration
DisplayMessageT(DMP_SAMPLE_INSTALL) ;
DisplayMessageT(DMP_SAMPLE_SET_GLOBAL,
pwszLogLevel);
} else {
// show SAMPLE global configuration
DisplayMessage(g_hModule,
MSG_SAMPLE_GLOBAL_CONFIG,
pwszLogLevel);
}
dwErr = NO_ERROR;
} while (FALSE);
// deallocate memory
if (pigc) FREE(pigc);
if (pwszLogLevel) FreeString(pwszLogLevel);
if (dwErr isnot NO_ERROR)
{
// display error message. We first search for the error code in
// the module specified by the caller (if one is specified). If no
// module is given, or the error code doesnt exist we look for MPR
// errors, RAS errors and Win32 errors - in that order.
if (fFormat isnot FORMAT_DUMP) DisplayError(g_hModule, dwErr);
dwErr = ERROR_SUPPRESS_OUTPUT;
}
return dwErr;
}
DWORD
SgcUpdate (
IN PIPSAMPLE_GLOBAL_CONFIG pigcNew,
IN DWORD dwBitVector
)
/*++
Routine Description:
Updates SAMPLE global configuration
Arguments:
pigcNew new values to be set
dwBitVector which fields need to be modified
Return Value:
NO_ERROR, ERROR_NOT_ENOUGH_MEMORY
--*/
{
DWORD dwErr = NO_ERROR;
PIPSAMPLE_GLOBAL_CONFIG pigc = NULL;
DWORD dwBlockSize, dwNumBlocks;
// no updates required
if (dwBitVector is 0)
return NO_ERROR;
do // breakout loop
{
// get global configuration
dwErr = GetGlobalConfiguration(MS_IP_SAMPLE,
(PBYTE *) &pigc,
&dwBlockSize,
&dwNumBlocks);
if (dwErr isnot NO_ERROR)
break;
// can be updated in place since only fixed sized fields
if (dwBitVector & SAMPLE_LOG_MASK)
pigc->dwLoggingLevel = pigcNew->dwLoggingLevel;
// set the new configuration
dwErr = SetGlobalConfiguration(MS_IP_SAMPLE,
(PBYTE) pigc,
dwBlockSize,
dwNumBlocks);
if (dwErr isnot NO_ERROR)
break;
} while (FALSE);
// deallocate memory
if (pigc) FREE(pigc);
return dwErr;
}
DWORD
SicMake (
OUT PBYTE *ppbStart,
OUT PDWORD pdwSize
)
/*++
Routine Description:
Creates a SAMPLE interface configuration block.
Callee should take care to deallocate the configuration block once done.
Arguments:
ppbStart pointer to the configuration block address
pdwSize pointer to size of the configuration block
Return Value:
NO_ERROR, ERROR_NOT_ENOUGH_MEMORY
--*/
{
*pdwSize = sizeof(IPSAMPLE_IF_CONFIG);
*ppbStart = MALLOC(*pdwSize);
if (*ppbStart is NULL)
return ERROR_NOT_ENOUGH_MEMORY;
CopyMemory(*ppbStart, g_ceSample.pDefaultInterface, *pdwSize);
return NO_ERROR;
}
DWORD
SicShowAll (
IN FORMAT fFormat
)
/*++
Routine Description:
Displays SAMPLE configuration for all interfaces.
Used for dump as well as show commands.
Arguments:
fFormat TABLE or DUMP
--*/
{
DWORD dwErr = NO_ERROR;
BOOL bSomethingDisplayed = FALSE;
PMPR_INTERFACE_0 pmi0;
DWORD dwCount, dwTotal;
ULONG i;
// enumerate all interfaces
dwErr = IpmontrInterfaceEnum((PBYTE *) &pmi0, &dwCount, &dwTotal);
if (dwErr isnot NO_ERROR)
{
if (fFormat isnot FORMAT_DUMP) DisplayError(g_hModule, dwErr);
return ERROR_SUPPRESS_OUTPUT;
}
for(i = 0; i < dwCount; i++)
{
// make sure that SAMPLE is configured on that interface
if (IsInterfaceInstalled(pmi0[i].wszInterfaceName, MS_IP_SAMPLE))
{
// print table header if first entry
if (!bSomethingDisplayed and (fFormat is FORMAT_TABLE))
DisplayMessage(g_hModule, MSG_SAMPLE_IF_CONFIG_HEADER);
bSomethingDisplayed = TRUE;
SicShow(fFormat, pmi0[i].wszInterfaceName);
}
}
return bSomethingDisplayed ? NO_ERROR : ERROR_OKAY;
}
DWORD
SicShow (
IN FORMAT fFormat,
IN LPCWSTR pwszInterfaceGuid
)
/*++
Routine Description:
Displays SAMPLE configuration for an interface.
Used for dump as well as show commands.
Arguments:
pwszInterfaceGuid interface name
--*/
{
DWORD dwErr = NO_ERROR;
PIPSAMPLE_IF_CONFIG piic = NULL;
DWORD dwBlockSize, dwNumBlocks, dwIfType;
PWCHAR pwszInterfaceName = NULL;
do // breakout loop
{
// get interface configuration
dwErr = GetInterfaceConfiguration(pwszInterfaceGuid,
MS_IP_SAMPLE,
(PBYTE *) &piic,
&dwBlockSize,
&dwNumBlocks,
&dwIfType);
if (dwErr isnot NO_ERROR)
{
if (dwErr is ERROR_NOT_FOUND)
dwErr = EMSG_PROTO_NO_IF_CONFIG;
break;
}
// get quoted friendly name for interface
dwErr = QuotedInterfaceNameFromGuid(pwszInterfaceGuid,
&pwszInterfaceName);
if (dwErr isnot NO_ERROR)
break;
// dump or show
switch(fFormat)
{
case FORMAT_DUMP: // dump SAMPLE interface configuration
DisplayMessage(g_hModule,
DMP_SAMPLE_INTERFACE_HEADER,
pwszInterfaceName);
DisplayMessageT(DMP_SAMPLE_ADD_INTERFACE,
pwszInterfaceName,
piic->ulMetric);
break;
case FORMAT_TABLE: // show sample interface configuration
DisplayMessage(g_hModule,
MSG_SAMPLE_IF_CONFIG_ENTRY,
pwszInterfaceName,
piic->ulMetric);
break;
case FORMAT_VERBOSE: // show sample interface configuration
DisplayMessage(g_hModule,
MSG_SAMPLE_IF_CONFIG,
pwszInterfaceName,
piic->ulMetric);
break;
}
} while (FALSE);
// deallocate memory
if (piic) FREE(piic);
if (pwszInterfaceName)
FreeQuotedString(pwszInterfaceName);
// display error message.
if (dwErr isnot NO_ERROR)
{
if (fFormat isnot FORMAT_DUMP) DisplayError(g_hModule, dwErr);
dwErr = ERROR_SUPPRESS_OUTPUT;
}
return dwErr;
}
DWORD
SicUpdate (
IN LPCWSTR pwszInterfaceGuid,
IN PIPSAMPLE_IF_CONFIG piicNew,
IN DWORD dwBitVector,
IN BOOL bAdd
)
/*++
Routine Description:
Updates SAMPLE interface configuration
Arguments:
pwszInterfaceGuid interface name
piicNew the changes to be applied
dwBitVector which fields need to be modified
bAdd interface being added (TRUE) or set (FALSE)
Return Value:
NO_ERROR, ERROR_NOT_ENOUGH_MEMORY
--*/
{
DWORD dwErr = NO_ERROR;
PIPSAMPLE_IF_CONFIG piic = NULL;
DWORD dwBlockSize, dwNumBlocks, dwIfType;
do // breakout loop
{
if (bAdd)
{
// create default protocol interface configuration
dwNumBlocks = 1;
dwErr = SicMake((PBYTE *)&piic, &dwBlockSize);
if (dwErr isnot NO_ERROR)
break;
} else {
// get current protocol interface configuration
dwErr = GetInterfaceConfiguration(pwszInterfaceGuid,
MS_IP_SAMPLE,
(PBYTE *) &piic,
&dwBlockSize,
&dwNumBlocks,
&dwIfType);
if (dwErr isnot NO_ERROR)
{
if (dwErr is ERROR_NOT_FOUND)
{
DisplayError(g_hModule, EMSG_PROTO_NO_IF_CONFIG);
dwErr = ERROR_SUPPRESS_OUTPUT;
}
break;
}
}
// can be updated in place since only fixed sized fields
if (dwBitVector & SAMPLE_IF_METRIC_MASK)
piic->ulMetric = piicNew->ulMetric;
// set the new configuration
dwErr = SetInterfaceConfiguration(pwszInterfaceGuid,
MS_IP_SAMPLE,
(PBYTE) piic,
dwBlockSize,
dwNumBlocks);
if (dwErr isnot NO_ERROR)
break;
} while (FALSE);
// deallocate memory
if (piic) FREE(piic);
return dwErr;
}