|
|
/*++
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; }
|