//============================================================================= // Copyright (c) 2000 Microsoft Corporation // Abstract: // This module implements 6to4 configuration commands. //============================================================================= #include "precomp.h" #pragma hdrstop #define KEY_ENABLE_RESOLUTION L"EnableResolution" #define KEY_ENABLE_ROUTING L"EnableRouting" #define KEY_ENABLE_SITELOCALS L"EnableSiteLocals" #define KEY_RESOLUTION_INTERVAL L"ResolutionInterval" #define KEY_UNDO_ON_STOP L"UndoOnStop" #define KEY_RELAY_NAME L"RelayName" PWCHAR pwszStateString[] = { TOKEN_VALUE_DEFAULT, TOKEN_VALUE_AUTOMATIC, TOKEN_VALUE_ENABLED, TOKEN_VALUE_DISABLED, }; // The guid for this context // GUID g_Ip6to4Guid = IP6TO4_GUID; // The commands supported in this context // CMD_ENTRY g_Ip6to4SetCmdTable[] = { CREATE_CMD_ENTRY(IP6TO4_SET_INTERFACE,Ip6to4HandleSetInterface), CREATE_CMD_ENTRY(IP6TO4_SET_RELAY, Ip6to4HandleSetRelay), CREATE_CMD_ENTRY(IP6TO4_SET_ROUTING, Ip6to4HandleSetRouting), CREATE_CMD_ENTRY(IP6TO4_SET_STATE, Ip6to4HandleSetState), }; CMD_ENTRY g_Ip6to4ShowCmdTable[] = { CREATE_CMD_ENTRY(IP6TO4_SHOW_INTERFACE,Ip6to4HandleShowInterface), CREATE_CMD_ENTRY(IP6TO4_SHOW_RELAY, Ip6to4HandleShowRelay), CREATE_CMD_ENTRY(IP6TO4_SHOW_ROUTING, Ip6to4HandleShowRouting), CREATE_CMD_ENTRY(IP6TO4_SHOW_STATE, Ip6to4HandleShowState), }; CMD_GROUP_ENTRY g_Ip6to4CmdGroups[] = { CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_Ip6to4SetCmdTable), CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_Ip6to4ShowCmdTable), }; ULONG g_ulIp6to4NumGroups = sizeof(g_Ip6to4CmdGroups)/sizeof(CMD_GROUP_ENTRY); CMD_ENTRY g_Ip6to4TopCmds[] = { CREATE_CMD_ENTRY(IP6TO4_RESET, Ip6to4HandleReset), }; ULONG g_ulNumIp6to4TopCmds = sizeof(g_Ip6to4TopCmds)/sizeof(CMD_ENTRY); #if 0 TOKEN_VALUE AdminStates[] = { { VAL_AUTOMATIC, TOKEN_AUTOMATIC }, { VAL_ENABLED, TOKEN_ENABLED }, { VAL_DISABLED, TOKEN_DISABLED }, { VAL_DEFAULT, TOKEN_DEFAULT }, }; #endif BOOL GetString( IN HKEY hKey, IN LPCTSTR lpName, IN PWCHAR pwszBuff, IN ULONG ulLength) { DWORD dwErr, dwType; ULONG ulSize, ulValue; WCHAR buff[NI_MAXHOST]; ulSize = sizeof(ulValue); dwErr = RegQueryValueEx(hKey, lpName, NULL, &dwType, (PBYTE)pwszBuff, &ulLength); if (dwErr != ERROR_SUCCESS) { return FALSE; } if (dwType != REG_SZ) { return FALSE; } return TRUE; } ULONG GetInteger( IN HKEY hKey, IN LPCTSTR lpName, IN ULONG ulDefault) { DWORD dwErr, dwType; ULONG ulSize, ulValue; char buff[20]; ulSize = sizeof(ulValue); dwErr = RegQueryValueEx(hKey, lpName, NULL, &dwType, (PBYTE)&ulValue, &ulSize); if (dwErr != ERROR_SUCCESS) { return ulDefault; } if (dwType != REG_DWORD) { return ulDefault; } return ulValue; } DWORD SetInteger( IN HKEY hKey, IN LPCTSTR lpName, IN ULONG ulValue) { DWORD dwErr; ULONG ulOldValue; ulOldValue = GetInteger(hKey, lpName, VAL_DEFAULT); if (ulValue == ulOldValue) { return NO_ERROR; } if (ulValue == VAL_DEFAULT) { dwErr = RegDeleteValue(hKey, lpName); if (dwErr == ERROR_FILE_NOT_FOUND) { dwErr = NO_ERROR; } } else { dwErr = RegSetValueEx(hKey, lpName, 0, REG_DWORD, (PBYTE)&ulValue, sizeof(ulValue)); } return dwErr; } DWORD SetString( IN HKEY hKey, IN LPCTSTR lpName, IN PWCHAR pwcValue) { DWORD dwErr; if (!pwcValue[0] || !_wcsicmp(pwcValue, TOKEN_VALUE_DEFAULT)) { dwErr = RegDeleteValue(hKey, lpName); if (dwErr == ERROR_FILE_NOT_FOUND) { dwErr = NO_ERROR; } } else { dwErr = RegSetValueEx(hKey, lpName, 0, REG_SZ, (PBYTE)pwcValue, (wcslen(pwcValue)+1) * sizeof(WCHAR)); } return dwErr; } DWORD WINAPI Ip6to4StartHelper( IN CONST GUID *pguidParent, IN DWORD dwVersion) /*++ Routine Description Used to initialize the helper. Arguments pguidParent Ifmon's guid pfnRegisterContext Return Value NO_ERROR other error code --*/ { DWORD dwErr = NO_ERROR; NS_CONTEXT_ATTRIBUTES attMyAttributes; // Initialize // ZeroMemory(&attMyAttributes, sizeof(attMyAttributes)); attMyAttributes.pwszContext = L"6to4"; attMyAttributes.guidHelper = g_Ip6to4Guid; attMyAttributes.dwVersion = IP6TO4_VERSION; attMyAttributes.dwFlags = 0; attMyAttributes.pfnDumpFn = Ip6to4Dump; attMyAttributes.ulNumTopCmds= g_ulNumIp6to4TopCmds; attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_Ip6to4TopCmds; attMyAttributes.ulNumGroups = g_ulIp6to4NumGroups; attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_Ip6to4CmdGroups; dwErr = RegisterContext( &attMyAttributes ); if (dwErr != NO_ERROR) { return dwErr; } // // Register ISATAP context. // return IsatapStartHelper(pguidParent, dwVersion); } DWORD Ip6to4PokeService() { SC_HANDLE hService, hSCManager; BOOL bResult; SERVICE_STATUS ServiceStatus; DWORD dwErr = NO_ERROR; hSCManager = OpenSCManager(NULL, NULL, GENERIC_READ); if (hSCManager == NULL) { return GetLastError(); } do { hService = OpenService(hSCManager, L"6to4", SERVICE_ALL_ACCESS); if (hService == NULL) { dwErr = GetLastError(); break; } // Tell the 6to4 service to re-read its config info if (!ControlService(hService, SERVICE_CONTROL_PARAMCHANGE, &ServiceStatus)) { dwErr = GetLastError(); } CloseServiceHandle(hService); } while (FALSE); CloseServiceHandle(hSCManager); return dwErr; } DWORD Ip6to4StopService() { SC_HANDLE hService, hSCManager; BOOL bResult; SERVICE_STATUS ServiceStatus; DWORD dwErr = NO_ERROR; hSCManager = OpenSCManager(NULL, NULL, GENERIC_READ); if (hSCManager == NULL) { return GetLastError(); } do { hService = OpenService(hSCManager, L"6to4", SERVICE_ALL_ACCESS); if (hService == NULL) { dwErr = GetLastError(); break; } // Tell the 6to4 service to stop if (!ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus)) { dwErr = GetLastError(); } CloseServiceHandle(hService); } while (FALSE); CloseServiceHandle(hSCManager); return dwErr; } DWORD Ip6to4QueryServiceStatus( IN LPSERVICE_STATUS pStatus) { SC_HANDLE hService, hSCManager; BOOL bResult; SERVICE_STATUS ServiceStatus; DWORD dwErr = NO_ERROR; hSCManager = OpenSCManager(NULL, NULL, GENERIC_READ); if (hSCManager == NULL) { return GetLastError(); } do { hService = OpenService(hSCManager, L"6to4", GENERIC_READ); if (hService == NULL) { dwErr = GetLastError(); break; } if (!QueryServiceStatus(hService, pStatus)) { dwErr = GetLastError(); } CloseServiceHandle(hService); } while (FALSE); CloseServiceHandle(hSCManager); return dwErr; } DWORD Ip6to4StartService() { SC_HANDLE hService, hSCManager; BOOL bResult; SERVICE_STATUS ServiceStatus; DWORD dwErr = NO_ERROR; hSCManager = OpenSCManager(NULL, NULL, GENERIC_READ); if (hSCManager == NULL) { return GetLastError(); } do { hService = OpenService(hSCManager, L"6to4", SERVICE_ALL_ACCESS); if (hService == NULL) { dwErr = GetLastError(); break; } // Tell the 6to4 service to start if (!StartService(hService, 0, NULL)) { dwErr = GetLastError(); } CloseServiceHandle(hService); } while (FALSE); CloseServiceHandle(hSCManager); return dwErr; } TOKEN_VALUE rgtvEnums[] = { { TOKEN_VALUE_AUTOMATIC, VAL_AUTOMATIC }, { TOKEN_VALUE_ENABLED, VAL_ENABLED }, { TOKEN_VALUE_DISABLED, VAL_DISABLED }, { TOKEN_VALUE_DEFAULT, VAL_DEFAULT }, }; #define BM_ENABLE_ROUTING 0x01 #define BM_ENABLE_SITELOCALS 0x02 DWORD Ip6to4HandleSetInterface( 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 hInterfaces, hIf; STATE stEnableRouting; DWORD dwBitVector = 0; TAG_TYPE pttTags[] = {{TOKEN_NAME, TRUE, FALSE}, {TOKEN_ROUTING, TRUE, FALSE}}; DWORD rgdwTagType[sizeof(pttTags)/sizeof(TAG_TYPE)]; DWORD dwNumArg; DWORD i; WCHAR wszInterfaceName[MAX_INTERFACE_NAME_LEN + 1] = L"\0"; DWORD dwBufferSize = sizeof(wszInterfaceName); PWCHAR wszIfFriendlyName = NULL; // Parse arguments dwErr = PreprocessCommand(g_hModule, ppwcArguments, dwCurrentIndex, dwArgCount, pttTags, sizeof(pttTags)/sizeof(TAG_TYPE), 2, 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: // NAME dwErr = Connect(); if (dwErr isnot NO_ERROR) { break; } dwErr = GetIfNameFromFriendlyName(ppwcArguments[i + dwCurrentIndex], wszInterfaceName, &dwBufferSize); Disconnect(); if (dwErr isnot NO_ERROR) { DisplayMessage(g_hModule, EMSG_INVALID_INTERFACE, ppwcArguments[i + dwCurrentIndex]); dwErr = ERROR_SUPPRESS_OUTPUT; break; } wszIfFriendlyName = ppwcArguments[i + dwCurrentIndex]; break; case 1: // STATE dwErr = MatchEnumTag(NULL, ppwcArguments[dwCurrentIndex + i], NUM_TOKENS_IN_TABLE(rgtvEnums), rgtvEnums, (PDWORD)&stEnableRouting); if (dwErr isnot NO_ERROR) { dwErr = ERROR_INVALID_PARAMETER; break; } dwBitVector |= BM_ENABLE_ROUTING; break; default: dwErr = ERROR_INVALID_SYNTAX; break; } if (dwErr isnot NO_ERROR) { return dwErr; } } // Now do the sets dwErr = RegCreateKeyEx(HKEY_LOCAL_MACHINE, KEY_INTERFACES, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hInterfaces, NULL); if (dwErr != NO_ERROR) { return dwErr; } dwErr = RegCreateKeyEx(hInterfaces, wszInterfaceName, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hIf, NULL); if (dwErr != NO_ERROR) { RegCloseKey(hInterfaces); return dwErr; } if (dwBitVector & BM_ENABLE_ROUTING) { dwErr = SetInteger(hIf, KEY_ENABLE_ROUTING, stEnableRouting); if (dwErr != NO_ERROR) return dwErr; } RegCloseKey(hIf); RegCloseKey(hInterfaces); Ip6to4PokeService(); return ERROR_OKAY; } DWORD Ip6to4HandleSetRouting( 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 stEnableRouting; STATE stEnableSiteLocals; DWORD dwBitVector = 0; TAG_TYPE pttTags[] = {{TOKEN_ROUTING, FALSE, FALSE}, {TOKEN_SITELOCALS, FALSE, 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: // STATE dwErr = MatchEnumTag(NULL, ppwcArguments[dwCurrentIndex + i], NUM_TOKENS_IN_TABLE(rgtvEnums), rgtvEnums, (PDWORD)&stEnableRouting); if (dwErr isnot NO_ERROR) { dwErr = ERROR_INVALID_PARAMETER; break; } dwBitVector |= BM_ENABLE_ROUTING; break; case 1: // SITELOCALS dwErr = MatchEnumTag(NULL, ppwcArguments[dwCurrentIndex + i], NUM_TOKENS_IN_TABLE(rgtvEnums), rgtvEnums, (PDWORD)&stEnableSiteLocals); if (dwErr isnot NO_ERROR) { dwErr = ERROR_INVALID_PARAMETER; break; } dwBitVector |= BM_ENABLE_SITELOCALS; 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_ROUTING) { dwErr = SetInteger(hGlobal, KEY_ENABLE_ROUTING, stEnableRouting); if (dwErr != NO_ERROR) return dwErr; } if (dwBitVector & BM_ENABLE_SITELOCALS) { dwErr = SetInteger(hGlobal, KEY_ENABLE_SITELOCALS, stEnableSiteLocals); if (dwErr != NO_ERROR) return dwErr; } RegCloseKey(hGlobal); Ip6to4PokeService(); return ERROR_OKAY; } #define BM_ENABLE_RESOLUTION 0x01 #define BM_RELAY_NAME 0x02 #define BM_RESOLUTION_INTERVAL 0x04 DWORD Ip6to4HandleSetRelay( 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 pwszRelayName; DWORD dwBitVector = 0; TAG_TYPE pttTags[] = {{TOKEN_RELAY_NAME, FALSE, FALSE}, {TOKEN_STATE, FALSE, FALSE}, {TOKEN_INTERVAL, FALSE, 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: // RELAYNAME pwszRelayName = ppwcArguments[dwCurrentIndex + i]; dwBitVector |= BM_RELAY_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_RESOLUTION, stEnableResolution); if (dwErr != NO_ERROR) return dwErr; } if (dwBitVector & BM_RELAY_NAME) { dwErr = SetString(hGlobal, KEY_RELAY_NAME, pwszRelayName); if (dwErr != NO_ERROR) return dwErr; } if (dwBitVector & BM_RESOLUTION_INTERVAL) { dwErr = SetInteger(hGlobal, KEY_RESOLUTION_INTERVAL, ulResolutionInterval); if (dwErr != NO_ERROR) return dwErr; } RegCloseKey(hGlobal); Ip6to4PokeService(); return ERROR_OKAY; } #define BM_ENABLE_6TO4 0x01 #define BM_UNDO_ON_STOP 0x02 DWORD Ip6to4HandleSetState( 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 stEnable6to4; STATE stUndoOnStop; DWORD dwBitVector = 0; TAG_TYPE pttTags[] = {{TOKEN_STATE, FALSE, FALSE}, {TOKEN_UNDO_ON_STOP, FALSE, 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: // STATE dwErr = MatchEnumTag(NULL, ppwcArguments[dwCurrentIndex + i], NUM_TOKENS_IN_TABLE(rgtvEnums), rgtvEnums, (PDWORD)&stEnable6to4); if (dwErr isnot NO_ERROR) { dwErr = ERROR_INVALID_PARAMETER; break; } dwBitVector |= BM_ENABLE_6TO4; break; case 1: // UNDOONSTOP dwErr = MatchEnumTag(NULL, ppwcArguments[dwCurrentIndex + i], NUM_TOKENS_IN_TABLE(rgtvEnums), rgtvEnums, (PDWORD)&stUndoOnStop); if (dwErr isnot NO_ERROR) { dwErr = ERROR_INVALID_PARAMETER; break; } dwBitVector |= BM_UNDO_ON_STOP; 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_6TO4) { if (stEnable6to4 == VAL_ENABLED) { dwErr = Ip6to4StartService(); } else if (stEnable6to4 == VAL_DISABLED) { dwErr = Ip6to4StopService(); } } if (dwBitVector & BM_UNDO_ON_STOP) { dwErr = SetInteger(hGlobal, KEY_UNDO_ON_STOP, stUndoOnStop); if (dwErr != NO_ERROR) return dwErr; } RegCloseKey(hGlobal); Ip6to4PokeService(); return ERROR_OKAY; } DWORD ShowInterfaceConfig( IN BOOL bDump) { DWORD dwErr = NO_ERROR; HKEY hInterfaces, hIf; STATE stEnableRouting; int i; WCHAR wszInterfaceName[MAX_INTERFACE_NAME_LEN + 1] = L"\0"; DWORD dwBufferSize; WCHAR wszIfFriendlyName[MAX_INTERFACE_NAME_LEN + 1]; dwErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KEY_INTERFACES, 0, GENERIC_READ, &hInterfaces); if (dwErr != NO_ERROR) { if (!bDump) { DisplayMessage(g_hModule, MSG_IP_NO_ENTRIES); } return ERROR_SUPPRESS_OUTPUT; } dwErr = Connect(); if (dwErr isnot NO_ERROR) { return dwErr; } for (i=0; ; i++) { dwBufferSize = MAX_INTERFACE_NAME_LEN + 1; dwErr = RegEnumKeyEx(hInterfaces, i, wszInterfaceName, &dwBufferSize, 0, NULL, NULL, NULL); if (dwErr != NO_ERROR) { if (dwErr == ERROR_NO_MORE_ITEMS) { dwErr = NO_ERROR; } break; } dwBufferSize = sizeof(wszIfFriendlyName); dwErr = GetFriendlyNameFromIfName(wszInterfaceName, wszIfFriendlyName, &dwBufferSize); if (dwErr != NO_ERROR) { wcscpy(wszIfFriendlyName, wszInterfaceName); } dwErr = RegOpenKeyEx(hInterfaces, wszInterfaceName, 0, GENERIC_READ, &hIf); if (dwErr != NO_ERROR) { break; } stEnableRouting = GetInteger(hIf, KEY_ENABLE_ROUTING, VAL_DEFAULT); if (bDump) { if (stEnableRouting != VAL_DEFAULT) { DisplayMessageT(DMP_IP6TO4_SET_INTERFACE); DisplayMessageT(DMP_QUOTED_STRING_ARG, TOKEN_NAME, wszIfFriendlyName); DisplayMessageT(DMP_STRING_ARG, TOKEN_ROUTING, pwszStateString[stEnableRouting]); DisplayMessage(g_hModule, MSG_NEWLINE); } } else { if (i==0) { DisplayMessage(g_hModule, MSG_INTERFACE_HEADER); } DisplayMessage(g_hModule, MSG_INTERFACE_ROUTING_STATE, pwszStateString[stEnableRouting], wszIfFriendlyName); } } RegCloseKey(hInterfaces); Disconnect(); return dwErr; } DWORD Ip6to4HandleShowInterface( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { return ShowInterfaceConfig(FALSE); } DWORD ShowRoutingConfig( IN BOOL bDump) { DWORD dwErr = NO_ERROR; HKEY hGlobal; STATE stEnableRouting; STATE stEnableSiteLocals; dwErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KEY_GLOBAL, 0, KEY_QUERY_VALUE, &hGlobal); if (dwErr != NO_ERROR) { hGlobal = INVALID_HANDLE_VALUE; dwErr = NO_ERROR; } stEnableRouting = GetInteger(hGlobal, KEY_ENABLE_ROUTING, VAL_DEFAULT); stEnableSiteLocals = GetInteger(hGlobal, KEY_ENABLE_SITELOCALS, VAL_DEFAULT); RegCloseKey(hGlobal); if (bDump) { if ((stEnableRouting != VAL_DEFAULT) || (stEnableSiteLocals != VAL_DEFAULT)) { DisplayMessageT(DMP_IP6TO4_SET_ROUTING); if (stEnableRouting != VAL_DEFAULT) { DisplayMessageT(DMP_STRING_ARG, TOKEN_ROUTING, pwszStateString[stEnableRouting]); } if (stEnableSiteLocals != VAL_DEFAULT) { DisplayMessageT(DMP_STRING_ARG, TOKEN_SITELOCALS, pwszStateString[stEnableSiteLocals]); } DisplayMessage(g_hModule, MSG_NEWLINE); } } else { DisplayMessage(g_hModule, MSG_ROUTING_STATE, pwszStateString[stEnableRouting]); DisplayMessage(g_hModule, MSG_SITELOCALS_STATE, pwszStateString[stEnableSiteLocals]); } return dwErr; } DWORD Ip6to4HandleShowRouting( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { return ShowRoutingConfig(FALSE); } DWORD ShowRelayConfig( IN BOOL bDump) { DWORD dwErr = NO_ERROR; HKEY hGlobal; STATE stEnableResolution; ULONG ulResolutionInterval; WCHAR pwszRelayName[NI_MAXHOST]; BOOL bHaveRelayName; 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_RESOLUTION, VAL_DEFAULT); bHaveRelayName = GetString(hGlobal, KEY_RELAY_NAME, pwszRelayName, NI_MAXHOST); ulResolutionInterval = GetInteger(hGlobal, KEY_RESOLUTION_INTERVAL, 0); RegCloseKey(hGlobal); if (bDump) { if (bHaveRelayName || (stEnableResolution != VAL_DEFAULT) || (ulResolutionInterval > 0)) { DisplayMessageT(DMP_IP6TO4_SET_RELAY); if (bHaveRelayName) { DisplayMessageT(DMP_STRING_ARG, TOKEN_NAME, pwszRelayName); } 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); if (bHaveRelayName) { DisplayMessage(g_hModule, MSG_STRING, pwszRelayName); } 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 Ip6to4HandleShowRelay( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { return ShowRelayConfig(FALSE); } DWORD Ip6to4HandleReset( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { HKEY hGlobal; DWORD dwErr; // Nuke global params dwErr = RegDeleteKey(HKEY_LOCAL_MACHINE, KEY_GLOBAL); if ((dwErr != NO_ERROR) && (dwErr != ERROR_FILE_NOT_FOUND)) { return dwErr; } // Nuke all interface config dwErr = SHDeleteKey(HKEY_LOCAL_MACHINE, KEY_INTERFACES); if ((dwErr != NO_ERROR) && (dwErr != ERROR_FILE_NOT_FOUND)) { return dwErr; } // Start/poke the service Ip6to4PokeService(); return ERROR_OKAY; } DWORD ShowStateConfig( IN BOOL bDump) { DWORD dwErr = NO_ERROR; HKEY hGlobal; STATE stEnable6to4; STATE stUndoOnStop; SERVICE_STATUS ServiceStatus; DWORD dwCurrentState; dwErr = Ip6to4QueryServiceStatus(&ServiceStatus); if (dwErr != NO_ERROR) { return dwErr; } if (ServiceStatus.dwCurrentState == SERVICE_STOPPED) { stEnable6to4 = VAL_DISABLED; } else { stEnable6to4 = VAL_ENABLED; } dwErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KEY_GLOBAL, 0, KEY_QUERY_VALUE, &hGlobal); if (dwErr != NO_ERROR) { hGlobal = INVALID_HANDLE_VALUE; dwErr = NO_ERROR; } stUndoOnStop = GetInteger(hGlobal, KEY_UNDO_ON_STOP, VAL_DEFAULT); RegCloseKey(hGlobal); if (bDump) { if ((stEnable6to4 != VAL_DEFAULT) || (stUndoOnStop != VAL_DEFAULT)) { DisplayMessageT(DMP_IP6TO4_SET_STATE); if (stEnable6to4 != VAL_DEFAULT) { DisplayMessageT(DMP_STRING_ARG, TOKEN_STATE, pwszStateString[stEnable6to4]); } if (stUndoOnStop != VAL_DEFAULT) { DisplayMessageT(DMP_STRING_ARG, TOKEN_UNDO_ON_STOP, pwszStateString[stUndoOnStop]); } DisplayMessage(g_hModule, MSG_NEWLINE); } } else { DisplayMessage(g_hModule, MSG_IP6TO4_STATE, pwszStateString[stEnable6to4]); DisplayMessage(g_hModule, MSG_UNDO_ON_STOP_STATE, pwszStateString[stUndoOnStop]); } return dwErr; } DWORD Ip6to4HandleShowState( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { return ShowStateConfig(FALSE); } DWORD WINAPI Ip6to4Dump( IN LPCWSTR pwszRouter, IN OUT LPWSTR *ppwcArguments, IN DWORD dwArgCount, IN LPCVOID pvData ) /*++ Routine Description Used when dumping all contexts Arguments Return Value NO_ERROR --*/ { DWORD dwErr; HANDLE hFile = (HANDLE)-1; DisplayMessage( g_hModule, DMP_IP6TO4_HEADER ); DisplayMessageT(DMP_IP6TO4_PUSHD); ShowStateConfig(TRUE); ShowRelayConfig(TRUE); ShowRoutingConfig(TRUE); ShowInterfaceConfig(TRUE); DisplayMessageT(DMP_IP6TO4_POPD); DisplayMessage( g_hModule, DMP_IP6TO4_FOOTER ); return NO_ERROR; }