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

221 lines
5.5 KiB
C

#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] );
}