387 lines
8.9 KiB
C
387 lines
8.9 KiB
C
/*++
|
|
|
|
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
|
|
|
|
|