316 lines
8.6 KiB
C
316 lines
8.6 KiB
C
//=============================================================================
|
|
// Copyright (c) 2002 Microsoft Corporation
|
|
// Abstract:
|
|
// This module implements ISATAP configuration commands.
|
|
//=============================================================================
|
|
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#define KEY_ENABLE_ISATAP_RESOLUTION L"EnableIsatapResolution"
|
|
#define KEY_ISATAP_RESOLUTION_INTERVAL L"IsatapResolutionInterval"
|
|
#define KEY_ISATAP_ROUTER_NAME L"IsatapRouterName"
|
|
|
|
// The commands supported in this context
|
|
//
|
|
|
|
CMD_ENTRY g_IsatapSetCmdTable[] =
|
|
{
|
|
CREATE_UNDOCUMENTED_CMD_ENTRY(ISATAP_SET_ROUTER, IsatapHandleSetRouter),
|
|
};
|
|
|
|
CMD_ENTRY g_IsatapShowCmdTable[] =
|
|
{
|
|
CREATE_UNDOCUMENTED_CMD_ENTRY(ISATAP_SHOW_ROUTER, IsatapHandleShowRouter),
|
|
};
|
|
|
|
|
|
CMD_GROUP_ENTRY g_IsatapCmdGroups[] =
|
|
{
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_IsatapSetCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_IsatapShowCmdTable),
|
|
};
|
|
|
|
ULONG g_ulIsatapNumGroups = sizeof(g_IsatapCmdGroups)/sizeof(CMD_GROUP_ENTRY);
|
|
|
|
DWORD
|
|
WINAPI
|
|
IsatapStartHelper(
|
|
IN CONST GUID *pguidParent,
|
|
IN DWORD dwVersion
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Used to initialize the helper.
|
|
|
|
Arguments
|
|
|
|
pguidParent IPv6's guid
|
|
pfnRegisterContext
|
|
|
|
Return Value
|
|
|
|
NO_ERROR
|
|
other error code
|
|
--*/
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
|
|
NS_CONTEXT_ATTRIBUTES attMyAttributes;
|
|
|
|
|
|
// Initialize attributes. We reuse the same GUID as 6to4 since both
|
|
// are leaf contexts.
|
|
//
|
|
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
|
|
|
|
attMyAttributes.pwszContext = L"isatap";
|
|
attMyAttributes.guidHelper = g_Ip6to4Guid;
|
|
attMyAttributes.dwVersion = IP6TO4_VERSION;
|
|
attMyAttributes.dwFlags = 0;
|
|
attMyAttributes.pfnDumpFn = IsatapDump;
|
|
attMyAttributes.ulNumTopCmds= 0;
|
|
attMyAttributes.pTopCmds = NULL;
|
|
attMyAttributes.ulNumGroups = g_ulIsatapNumGroups;
|
|
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_IsatapCmdGroups;
|
|
|
|
dwErr = RegisterContext( &attMyAttributes );
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
#define BM_ENABLE_RESOLUTION 0x01
|
|
#define BM_ROUTER_NAME 0x02
|
|
#define BM_RESOLUTION_INTERVAL 0x04
|
|
|
|
DWORD
|
|
IsatapHandleSetRouter(
|
|
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;
|
|
HKEY hGlobal;
|
|
STATE stEnableResolution;
|
|
ULONG ulResolutionInterval;
|
|
PWCHAR pwszRouterName;
|
|
DWORD dwBitVector = 0;
|
|
TAG_TYPE pttTags[] = {{TOKEN_NAME, NS_REQ_ZERO, FALSE},
|
|
{TOKEN_STATE, NS_REQ_ZERO, FALSE},
|
|
{TOKEN_INTERVAL, NS_REQ_ZERO, FALSE}};
|
|
DWORD rgdwTagType[sizeof(pttTags)/sizeof(TAG_TYPE)];
|
|
DWORD dwNumArg;
|
|
DWORD i;
|
|
|
|
// Parse arguments
|
|
|
|
dwErr = PreprocessCommand(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
sizeof(pttTags)/sizeof(TAG_TYPE),
|
|
1,
|
|
sizeof(pttTags)/sizeof(TAG_TYPE),
|
|
rgdwTagType );
|
|
if (dwErr isnot NO_ERROR) {
|
|
return dwErr;
|
|
}
|
|
|
|
for (i=0; i<dwArgCount-dwCurrentIndex; i++) {
|
|
switch(rgdwTagType[i]) {
|
|
case 0: // ROUTERNAME
|
|
pwszRouterName = ppwcArguments[dwCurrentIndex + i];
|
|
dwBitVector |= BM_ROUTER_NAME;
|
|
break;
|
|
|
|
case 1: // STATE
|
|
dwErr = MatchEnumTag(NULL,
|
|
ppwcArguments[dwCurrentIndex + i],
|
|
NUM_TOKENS_IN_TABLE(rgtvEnums),
|
|
rgtvEnums,
|
|
(PDWORD)&stEnableResolution);
|
|
if (dwErr isnot NO_ERROR) {
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
dwBitVector |= BM_ENABLE_RESOLUTION;
|
|
break;
|
|
|
|
case 2: // INTERVAL
|
|
ulResolutionInterval = wcstoul(ppwcArguments[dwCurrentIndex + i],
|
|
NULL, 10);
|
|
dwBitVector |= BM_RESOLUTION_INTERVAL;
|
|
break;
|
|
|
|
default:
|
|
dwErr = ERROR_INVALID_SYNTAX;
|
|
break;
|
|
}
|
|
|
|
if (dwErr isnot NO_ERROR) {
|
|
return dwErr;
|
|
}
|
|
}
|
|
|
|
// Now do the sets
|
|
|
|
dwErr = RegCreateKeyEx(HKEY_LOCAL_MACHINE, KEY_GLOBAL, 0,
|
|
NULL, 0, KEY_ALL_ACCESS, NULL, &hGlobal, NULL);
|
|
|
|
if (dwErr != NO_ERROR) {
|
|
return dwErr;
|
|
}
|
|
|
|
if (dwBitVector & BM_ENABLE_RESOLUTION) {
|
|
dwErr = SetInteger(hGlobal, KEY_ENABLE_ISATAP_RESOLUTION,
|
|
stEnableResolution);
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
}
|
|
|
|
if (dwBitVector & BM_ROUTER_NAME) {
|
|
dwErr = SetString(hGlobal, KEY_ISATAP_ROUTER_NAME, pwszRouterName);
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
}
|
|
|
|
if (dwBitVector & BM_RESOLUTION_INTERVAL) {
|
|
dwErr = SetInteger(hGlobal, KEY_ISATAP_RESOLUTION_INTERVAL,
|
|
ulResolutionInterval);
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
}
|
|
|
|
RegCloseKey(hGlobal);
|
|
|
|
Ip6to4PokeService();
|
|
|
|
return ERROR_OKAY;
|
|
}
|
|
|
|
DWORD
|
|
ShowRouterConfig(
|
|
IN BOOL bDump
|
|
)
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
HKEY hGlobal;
|
|
STATE stEnableResolution;
|
|
ULONG ulResolutionInterval;
|
|
WCHAR pwszRouterName[NI_MAXHOST];
|
|
BOOL bHaveRouterName;
|
|
|
|
dwErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KEY_GLOBAL, 0, KEY_QUERY_VALUE,
|
|
&hGlobal);
|
|
|
|
if (dwErr != NO_ERROR) {
|
|
hGlobal = INVALID_HANDLE_VALUE;
|
|
dwErr = NO_ERROR;
|
|
}
|
|
|
|
stEnableResolution = GetInteger(hGlobal,
|
|
KEY_ENABLE_ISATAP_RESOLUTION,
|
|
VAL_DEFAULT);
|
|
|
|
bHaveRouterName = GetString(hGlobal, KEY_ISATAP_ROUTER_NAME, pwszRouterName,
|
|
NI_MAXHOST);
|
|
|
|
ulResolutionInterval = GetInteger(hGlobal,
|
|
KEY_ISATAP_RESOLUTION_INTERVAL,
|
|
0);
|
|
|
|
RegCloseKey(hGlobal);
|
|
|
|
if (bDump) {
|
|
if (bHaveRouterName || (stEnableResolution != VAL_DEFAULT)
|
|
|| (ulResolutionInterval > 0)) {
|
|
|
|
DisplayMessageT(DMP_ISATAP_SET_ROUTER);
|
|
|
|
if (bHaveRouterName) {
|
|
DisplayMessageT(DMP_STRING_ARG, TOKEN_NAME, pwszRouterName);
|
|
}
|
|
|
|
if (stEnableResolution != VAL_DEFAULT) {
|
|
DisplayMessageT(DMP_STRING_ARG,
|
|
TOKEN_STATE,
|
|
pwszStateString[stEnableResolution]);
|
|
}
|
|
|
|
if (ulResolutionInterval > 0) {
|
|
DisplayMessageT(DMP_INTEGER_ARG, TOKEN_INTERVAL,
|
|
ulResolutionInterval);
|
|
}
|
|
|
|
DisplayMessage(g_hModule, MSG_NEWLINE);
|
|
}
|
|
|
|
} else {
|
|
DisplayMessage(g_hModule, MSG_RELAY_NAME);
|
|
// DisplayMessage(g_hModule, MSG_ROUTER_NAME);
|
|
|
|
if (bHaveRouterName) {
|
|
DisplayMessage(g_hModule, MSG_STRING, pwszRouterName);
|
|
} else {
|
|
DisplayMessage(g_hModule, MSG_STRING, TOKEN_VALUE_DEFAULT);
|
|
}
|
|
|
|
DisplayMessage(g_hModule, MSG_RESOLUTION_STATE,
|
|
pwszStateString[stEnableResolution]);
|
|
|
|
DisplayMessage(g_hModule, MSG_RESOLUTION_INTERVAL);
|
|
|
|
if (ulResolutionInterval) {
|
|
DisplayMessage(g_hModule, MSG_MINUTES, ulResolutionInterval);
|
|
} else {
|
|
DisplayMessage(g_hModule, MSG_STRING, TOKEN_VALUE_DEFAULT);
|
|
}
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
DWORD
|
|
IsatapHandleShowRouter(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
return ShowRouterConfig(FALSE);
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
IsatapDump(
|
|
IN LPCWSTR pwszRouter,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwArgCount,
|
|
IN LPCVOID pvData
|
|
)
|
|
{
|
|
// DisplayMessage(g_hModule, DMP_ISATAP_HEADER);
|
|
DisplayMessageT(DMP_ISATAP_PUSHD);
|
|
|
|
ShowRouterConfig(TRUE);
|
|
|
|
DisplayMessageT(DMP_ISATAP_POPD);
|
|
// DisplayMessage(g_hModule, DMP_ISATAP_FOOTER);
|
|
|
|
return NO_ERROR;
|
|
}
|