462 lines
12 KiB
C
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;
|
|
}
|
|
|