windows-nt/Source/XPSP1/NT/net/tcpip/tpipv6/ipv6mon/isatap.c
2020-09-26 16:20:57 +08:00

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