windows-nt/Source/XPSP1/NT/net/rras/netsh/ras/rasnbf.c
2020-09-26 16:20:57 +08:00

617 lines
14 KiB
C

/*
File: rasnbf.h
The 'remoteaccess nbf' sub context
3/2/99
*/
#include "precomp.h"
#include "rasnbf.h"
//
// Local prototypes
//
BOOL
WINAPI
RasNbfCheckVersion(
IN UINT CIMOSType,
IN UINT CIMOSProductSuite,
IN LPCWSTR CIMOSVersion,
IN LPCWSTR CIMOSBuildNumber,
IN LPCWSTR CIMServicePackMajorVersion,
IN LPCWSTR CIMServicePackMinorVersion,
IN UINT CIMProcessorArchitecture,
IN DWORD dwReserved
);
// The guid for this context
//
GUID g_RasNbfGuid = RASNBF_GUID;
static PWCHAR g_pszServer = NULL;
static DWORD g_dwBuild = 0;
// The commands supported in this context
//
CMD_ENTRY g_RasNbfSetCmdTable[] =
{
// Whistler bug 249293, changes for architecture version checking
//
CREATE_CMD_ENTRY(RASNBF_SET_NEGOTIATION,RasNbfHandleSetNegotiation),
CREATE_CMD_ENTRY(RASNBF_SET_ACCESS, RasNbfHandleSetAccess),
};
CMD_ENTRY g_RasNbfShowCmdTable[] =
{
// Whistler bug 249293, changes for architecture version checking
//
CREATE_CMD_ENTRY(RASNBF_SHOW_CONFIG, RasNbfHandleShow),
};
CMD_GROUP_ENTRY g_RasNbfCmdGroups[] =
{
CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_RasNbfSetCmdTable),
CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_RasNbfShowCmdTable),
};
ULONG g_ulRasNbfNumGroups = sizeof(g_RasNbfCmdGroups)/sizeof(CMD_GROUP_ENTRY);
//
// Flags that control how/what info is read/written
// in the RASNBF_CB structure
//
#define RASNBF_F_EnableIn 0x1
#define RASNBF_F_Access 0x2
#define RASNBF_F_All 0xFFFF
//
// Control block for ras nbf configuration
//
typedef struct _RASNBF_CB
{
DWORD dwFlags; // See RASNBF_F_* values
BOOL bEnableIn;
BOOL bAccess;
} RASNBF_CB;
//
// Nbf specific registry parameters
//
WCHAR pszNbfParams[] = L"Nbf";
//
// Prototypes of functions that manipulate the
// RASNBF_CB structures
//
DWORD
RasNbfCbCleanup(
IN RASNBF_CB* pConfig);
DWORD
RasNbfCbCreateDefault(
OUT RASNBF_CB** ppConfig);
DWORD
RasNbfCbOpenRegKeys(
IN LPCWSTR pszServer,
OUT HKEY* phKey);
DWORD
RasNbfCbRead(
IN LPCWSTR pszServer,
OUT RASNBF_CB* pConfig);
DWORD
RasNbfCbWrite(
IN LPCWSTR pszServer,
IN RASNBF_CB* pConfig);
//
// Callback determines if a command is valid on a given architecture
//
BOOL
WINAPI
RasNbfCheckVersion(
IN UINT CIMOSType,
IN UINT CIMOSProductSuite,
IN LPCWSTR CIMOSVersion,
IN LPCWSTR CIMOSBuildNumber,
IN LPCWSTR CIMServicePackMajorVersion,
IN LPCWSTR CIMServicePackMinorVersion,
IN UINT CIMProcessorArchitecture,
IN DWORD dwReserved
)
{
INT iBuild = _wtoi(CIMOSBuildNumber);
// Only available pre-whistler
return ((iBuild != 0) && (iBuild <= 2195));
}
//
// Entry called by rasmontr to register this context
//
DWORD
WINAPI
RasNbfStartHelper(
IN CONST GUID *pguidParent,
IN DWORD dwVersion)
{
DWORD dwErr = NO_ERROR;
NS_CONTEXT_ATTRIBUTES attMyAttributes;
// Initialize
//
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
// Whistler bug 249293, changes for architecture version checking
//
attMyAttributes.pfnOsVersionCheck= RasNbfCheckVersion;
attMyAttributes.pwszContext = L"netbeui";
attMyAttributes.guidHelper = g_RasNbfGuid;
attMyAttributes.dwVersion = RASNBF_VERSION;
attMyAttributes.dwFlags = 0;
attMyAttributes.ulNumTopCmds = 0;
attMyAttributes.pTopCmds = NULL;
attMyAttributes.ulNumGroups = g_ulRasNbfNumGroups;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_RasNbfCmdGroups;
attMyAttributes.pfnDumpFn = RasNbfDump;
dwErr = RegisterContext( &attMyAttributes );
return dwErr;
}
DWORD
RasNbfDisplayConfig(
IN BOOL bReport)
{
DWORD dwErr = NO_ERROR;
RASNBF_CB* pConfig = NULL;
PWCHAR pszEnableIn = NULL, pszAccess = NULL;
do
{
// Get a default config blob
//
dwErr = RasNbfCbCreateDefault(&pConfig);
BREAK_ON_DWERR( dwErr );
// Read in all of the values
//
pConfig->dwFlags = RASNBF_F_All;
dwErr = RasNbfCbRead(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_RASNBF_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_RASNBF_SCRIPTHEADER);
DisplayMessageT(DMP_RASNBF_PUSHD);
DisplayMessage(
g_hModule,
MSG_RASNBF_SET_CMD,
DMP_RASNBF_SET_NEGOTIATION,
pszEnableIn);
DisplayMessage(
g_hModule,
MSG_RASNBF_SET_CMD,
DMP_RASNBF_SET_ACCESS,
pszAccess);
DisplayMessageT(DMP_RASNBF_POPD);
DisplayMessage(
g_hModule,
MSG_RASNBF_SCRIPTFOOTER);
}
} while (FALSE);
// Cleanup
{
if (pConfig)
{
RasNbfCbCleanup(pConfig);
}
if (pszEnableIn)
{
RutlFree(pszEnableIn);
}
if (pszAccess)
{
RutlFree(pszAccess);
}
}
return dwErr;
}
DWORD
WINAPI
RasNbfDump(
IN LPCWSTR pwszRouter,
IN OUT LPWSTR *ppwcArguments,
IN DWORD dwArgCount,
IN LPCVOID pvData
)
{
return RasNbfDisplayConfig(FALSE);
}
DWORD
RasNbfHandleSetAccess(
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;
RASNBF_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 = RASNBF_F_Access;
Config.bAccess = dwValue;
dwErr = RasNbfCbWrite(g_pszServer, &Config);
if (dwErr != NO_ERROR)
{
DisplayError(NULL, dwErr);
break;
}
} while (FALSE);
// Cleanup
{
}
return dwErr;
}
DWORD
RasNbfHandleSetNegotiation(
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;
RASNBF_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 = RASNBF_F_EnableIn;
Config.bEnableIn = dwValue;
dwErr = RasNbfCbWrite(g_pszServer, &Config);
if (dwErr != NO_ERROR)
{
DisplayError(NULL, dwErr);
break;
}
} while (FALSE);
// Cleanup
{
}
return dwErr;
}
DWORD
RasNbfHandleShow(
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_RASNBF_SHOW_CONFIG_EX,
DMP_RASNBF_SHOW_CONFIG);
return NO_ERROR;
}
return RasNbfDisplayConfig(TRUE);
}
//
// Cleans up a config control block
//
DWORD
RasNbfCbCleanup(
IN RASNBF_CB* pConfig)
{
if (pConfig)
{
RutlFree(pConfig);
}
return NO_ERROR;
}
//
// Creates a default config control block
//
DWORD
RasNbfCbCreateDefault(
OUT RASNBF_CB** ppConfig)
{
RASNBF_CB* pConfig = NULL;
DWORD dwErr = NO_ERROR;
do
{
pConfig = (RASNBF_CB*) RutlAlloc(sizeof(RASNBF_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)
{
RasNbfCbCleanup(pConfig);
}
}
return dwErr;
}
//
// Helper function opens the ras nbf config registry key
//
DWORD
RasNbfCbOpenRegKeys(
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,
pszNbfParams);
// Open the parameters keys
//
dwErr = RegOpenKeyEx(
g_pServerInfo->hkMachine,
pszKey,
0,
KEY_READ | KEY_WRITE,
phKey);
BREAK_ON_DWERR( dwErr );
} while (FALSE);
// Cleanup
{
}
return dwErr;
}
//
// Functions that manipulate RASNBF_CB's
//
DWORD
RasNbfCbRead(
IN LPCWSTR pszServer,
OUT RASNBF_CB* pConfig)
{
HKEY hkParams = NULL;
DWORD dwErr = NO_ERROR;
do
{
// Get a handle to the server's registry config
//
dwErr = RasNbfCbOpenRegKeys(
pszServer,
&hkParams);
BREAK_ON_DWERR( dwErr );
// Load the params from the registry
//
if (pConfig->dwFlags & RASNBF_F_EnableIn)
{
dwErr = RutlRegReadDword(
hkParams,
pszEnableIn,
&pConfig->bEnableIn);
BREAK_ON_DWERR( dwErr );
}
if (pConfig->dwFlags & RASNBF_F_Access)
{
dwErr = RutlRegReadDword(
hkParams,
pszAllowNetworkAccess,
&pConfig->bAccess);
BREAK_ON_DWERR( dwErr );
}
} while (FALSE);
// Cleanup
{
if (hkParams)
{
RegCloseKey(hkParams);
}
}
return dwErr;
}
DWORD
RasNbfCbWrite(
IN LPCWSTR pszServer,
IN RASNBF_CB* pConfig)
{
HKEY hkParams = NULL;
DWORD dwErr = NO_ERROR;
do
{
// Get a handle to the server's registry config
//
dwErr = RasNbfCbOpenRegKeys(
pszServer,
&hkParams);
BREAK_ON_DWERR( dwErr );
// Write out the params to the registry
//
if (pConfig->dwFlags & RASNBF_F_EnableIn)
{
dwErr = RutlRegWriteDword(
hkParams,
pszEnableIn,
pConfig->bEnableIn);
BREAK_ON_DWERR( dwErr );
}
if (pConfig->dwFlags & RASNBF_F_Access)
{
dwErr = RutlRegWriteDword(
hkParams,
pszAllowNetworkAccess,
pConfig->bAccess);
BREAK_ON_DWERR( dwErr );
}
} while (FALSE);
// Cleanup
{
if (hkParams)
{
RegCloseKey(hkParams);
}
}
return dwErr;
}