windows-nt/Source/XPSP1/NT/net/tcpip/apis/iphlpapi/dll/iphlpapi.c

387 lines
8.9 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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 <initguid.h>
#include <ifguid.h>
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