Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

295 lines
7.9 KiB

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