/*++ Copyright (c) 1995 Microsoft Corporation Module Name: net\routing\iphlpapi.c Abstract: This files contains the DLL entry point and some miscellanous functions for IPHLPAPI.DLL Revision History: Amritansh Raghav --*/ #include "inc.h" #pragma hdrstop #include #include HANDLE g_hPrivateHeap; HANDLE g_hTCPDriverGetHandle; HANDLE g_hTCP6DriverGetHandle; HANDLE g_hTCPDriverSetHandle; HANDLE g_hTCP6DriverSetHandle; HANDLE g_hIPDriverHandle; HANDLE g_hIP6DriverHandle; HANDLE g_hIPGetDriverHandle; HANDLE g_hIP6GetDriverHandle; DWORD g_dwTraceHandle; LIST_ENTRY g_pAdapterMappingTable[MAP_HASH_SIZE]; DWORD g_dwLastIfUpdateTime; PDWORD g_pdwArpEntTable; DWORD g_dwNumArpEntEntries; DWORD g_dwLastArpUpdateTime; DWORD g_dwNumIf; BOOL g_bIpConfigured; BOOL g_bIp6Configured; BOOL g_bProcessAttached; HANDLE g_hModule; MIB_SERVER_HANDLE g_hMIBServer; CRITICAL_SECTION g_ifLock; CRITICAL_SECTION g_ipNetLock; CRITICAL_SECTION g_tcpipLock; CRITICAL_SECTION g_stateLock; WSADATA WsaData; #ifndef CHICAGO VOID InitFilterApis(); VOID UnInitFilterApis(); #endif BOOL WINAPI IcmpEntryPoint( HANDLE hDll, DWORD dwReason, LPVOID lpReserved ); BOOL WINAPI DllMain( HINSTANCE hInstDll, DWORD fdwReason, LPVOID pReserved ) { DWORD dwResult; int retcode; UNREFERENCED_PARAMETER( pReserved ); Trace1(ERR,"IpHlpDllEntry %d", fdwReason ); switch (fdwReason) { case DLL_PROCESS_ATTACH: { Trace0(ERR,"IpHlpDllEntry DLL_PROCESS_ATTACH"); g_bProcessAttached = FALSE; // Check platform. if (GetVersion() & 0x80000000) { // CHICAGO #ifndef CHICAGO DEBUG_PRINT(("IpHlpDllEntry: This an NT product.\n")); return FALSE; #endif } else { // NT #ifdef CHICAGO DEBUG_PRINT(("IpHlpDllEntry: This is an CHICAGO product.\n")); return FALSE; #endif } // // we use WsControl amongst other things from wsock32 // #ifdef CHICAGO retcode = WSAStartup(0x0101, &WsaData); if (retcode != 0) { DEBUG_PRINT(("WSAStartup failed %d\n", GetLastError() )); return FALSE; } #endif DisableThreadLibraryCalls(hInstDll); if (!IcmpEntryPoint(hInstDll, fdwReason, pReserved)) { return FALSE; } g_hPrivateHeap = HeapCreate(0, 4*1024, 0); if (g_hPrivateHeap is NULL) { IcmpEntryPoint(hInstDll, DLL_PROCESS_DETACH, pReserved); return FALSE; } InitializeCriticalSection(&g_ifLock); InitializeCriticalSection(&g_ipNetLock); InitializeCriticalSection(&g_tcpipLock); InitializeCriticalSection(&g_stateLock); g_dwLastIfUpdateTime = 0; g_dwLastArpUpdateTime = 0; g_pdwArpEntTable = NULL; g_dwNumArpEntEntries = 0; g_dwNumIf = 0; InitAdapterMappingTable(); g_hMIBServer = NULL; #if API_TRACE g_dwTraceHandle = TraceRegister("IPHLPAPI"); if (g_dwTraceHandle is INVALID_TRACEID) { UnInitAdapterMappingTable(); DeleteCriticalSection(&g_ifLock); DeleteCriticalSection(&g_ipNetLock); DeleteCriticalSection(&g_tcpipLock); DeleteCriticalSection(&g_stateLock); HeapDestroy(g_hPrivateHeap); IcmpEntryPoint(hInstDll, DLL_PROCESS_DETACH, pReserved); return FALSE; } #endif // API_TRACE if (OpenTCPDriver(AF_INET) is NO_ERROR) { g_bIpConfigured = TRUE; if (UpdateAdapterToIFInstanceMapping() isnot NO_ERROR || UpdateAdapterToATInstanceMapping() isnot NO_ERROR) { g_bIpConfigured = FALSE; CloseTCPDriver(); #if API_TRACE TraceDeregister(g_dwTraceHandle); #endif // API_TRACE UnInitAdapterMappingTable(); DeleteCriticalSection(&g_ifLock); DeleteCriticalSection(&g_ipNetLock); DeleteCriticalSection(&g_tcpipLock); DeleteCriticalSection(&g_stateLock); HeapDestroy(g_hPrivateHeap); IcmpEntryPoint(hInstDll, DLL_PROCESS_DETACH, pReserved); return FALSE; } } else { // // we are not running on an IP machine // g_bIpConfigured = FALSE; } #ifndef CHICAGO InitFilterApis(); // // Attach ipcfgdll library // if (g_bIpConfigured) { if (IpcfgdllInit(hInstDll, fdwReason, pReserved) == FALSE) { UnInitFilterApis(); CloseTCPDriver(); #if API_TRACE TraceDeregister(g_dwTraceHandle); #endif // API_TRACE UnInitAdapterMappingTable(); DeleteCriticalSection(&g_ifLock); DeleteCriticalSection(&g_ipNetLock); DeleteCriticalSection(&g_tcpipLock); DeleteCriticalSection(&g_stateLock); HeapDestroy(g_hPrivateHeap); IcmpEntryPoint(hInstDll, DLL_PROCESS_DETACH, pReserved); return FALSE; } } #endif g_hModule = hInstDll; InitNameMappers(); g_bProcessAttached = TRUE; break; } case DLL_PROCESS_DETACH: { Trace0(ERR,"IpHlpDllEntry DLL_PROCESS_DETACH"); if (!g_bProcessAttached) { break; } DeinitNameMappers(); if (g_hPrivateHeap isnot NULL) { HeapDestroy(g_hPrivateHeap); } DeleteCriticalSection(&g_ifLock); DeleteCriticalSection(&g_ipNetLock); DeleteCriticalSection(&g_tcpipLock); DeleteCriticalSection(&g_stateLock); #ifndef CHICAGO if (g_hMIBServer isnot NULL) { MprAdminMIBServerDisconnect(g_hMIBServer); } #endif if (g_bIpConfigured) { CloseTCPDriver(); } if (g_bIp6Configured) { CloseTCP6Driver(); } #ifndef CHICAGO UnInitFilterApis(); // // Detach ipcfgdll library // IpcfgdllInit(hInstDll, fdwReason, pReserved); #endif #if API_TRACE TraceDeregister(g_dwTraceHandle); #endif // API_TRACE g_bProcessAttached = FALSE; if (!IcmpEntryPoint(hInstDll, fdwReason, pReserved)) { return FALSE; } break; } default: { break; } } return TRUE; } #ifndef CHICAGO BOOL IsRouterRunning(VOID) { DWORD dwResult; if(!MprAdminIsServiceRunning(NULL)) { g_hMIBServer = NULL; return FALSE; } if(g_hMIBServer is NULL) { dwResult = MprAdminMIBServerConnect(NULL, &g_hMIBServer); if(dwResult isnot NO_ERROR) { Trace1(ERR, "IsRouterRunning: Error %d connecting to MIB Server\n", dwResult); g_hMIBServer = NULL; return FALSE; } } return TRUE; } BOOL IsRouterSettingRoutes(VOID) { DWORD dwResult, dwOutEntrySize; BOOL bRet; MIB_OPAQUE_QUERY Query; PMIB_OPAQUE_INFO pInfo; PMIB_ROUTESTATE pState; // // This has to be called after calling IsRouterRunning, so g_hMibServer // is already set // if(g_hMIBServer is NULL) { return FALSE; } Query.dwVarId = ROUTE_STATE; dwResult = MprAdminMIBEntryGet(g_hMIBServer, PID_IP, IPRTRMGR_PID, (PVOID)&Query, sizeof(MIB_OPAQUE_QUERY), (PVOID)&pInfo, &dwOutEntrySize); if(dwResult isnot NO_ERROR) { return FALSE; } CAST_MIB_INFO(pInfo, PMIB_ROUTESTATE, pState); bRet = pState->bRoutesSetToStack; MprAdminMIBBufferFree((PVOID)pInfo);; return bRet; } #endif