Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

366 lines
12 KiB

#include "precomp.h"
#pragma hdrstop
// {0705ECA3-7AAC-11d2-89DC-006008B0E5B9}
const GUID g_MyGuid =
{ 0x705eca3, 0x7aac, 0x11d2, { 0x89, 0xdc, 0x0, 0x60, 0x8, 0xb0, 0xe5, 0xb9 } };
static const GUID g_IpGuid = IPMONTR_GUID;
#define IPPROMON_HELPER_VERSION 1
// shell functions
PNS_REGISTER_HELPER RegisterHelper;
PNS_MATCH_CMD_LINE MatchCmdToken;
PNS_MATCH_TOKEN MatchToken;
PNS_MATCH_ENUM_TAG MatchEnumTag;
PNS_MATCH_TAGS_IN_CMD_LINE MatchTagsInCmdLine;
PNS_MAKE_STRING MakeString;
PNS_FREE_STRING FreeString;
PNS_MAKE_QUOTED_STRING MakeQuotedString;
PNS_FREE_QUOTED_STRING FreeQuotedString;
PNS_DISPLAY_ERR DisplayError;
PNS_DISPLAY_MSG DisplayMessage;
PNS_DISPLAY_MSG_T DisplayMessageT;
PNS_EXECUTE_HANDLER ExecuteHandler;
PNS_INIT_CONSOLE InitializeConsole;
PNS_DISPLAY_MSG_CONSOLE DisplayMessageMib;
PNS_REFRESH_CONSOLE RefreshConsole;
PNS_UPDATE_NEW_CONTEXT UpdateNewContext;
PNS_PREPROCESS_COMMAND PreprocessCommand;
ULONG StartedCommonInitialization, CompletedCommonInitialization ;
HANDLE g_hModule;
MIB_SERVER_HANDLE g_hMibServer;
VOID
CommonNetshInit(
IN PNETSH_ATTRIBUTES pUtilityTable
)
{
//
// common utility functions exported by the shell
//
RegisterHelper = pUtilityTable->pfnRegisterHelper;
MatchCmdToken = pUtilityTable->pfnMatchCmdLine;
MatchToken = pUtilityTable->pfnMatchToken;
MatchEnumTag = pUtilityTable->pfnMatchEnumTag;
MatchTagsInCmdLine = pUtilityTable->pfnMatchTagsInCmdLine;
MakeString = pUtilityTable->pfnMakeString;
FreeString = pUtilityTable->pfnFreeString;
MakeQuotedString = pUtilityTable->pfnMakeQuotedString;
FreeQuotedString = pUtilityTable->pfnFreeQuotedString;
DisplayError = pUtilityTable->pfnDisplayError;
DisplayMessage = pUtilityTable->pfnDisplayMessage;
DisplayMessageT = pUtilityTable->pfnDisplayMessageT;
ExecuteHandler = pUtilityTable->pfnExecuteHandler;
InitializeConsole = pUtilityTable->pfnInitializeConsole;
DisplayMessageMib = pUtilityTable->pfnDisplayMessageToConsole;
RefreshConsole = pUtilityTable->pfnRefreshConsole;
UpdateNewContext = pUtilityTable->pfnUpdateNewContext;
PreprocessCommand = pUtilityTable->pfnPreprocessCommand;
}
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
IppromonStartHelper(
IN CONST GUID *pguidParent,
IN PVOID pfnRegisterContext,
IN DWORD dwVersion
)
{
DWORD dwErr;
PNS_REGISTER_CONTEXT RegisterContext
= (PNS_REGISTER_CONTEXT) pfnRegisterContext;
NS_CONTEXT_ATTRIBUTES attMyAttributes;
// If you add any more contexts, then this should be converted
// to use an array instead of duplicating code!
// Register the IGMP context
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
attMyAttributes.pwszContext = L"igmp";
attMyAttributes.guidHelper = g_MyGuid;
attMyAttributes.dwVersion = 1;
attMyAttributes.dwFlags = 0;
attMyAttributes.pfnDumpFn = IgmpDump;
attMyAttributes.ulNumTopCmds= g_ulNumIgmpTopCmds;
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_IgmpCmds;
attMyAttributes.ulNumGroups = g_ulIgmpNumGroups;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_IgmpCmdGroups;
dwErr = RegisterContext( &attMyAttributes );
// Register the RIP context
attMyAttributes.pwszContext = L"rip";
attMyAttributes.dwVersion = 1;
attMyAttributes.dwFlags = 0;
attMyAttributes.pfnDumpFn = RipDump;
attMyAttributes.ulNumTopCmds= g_ulRipNumTopCmds;
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_RipCmds;
attMyAttributes.ulNumGroups = g_ulRipNumGroups;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_RipCmdGroups;
dwErr = RegisterContext( &attMyAttributes );
// Register the OSPF context
attMyAttributes.pwszContext = L"ospf";
attMyAttributes.dwVersion = 1;
attMyAttributes.dwFlags = 0;
attMyAttributes.pfnDumpFn = OspfDump;
attMyAttributes.ulNumTopCmds= g_ulOspfNumTopCmds;
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_OspfCmds;
attMyAttributes.ulNumGroups = g_ulOspfNumGroups;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_OspfCmdGroups;
dwErr = RegisterContext( &attMyAttributes );
// Register the RouterDiscovery relay context
attMyAttributes.pwszContext = L"routerdiscovery";
attMyAttributes.dwVersion = 1;
attMyAttributes.dwFlags = 0;
attMyAttributes.pfnDumpFn = RdiscDump;
attMyAttributes.ulNumTopCmds= g_RdiscTopCmdCount;
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_RdiscTopCmdTable;
attMyAttributes.ulNumGroups = g_RdiscCmdGroupCount;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_RdiscCmdGroupTable;
dwErr = RegisterContext( &attMyAttributes );
// Register the DHCP relay context
attMyAttributes.pwszContext = L"relay";
attMyAttributes.dwVersion = 1;
attMyAttributes.dwFlags = 0;
attMyAttributes.pfnDumpFn = BootpDump;
attMyAttributes.ulNumTopCmds= g_ulBootpNumTopCmds;
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_BootpTopCmds;
attMyAttributes.ulNumGroups = g_ulBootpNumGroups;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_BootpCmdGroups;
dwErr = RegisterContext( &attMyAttributes );
// Register the Connection sharing contexts
attMyAttributes.pwszContext = L"autodhcp";
attMyAttributes.dwVersion = 1;
attMyAttributes.dwFlags = 0;
attMyAttributes.pfnDumpFn = AutoDhcpDump;
attMyAttributes.ulNumTopCmds= g_AutoDhcpTopCmdCount;
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_AutoDhcpTopCmdTable;
attMyAttributes.ulNumGroups = g_AutoDhcpCmdGroupCount;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_AutoDhcpCmdGroupTable;
dwErr = RegisterContext( &attMyAttributes );
attMyAttributes.pwszContext = L"dnsproxy";
attMyAttributes.dwVersion = 1;
attMyAttributes.dwFlags = 0;
attMyAttributes.pfnDumpFn = DnsProxyDump;
attMyAttributes.ulNumTopCmds= g_DnsProxyTopCmdCount;
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_DnsProxyTopCmdTable;
attMyAttributes.ulNumGroups = g_DnsProxyCmdGroupCount;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_DnsProxyCmdGroupTable;
dwErr = RegisterContext( &attMyAttributes );
attMyAttributes.pwszContext = L"nat";
attMyAttributes.dwVersion = 1;
attMyAttributes.dwFlags = 0;
attMyAttributes.pfnDumpFn = NatDump;
attMyAttributes.ulNumTopCmds= g_NatTopCmdCount;
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_NatTopCmdTable;
attMyAttributes.ulNumGroups = g_NatCmdGroupCount;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_NatCmdGroupTable;
dwErr = RegisterContext( &attMyAttributes );
attMyAttributes.pwszContext = L"qos";
attMyAttributes.dwVersion = 1;
attMyAttributes.dwFlags = 0;
attMyAttributes.pfnDumpFn = QosDump;
attMyAttributes.ulNumTopCmds= g_ulQosNumTopCmds;
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_QosCmds;
attMyAttributes.ulNumGroups = g_ulQosNumGroups;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_QosCmdGroups;
dwErr = RegisterContext( &attMyAttributes );
return dwErr;
}
DWORD WINAPI
InitHelperDll(
IN PNETSH_ATTRIBUTES pUtilityTable,
OUT PNS_DLL_ATTRIBUTES pDllTable
)
{
DWORD dwErr;
NS_HELPER_ATTRIBUTES attMyAttributes;
CommonNetshInit( pUtilityTable );
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 = IPPROMON_HELPER_VERSION;
attMyAttributes.pfnStart = IppromonStartHelper;
attMyAttributes.pfnStop = NULL;
dwErr = RegisterHelper( &g_IpGuid, &attMyAttributes );
return dwErr;
}
BOOL
IsProtocolInstalled(
DWORD dwProtoId,
DWORD dwNameId,
DWORD dwErrorLog
)
/*++
Routine Description:
Finds if the protocol is already installed
Arguments:
dwProtoId - protocol id
pswzName - protocol name
dwErrorLog - TRUE(if not installed display error)
FALSE(if installed display error)
-1 (do not display error log)
Return Value:
TRUE if protocol already installed, else FALSE
--*/
{
PVOID pvStart;
DWORD dwCount, dwBlkSize, dwRes;
WCHAR *pwszName;
dwRes = IpmontrGetInfoBlockFromGlobalInfo(dwProtoId,
(PBYTE *) NULL,
&dwBlkSize,
&dwCount);
if ((dwRes isnot NO_ERROR) && (dwErrorLog == TRUE))
{
pwszName = MakeString( g_hModule, dwNameId);
DisplayError(g_hModule, EMSG_PROTO_NOT_INSTALLED, pwszName);
FreeString(pwszName);
}
else if ((dwRes == NO_ERROR) && (dwErrorLog == FALSE))
{
pwszName = MakeString( g_hModule, dwNameId);
DisplayError(g_hModule, EMSG_PROTO_INSTALLED, pwszName);
FreeString(pwszName);
}
return (dwRes == NO_ERROR) ? TRUE : FALSE;
}
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] );
}