#include "precomp.h" #pragma hdrstop // {8854ff10-d504-11d2-b1ff-00104bc54139} static const GUID g_MyGuid = { 0x8854ff10, 0xd504, 0x11d2, { 0xb1, 0xff, 0x0, 0x10, 0x4b, 0xc5, 0x41, 0x39 } }; static const GUID g_IpGuid = IPMONTR_GUID; #define IPPREVIEW_HELPER_VERSION 1 // shell functions HANDLE g_hModule; MIB_SERVER_HANDLE g_hMibServer; VALUE_STRING CommonBooleanStringArray[] = { TRUE, STRING_ENABLED, FALSE, STRING_DISABLED }; VALUE_TOKEN CommonBooleanTokenArray[] = { TRUE, TOKEN_OPT_VALUE_ENABLE, FALSE, TOKEN_OPT_VALUE_DISABLE }; VALUE_STRING CommonLoggingStringArray[] = { VRRP_LOGGING_NONE, STRING_LOGGING_NONE, VRRP_LOGGING_ERROR, STRING_LOGGING_ERROR, VRRP_LOGGING_WARN, STRING_LOGGING_WARN, VRRP_LOGGING_INFO, STRING_LOGGING_INFO }; VALUE_TOKEN CommonLoggingTokenArray[] = { VRRP_LOGGING_NONE, TOKEN_OPT_VALUE_NONE, VRRP_LOGGING_ERROR, TOKEN_OPT_VALUE_ERROR, VRRP_LOGGING_WARN, TOKEN_OPT_VALUE_WARN, VRRP_LOGGING_INFO, TOKEN_OPT_VALUE_INFO }; BOOL WINAPI DllMain( HINSTANCE hInstDll, DWORD fdwReason, LPVOID pReserved ) { HANDLE hDll; switch (fdwReason) { case DLL_PROCESS_ATTACH: { // printf("Trying to attach\n"); g_hModule = hInstDll; DisableThreadLibraryCalls(hInstDll); break; } case DLL_PROCESS_DETACH: { // // Clean up any structures used for commit // break; } default: { break; } } return TRUE; } DWORD WINAPI IpprvwmonStartHelper( IN CONST GUID *pguidParent, IN DWORD dwVersion ) { DWORD dwErr; IP_CONTEXT_ATTRIBUTES attMyAttributes; ZeroMemory(&attMyAttributes, sizeof(attMyAttributes)); // If you add any more contexts, then this should be converted // to use an array instead of duplicating code! attMyAttributes.pwszContext = L"vrrp"; attMyAttributes.guidHelper = g_MyGuid; attMyAttributes.dwVersion = 1; attMyAttributes.dwFlags = 0; attMyAttributes.pfnDumpFn = VrrpDump; attMyAttributes.ulNumTopCmds= g_VrrpTopCmdCount; attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_VrrpTopCmdTable; attMyAttributes.ulNumGroups = g_VrrpCmdGroupCount; attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_VrrpCmdGroupTable; dwErr = RegisterContext( &attMyAttributes ); attMyAttributes.pwszContext = L"msdp"; attMyAttributes.dwVersion = 1; attMyAttributes.dwFlags = 0; attMyAttributes.pfnDumpFn = MsdpDump; attMyAttributes.ulNumTopCmds= g_MsdpTopCmdCount; attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_MsdpTopCmdTable; attMyAttributes.ulNumGroups = g_MsdpCmdGroupCount; attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_MsdpCmdGroupTable; dwErr = RegisterContext( &attMyAttributes ); return dwErr; } DWORD WINAPI InitHelperDll( IN DWORD dwNetshVersion, OUT PNS_DLL_ATTRIBUTES pDllTable ) { DWORD dwErr; NS_HELPER_ATTRIBUTES attMyAttributes; pDllTable->dwVersion = NETSH_VERSION_50; pDllTable->pfnStopFn = NULL; // Register helpers. We could either register 1 helper which // registers three contexts, or we could register 3 helpers // which each register one context. There's only a difference // if we support sub-helpers, which this DLL does not. // If we later support sub-helpers, then it's better to have // 3 helpers so that sub-helpers can register with 1 of them, // since it registers with a parent helper, not a parent context. // For now, we just use a single 3-context helper for efficiency. ZeroMemory( &attMyAttributes, sizeof(attMyAttributes) ); attMyAttributes.guidHelper = g_MyGuid; attMyAttributes.dwVersion = IPPREVIEW_HELPER_VERSION; attMyAttributes.pfnStart = IpprvwmonStartHelper; attMyAttributes.pfnStop = NULL; dwErr = RegisterHelper( &g_IpGuid, &attMyAttributes ); return dwErr; } BOOL IsProtocolInstalled( DWORD dwProtoId, WCHAR *pwszName ) { PVOID pvStart; DWORD dwCount, dwBlkSize, dwRes; dwRes = IpmontrGetInfoBlockFromGlobalInfo(dwProtoId, (PBYTE *) NULL, &dwBlkSize, &dwCount); if (dwRes isnot NO_ERROR) { DisplayError(g_hModule, EMSG_PROTO_NOT_INSTALLED, pwszName); return FALSE; } return TRUE; } DWORD GetMIBIfIndex( IN PTCHAR *pptcArguments, IN DWORD dwCurrentIndex, OUT PDWORD pdwIndices, OUT PDWORD pdwNumParsed ) /*++ Routine Description: Gets the interface index. Arguments: pptcArguments - Argument array dwCurrentIndex - Index of the first argument in array pdwIndices - Indices specified in command pdwNumParsed - Number of indices in command Return Value: NO_ERROR --*/ { DWORD dwErr = NO_ERROR; *pdwNumParsed = 1; // If index was specified just use it if (iswdigit(pptcArguments[dwCurrentIndex][0])) { pdwIndices[0] = _tcstoul(pptcArguments[dwCurrentIndex],NULL,10); return NO_ERROR; } // Try converting a friendly name to an ifindex return IpmontrGetIfIndexFromFriendlyName( g_hMibServer, pptcArguments[dwCurrentIndex], &pdwIndices[0] ); }