|
|
/*
File: rasat.h The 'remoteaccess at' sub context
3/2/99 */
#include "precomp.h"
#include "rasat.h"
// The guid for this context
//
GUID g_RasAtGuid = RASAT_GUID; static PWCHAR g_pszServer = NULL; static DWORD g_dwBuild = 0;
// The commands supported in this context
//
CMD_ENTRY g_RasAtSetCmdTable[] = { CREATE_CMD_ENTRY(RASAT_SET_NEGOTIATION,RasAtHandleSetNegotiation), CREATE_CMD_ENTRY(RASAT_SET_ACCESS, RasAtHandleSetAccess), };
CMD_ENTRY g_RasAtShowCmdTable[] = { CREATE_CMD_ENTRY(RASAT_SHOW_CONFIG, RasAtHandleShow), };
CMD_GROUP_ENTRY g_RasAtCmdGroups[] = { CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_RasAtSetCmdTable), CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_RasAtShowCmdTable), };
ULONG g_ulRasAtNumGroups = sizeof(g_RasAtCmdGroups)/sizeof(CMD_GROUP_ENTRY);
//
// Flags that control how/what info is read/written
// in the RASAT_CB structure
//
#define RASAT_F_EnableIn 0x1
#define RASAT_F_Access 0x2
#define RASAT_F_All 0xFFFF
//
// Control block for remoteaccess at configuration
//
typedef struct _RASAT_CB { DWORD dwFlags; // See RASAT_F_* values
BOOL bEnableIn; BOOL bAccess; } RASAT_CB;
//
// At specific registry parameters
//
WCHAR pszAtParams[] = L"AppleTalk"; WCHAR pszAtNetworkAccess[] = L"NetworkAccess";
//
// Prototypes of functions that manipulate the
// RASAT_CB structures
//
DWORD RasAtCbCleanup( IN RASAT_CB* pConfig);
DWORD RasAtCbCreateDefault( OUT RASAT_CB** ppConfig);
DWORD RasAtCbOpenRegKeys( IN LPCWSTR pszServer, OUT HKEY* phKey); DWORD RasAtCbRead( IN LPCWSTR pszServer, OUT RASAT_CB* pConfig);
DWORD RasAtCbWrite( IN LPCWSTR pszServer, IN RASAT_CB* pConfig);
//
// Entry called by rasmontr to register this context
//
DWORD WINAPI RasAtStartHelper( IN CONST GUID *pguidParent, IN DWORD dwVersion) { DWORD dwErr = NO_ERROR; NS_CONTEXT_ATTRIBUTES attMyAttributes;
// Initialize
//
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
attMyAttributes.pwszContext = L"appletalk"; attMyAttributes.guidHelper = g_RasAtGuid; attMyAttributes.dwVersion = RASAT_VERSION; attMyAttributes.dwFlags = 0; attMyAttributes.ulNumTopCmds= 0; attMyAttributes.pTopCmds = NULL; attMyAttributes.ulNumGroups = g_ulRasAtNumGroups; attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_RasAtCmdGroups; attMyAttributes.pfnDumpFn = RasAtDump;
dwErr = RegisterContext( &attMyAttributes ); return dwErr; }
DWORD RasAtDisplayConfig( IN BOOL bReport) { DWORD dwErr = NO_ERROR; RASAT_CB* pConfig = NULL; PWCHAR pszEnableIn = NULL, pszAccess = NULL; do { // Get a default config blob
//
dwErr = RasAtCbCreateDefault(&pConfig); BREAK_ON_DWERR( dwErr );
// Read in all of the values
//
pConfig->dwFlags = RASAT_F_All; dwErr = RasAtCbRead(g_pszServer, pConfig); BREAK_ON_DWERR( dwErr ); if (bReport) { pszEnableIn = RutlStrDup(pConfig->bEnableIn ? TOKEN_ALLOW : TOKEN_DENY); pszAccess = RutlStrDup(pConfig->bAccess ? TOKEN_ALL : TOKEN_SERVERONLY);
DisplayMessage( g_hModule, MSG_RASAT_SERVERCONFIG, g_pszServer, pszEnableIn, pszAccess); } else { pszEnableIn = RutlAssignmentFromTokens( g_hModule, TOKEN_MODE, pConfig->bEnableIn ? TOKEN_ALLOW : TOKEN_DENY); pszAccess = RutlAssignmentFromTokens( g_hModule, TOKEN_MODE, pConfig->bAccess ? TOKEN_ALL : TOKEN_SERVERONLY);
DisplayMessage( g_hModule, MSG_RASAT_SCRIPTHEADER);
DisplayMessageT(DMP_RASAT_PUSHD);
DisplayMessage( g_hModule, MSG_RASAT_SET_CMD, DMP_RASAT_SET_NEGOTIATION, pszEnableIn); DisplayMessage( g_hModule, MSG_RASAT_SET_CMD, DMP_RASAT_SET_ACCESS, pszAccess); DisplayMessageT(DMP_RASAT_POPD);
DisplayMessage( g_hModule, MSG_RASAT_SCRIPTFOOTER); }
} while (FALSE);
// Cleanup
{ if (pConfig) { RasAtCbCleanup(pConfig); } if (pszEnableIn) { RutlFree(pszEnableIn); } if (pszAccess) { RutlFree(pszAccess); } }
return dwErr; }
DWORD WINAPI RasAtDump( IN LPCWSTR pwszRouter, IN OUT LPWSTR *ppwcArguments, IN DWORD dwArgCount, IN LPCVOID pvData ) { return RasAtDisplayConfig(FALSE); }
DWORD RasAtHandleSetAccess( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR, dwValue = 0; RASAT_CB Config; TOKEN_VALUE rgEnum[] = { {TOKEN_ALL, TRUE}, {TOKEN_SERVERONLY, FALSE} }; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_ENUM, {TOKEN_MODE, TRUE, FALSE}, rgEnum, sizeof(rgEnum)/sizeof(*rgEnum), NULL } };
do { // Parse the command line
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
dwValue = RASMON_CMD_ARG_GetDword(&pArgs[0]);
// If successful, go ahead and set the info
//
ZeroMemory(&Config, sizeof(Config)); Config.dwFlags = RASAT_F_Access; Config.bAccess = dwValue; dwErr = RasAtCbWrite(g_pszServer, &Config); if (dwErr != NO_ERROR) { DisplayError(NULL, dwErr); break; } } while (FALSE);
// Cleanup
{ }
return dwErr; }
DWORD RasAtHandleSetNegotiation( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR, dwValue = 0; RASAT_CB Config; TOKEN_VALUE rgEnum[] = { {TOKEN_ALLOW, TRUE}, {TOKEN_DENY, FALSE} }; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_ENUM, {TOKEN_MODE, TRUE, FALSE}, rgEnum, sizeof(rgEnum)/sizeof(*rgEnum), NULL } };
do { // Parse the command line
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
dwValue = RASMON_CMD_ARG_GetDword(&pArgs[0]); // If successful, go ahead and set the info
//
ZeroMemory(&Config, sizeof(Config)); Config.dwFlags = RASAT_F_EnableIn; Config.bEnableIn = dwValue; dwErr = RasAtCbWrite(g_pszServer, &Config); if (dwErr != NO_ERROR) { DisplayError(NULL, dwErr); break; } } while (FALSE);
// Cleanup
{ }
return dwErr; }
DWORD RasAtHandleShow( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwNumArgs = dwArgCount - dwCurrentIndex;
// Check that the number of arguments is correct
//
if (dwNumArgs > 0) { DisplayMessage( g_hModule, HLP_RASAT_SHOW_CONFIG_EX, DMP_RASAT_SHOW_CONFIG); return NO_ERROR; }
return RasAtDisplayConfig(TRUE); }
//
// Cleans up a config control block
//
DWORD RasAtCbCleanup( IN RASAT_CB* pConfig) { if (pConfig) { RutlFree(pConfig); }
return NO_ERROR; }
//
// Creates a default config control block
//
DWORD RasAtCbCreateDefault( OUT RASAT_CB** ppConfig) { RASAT_CB* pConfig = NULL; DWORD dwErr = NO_ERROR;
do { pConfig = (RASAT_CB*) RutlAlloc(sizeof(RASAT_CB), TRUE); if (pConfig == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; }
pConfig->bEnableIn = TRUE; pConfig->bAccess = TRUE;
*ppConfig = pConfig; } while (FALSE);
// Cleanup
{ if (dwErr != NO_ERROR) { RasAtCbCleanup(pConfig); } }
return dwErr; }
//
// Helper function opens the remoteaccess at config registry key
//
DWORD RasAtCbOpenRegKeys( IN LPCWSTR pszServer, OUT HKEY* phKey) { DWORD dwErr = NO_ERROR; WCHAR pszKey[MAX_PATH]; do { // Generate the parameters key name
//
wsprintfW( pszKey, L"%s%s", pszRemoteAccessParamStub, pszAtParams);
// Open the parameters keys
//
dwErr = RegOpenKeyEx( g_pServerInfo->hkMachine, pszKey, 0, KEY_READ | KEY_WRITE, phKey); BREAK_ON_DWERR( dwErr ); } while (FALSE);
return dwErr; }
//
// Functions that manipulate RASAT_CB's
//
DWORD RasAtCbRead( IN LPCWSTR pszServer, OUT RASAT_CB* pConfig) { HKEY hkParams = NULL; DWORD dwErr = NO_ERROR;
do { // Get a handle to the server's registry config
//
dwErr = RasAtCbOpenRegKeys( pszServer, &hkParams); BREAK_ON_DWERR( dwErr ); // Load the params from the registry
//
if (pConfig->dwFlags & RASAT_F_EnableIn) { dwErr = RutlRegReadDword( hkParams, pszEnableIn, &pConfig->bEnableIn); BREAK_ON_DWERR( dwErr ); }
if (pConfig->dwFlags & RASAT_F_Access) { dwErr = RutlRegReadDword( hkParams, pszAtNetworkAccess, &pConfig->bAccess); BREAK_ON_DWERR( dwErr ); }
} while (FALSE);
// Cleanup
{ if (hkParams) { RegCloseKey(hkParams); } }
return dwErr; }
DWORD RasAtCbWrite( IN LPCWSTR pszServer, IN RASAT_CB* pConfig) { HKEY hkParams = NULL; DWORD dwErr = NO_ERROR;
do { // Get a handle to the server's registry config
//
dwErr = RasAtCbOpenRegKeys( pszServer, &hkParams); BREAK_ON_DWERR( dwErr ); // Write out the params to the registry
//
if (pConfig->dwFlags & RASAT_F_EnableIn) { dwErr = RutlRegWriteDword( hkParams, pszEnableIn, pConfig->bEnableIn); BREAK_ON_DWERR( dwErr ); }
if (pConfig->dwFlags & RASAT_F_Access) { dwErr = RutlRegWriteDword( hkParams, pszAtNetworkAccess, pConfig->bAccess); BREAK_ON_DWERR( dwErr ); }
} while (FALSE);
// Cleanup
{ if (hkParams) { RegCloseKey(hkParams); } }
return dwErr; }
|