302 lines
7 KiB
C
302 lines
7 KiB
C
/*++
|
||
|
||
Copyright (c) 1995 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
common.c
|
||
|
||
Abstract:
|
||
|
||
Common initialization functions for IPXPROMN.DLL
|
||
|
||
Author:
|
||
|
||
V Raman 1/5/1998
|
||
|
||
|
||
--*/
|
||
|
||
|
||
#include "precomp.h"
|
||
#pragma hdrstop
|
||
|
||
//
|
||
// GUID for IPXPROMN.DLL
|
||
//
|
||
// {d3fcba3a-a4e9-11d2-b944-00c04fc2ab1c}
|
||
//
|
||
|
||
static const GUID g_MyGuid =
|
||
{
|
||
0xd3fcba3a, 0xa4e9, 0x11d2,
|
||
|
||
{
|
||
0xb9, 0x44, 0x0, 0xc0, 0x4f, 0xc2, 0xab, 0x1c
|
||
}
|
||
};
|
||
|
||
|
||
static const GUID g_IpxGuid = IPXMONTR_GUID;
|
||
|
||
#define IPXPROMON_HELPER_VERSION 1
|
||
|
||
//
|
||
// ipxmon functions
|
||
//
|
||
|
||
PIM_DEL_INFO_BLK_IF DeleteInfoBlockFromInterfaceInfo ;
|
||
PIM_DEL_INFO_BLK_GLOBAL DeleteInfoBlockFromGlobalInfo ;
|
||
PIM_DEL_PROTO DeleteProtocol ;
|
||
PIM_GET_INFO_BLK_GLOBAL GetInfoBlockFromGlobalInfo ;
|
||
PIM_GET_INFO_BLK_IF GetInfoBlockFromInterfaceInfo ;
|
||
PIM_SET_INFO_BLK_GLOBAL SetInfoBlockInGlobalInfo ;
|
||
PIM_SET_INFO_BLK_IF SetInfoBlockInInterfaceInfo ;
|
||
PIM_IF_ENUM InterfaceEnum ;
|
||
PIM_GET_IF_TYPE GetInterfaceType ;
|
||
PIM_PROTO_LIST GetProtocolList ;
|
||
PIM_ROUTER_STATUS IsRouterRunning ;
|
||
PIM_MATCH_ROUT_PROTO MatchRoutingProtoTag ;
|
||
|
||
ULONG StartedCommonInitialization, CompletedCommonInitialization ;
|
||
|
||
HANDLE g_hModule;
|
||
|
||
//
|
||
// Handle to router being administered
|
||
//
|
||
|
||
HANDLE g_hMprConfig;
|
||
HANDLE g_hMprAdmin;
|
||
HANDLE g_hMIBServer;
|
||
|
||
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;
|
||
}
|
||
|
||
BOOL
|
||
IA64VersionCheck
|
||
(
|
||
IN UINT CIMOSType,
|
||
IN UINT CIMOSProductSuite,
|
||
IN LPCWSTR CIMOSVersion,
|
||
IN LPCWSTR CIMOSBuildNumber,
|
||
IN LPCWSTR CIMServicePackMajorVersion,
|
||
IN LPCWSTR CIMServicePackMinorVersion,
|
||
IN UINT CIMProcessorArchitecture,
|
||
IN DWORD dwReserved
|
||
)
|
||
{
|
||
if (CIMProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)// IA64=6 (x86 == 0)
|
||
return TRUE;
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
DWORD
|
||
WINAPI
|
||
IpxpromonStartHelper(
|
||
IN CONST GUID *pguidParent,
|
||
IN DWORD dwVersion
|
||
)
|
||
{
|
||
DWORD dwErr;
|
||
|
||
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 RIP context
|
||
//
|
||
|
||
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
|
||
|
||
attMyAttributes.pwszContext = L"rip";
|
||
attMyAttributes.guidHelper = g_MyGuid;
|
||
attMyAttributes.dwVersion = 1;
|
||
attMyAttributes.dwFlags = 0;
|
||
attMyAttributes.ulNumTopCmds= 0;
|
||
attMyAttributes.pTopCmds = NULL;
|
||
attMyAttributes.ulNumGroups = g_ulIpxRipNumGroups;
|
||
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_IpxRipCmdGroups;
|
||
attMyAttributes.pfnDumpFn = IpxRipDump;
|
||
attMyAttributes.pfnConnectFn= ConnectToRouter;
|
||
attMyAttributes.pfnOsVersionCheck = IA64VersionCheck;
|
||
|
||
dwErr = RegisterContext( &attMyAttributes );
|
||
|
||
//
|
||
// Register the SAP context
|
||
//
|
||
|
||
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
|
||
attMyAttributes.pwszContext = L"sap";
|
||
attMyAttributes.guidHelper = g_MyGuid;
|
||
attMyAttributes.dwVersion = 1;
|
||
attMyAttributes.dwFlags = 0;
|
||
attMyAttributes.ulNumTopCmds= 0;
|
||
attMyAttributes.pTopCmds = NULL;
|
||
attMyAttributes.ulNumGroups = g_ulIpxSapNumGroups;
|
||
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_IpxSapCmdGroups;
|
||
attMyAttributes.pfnDumpFn = IpxSapDump;
|
||
attMyAttributes.pfnConnectFn= ConnectToRouter;
|
||
attMyAttributes.pfnOsVersionCheck = IA64VersionCheck;
|
||
|
||
dwErr = RegisterContext( &attMyAttributes );
|
||
|
||
|
||
//
|
||
// Register the NB context
|
||
//
|
||
|
||
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
|
||
attMyAttributes.pwszContext = L"netbios";
|
||
attMyAttributes.guidHelper = g_MyGuid;
|
||
attMyAttributes.dwVersion = 1;
|
||
attMyAttributes.dwFlags = 0;
|
||
attMyAttributes.ulNumTopCmds= 0;
|
||
attMyAttributes.pTopCmds = NULL;
|
||
attMyAttributes.ulNumGroups = g_ulIpxNbNumGroups;
|
||
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_IpxNbCmdGroups;
|
||
attMyAttributes.pfnDumpFn = IpxNbDump;
|
||
attMyAttributes.pfnConnectFn= ConnectToRouter;
|
||
attMyAttributes.pfnOsVersionCheck = IA64VersionCheck;
|
||
|
||
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 = IPXPROMON_HELPER_VERSION;
|
||
attMyAttributes.pfnStart = IpxpromonStartHelper;
|
||
attMyAttributes.pfnStop = NULL;
|
||
|
||
dwErr = RegisterHelper( &g_IpxGuid, &attMyAttributes );
|
||
|
||
return dwErr;
|
||
}
|
||
|
||
|
||
DWORD WINAPI
|
||
ConnectToRouter(
|
||
IN LPCWSTR pwszRouter
|
||
)
|
||
{
|
||
DWORD dwErr;
|
||
|
||
//
|
||
// Connect to router config if required
|
||
// (when is this ever required)
|
||
//
|
||
|
||
if ( !g_hMprConfig )
|
||
{
|
||
dwErr = MprConfigServerConnect( (LPWSTR)pwszRouter, &g_hMprConfig );
|
||
|
||
if ( dwErr isnot NO_ERROR )
|
||
{
|
||
return ERROR_CONNECT_REMOTE_CONFIG;
|
||
}
|
||
}
|
||
|
||
|
||
//
|
||
// Check to see if router is running. If so, get the handles
|
||
//
|
||
|
||
do
|
||
{
|
||
if ( MprAdminIsServiceRunning( (LPWSTR)pwszRouter ) )
|
||
{
|
||
if ( MprAdminServerConnect( (LPWSTR)pwszRouter, &g_hMprAdmin ) ==
|
||
NO_ERROR )
|
||
{
|
||
if ( MprAdminMIBServerConnect( (LPWSTR)pwszRouter, &g_hMIBServer ) ==
|
||
NO_ERROR )
|
||
{
|
||
// DEBUG("Got server handle");
|
||
break;
|
||
}
|
||
|
||
else
|
||
{
|
||
MprAdminServerDisconnect( g_hMprAdmin );
|
||
}
|
||
}
|
||
}
|
||
|
||
g_hMprAdmin = g_hMIBServer = NULL;
|
||
|
||
} while (FALSE);
|
||
|
||
|
||
return NO_ERROR;
|
||
}
|
||
|