/*++ 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; }