|
|
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998-2000 Microsoft Corporation
//
// Module Name:
//
// aaaaConfig.cpp
//
// Abstract:
//
// Handlers for aaaa config commands
//
// Revision History:
//
// pmay
// tperraut 04/02/1999
// tperraut 04/03/2000 Version# test, use of upgrade code for version <
// Whistler Proxy (2)
//
//////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "strdefs.h"
#include "rmstring.h"
#include "aaaamon.h"
#include "aaaaversion.h"
#include "aaaaconfig.h"
//
// NOTE since WIN32 errors are assumed to fall in the range -32k to 32k
// (see comment in winerror.h near HRESULT_FROM_WIN32 definition), we can
// re-create original Win32 error from low-order 16 bits of HRESULT.
//
#define WIN32_FROM_HRESULT(x) \
( (HRESULT_FACILITY(x) == FACILITY_WIN32) ? ((DWORD)((x) & 0x0000FFFF)) : (x) )
//////////////////////////////////////////////////////////////////////////////
//
// Parses the Aaaa set config from the command line
//
//////////////////////////////////////////////////////////////////////////////
DWORD AaaaConfigParseCommandLine( IN PWCHAR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwCmdFlags )
{ const WCHAR IAS_MDB[] = L"%SystemRoot%\\System32\\ias\\ias.mdb"; DWORD dwErr = NO_ERROR; TOKEN_VALUE rgEnumState[] = { {TOKEN_SET, HLP_AAAACONFIG_SET}, {TOKEN_SHOW, HLP_AAAACONFIG_SHOW} }; AAAAMON_CMD_ARG pArgs[] = { { AAAAMONTR_CMD_TYPE_STRING, // tag string, required or not, present or not
{TOKEN_BLOB, NS_REQ_PRESENT, FALSE}, //tag_type
rgEnumState, sizeof(rgEnumState)/sizeof(*rgEnumState), NULL } };
do { // Parse
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, NULL, pArgs, sizeof(pArgs) / sizeof(*pArgs)); if ( dwErr != NO_ERROR ) { break; }
// Config
//
if ( !pArgs[0].rgTag.bPresent ) { // tag blob not found
DisplayMessage(g_hModule, MSG_AAAACONFIG_SET_FAIL); dwErr = ERROR_INVALID_SYNTAX; break; }
// tag blob found
// Now try to restore the database from the script
HRESULT hres = IASRestoreConfig(ppwcArguments[dwCurrentIndex]); if ( FAILED(hres) ) { DisplayMessage(g_hModule, MSG_AAAACONFIG_SET_FAIL); dwErr = WIN32_FROM_HRESULT(hres); break; }
// set config successfull: refresh the service
hres = RefreshIASService(); if ( FAILED(hres) ) { ///////////////////////////
// Refresh should not fail.
///////////////////////////
DisplayMessage(g_hModule, MSG_AAAACONFIG_SET_REFRESH_FAIL); dwErr = NO_ERROR; } else { DisplayMessage(g_hModule, MSG_AAAACONFIG_SET_SUCCESS); dwErr = NO_ERROR; }
} while ( FALSE ); return dwErr; }
//////////////////////////////////////////////////////////////////////////////
// Function Name:AaaConfigDumpConfig
//
// Parameters: none
//
// Description: writes the current config (header, content...) to the output
//
// Returns: NO_ERROR or ERROR_SUPPRESS_OUTPUT
//
//////////////////////////////////////////////////////////////////////////////
DWORD AaaaConfigDumpConfig() { const int MAX_SIZE_DISPLAY_LINE = 80; const int SIZE_MAX_STRING = 512; const int WHISTLER_PROXY_VERSION = 3;
DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_HEADER);
bool bCoInitialized = false; do { HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if ( FAILED(hr) ) { if ( hr != RPC_E_CHANGED_MODE ) { break; } } else { bCoInitialized = true; }
LONG lVersion; hr = AaaaVersionGetVersion(&lVersion); if ( FAILED(hr) ) { DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_FAIL); break; }
// Sanity check to make sure that the actual database is a Whistler DB
if ( lVersion != WHISTLER_PROXY_VERSION ) { DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_FAIL); break; }
WCHAR sDisplayString[SIZE_MAX_STRING] = L""; _snwprintf( sDisplayString, SIZE_MAX_STRING, L"# IAS.MDB Version = %d\n", lVersion );
DisplayMessageT(sDisplayString); ULONG ulSize; WCHAR* pDumpString; hr = IASDumpConfig(&pDumpString, &ulSize);
if ( SUCCEEDED(hr) ) { ULONG RelativePos = 0; ULONG CurrentPos = 0; WCHAR DisplayLine [MAX_SIZE_DISPLAY_LINE];
DisplayMessageT(MSG_AAAACONFIG_BLOBBEGIN); while ( CurrentPos <= ulSize ) { WCHAR TempChar = pDumpString[CurrentPos++]; DisplayLine[RelativePos++] = TempChar; if ( TempChar == L'\r' ) { DisplayLine[RelativePos] = L'\0'; DisplayMessageT(DisplayLine); RelativePos = 0; } } DisplayMessageT(L"*");
free (pDumpString); // was allocated by malloc
DisplayMessageT(MSG_AAAACONFIG_BLOBEND);
DisplayMessage( g_hModule, MSG_AAAACONFIG_SHOW_FOOTER );
} else { DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_INVALID_SYNTAX); DisplayMessage(g_hModule, HLP_AAAACONFIG_SHOW); } } while (false);
if (bCoInitialized) { CoUninitialize(); }
return NO_ERROR; }
//////////////////////////////////////////////////////////////////////////////
//
// Handles the aaaa config set command
//
//////////////////////////////////////////////////////////////////////////////
DWORD HandleAaaaConfigSet( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { return AaaaConfigParseCommandLine( ppwcArguments, dwCurrentIndex, dwArgCount, dwFlags ); }
//////////////////////////////////////////////////////////////////////////////
//
// Handles the aaaa config show command
//
//////////////////////////////////////////////////////////////////////////////
DWORD HandleAaaaConfigShow( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { if (dwCurrentIndex < dwArgCount) { DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_FAIL); DisplayMessage(g_hModule, HLP_AAAACONFIG_SHOW); } else { AaaaConfigDumpConfig(); }
return NO_ERROR; }
|