457 lines
11 KiB
C
457 lines
11 KiB
C
/*********************************************************************/
|
||
/** Copyright(c) 1995 Microsoft Corporation. **/
|
||
/*********************************************************************/
|
||
|
||
//***
|
||
//
|
||
// Filename: routerif.c
|
||
//
|
||
// Description: Handles calls to/from the router managers.
|
||
//
|
||
// History: May 11,1995 NarenG Created original version.
|
||
//
|
||
#include "dimsvcp.h"
|
||
|
||
#define DIM_VALNAME_INTERFACE TEXT("InterfaceInfo")
|
||
#define DIM_VALNAME_GLOBALINFO TEXT("GlobalInfo")
|
||
|
||
//**
|
||
//
|
||
// Call: DIMConnectInterface
|
||
//
|
||
// Returns: NO_ERROR - Already connected
|
||
// PENDING - Connection initiated successfully
|
||
// error code - Connection initiation failure
|
||
//
|
||
// Description: Called by a router manager to intiate a connection.
|
||
//
|
||
DWORD
|
||
DIMConnectInterface(
|
||
IN HANDLE hDIMInterface,
|
||
IN DWORD dwProtocolId
|
||
)
|
||
{
|
||
if ( ( gblDIMConfigInfo.ServiceStatus.dwCurrentState != SERVICE_RUNNING )
|
||
||
|
||
( !( gbldwDIMComponentsLoaded & DIM_DDM_LOADED ) ) )
|
||
{
|
||
return( ERROR_DDM_NOT_RUNNING );
|
||
}
|
||
|
||
if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN )
|
||
{
|
||
return( ERROR_DDM_NOT_RUNNING );
|
||
}
|
||
else
|
||
{
|
||
DWORD (*DDMConnectInterface)( HANDLE, DWORD ) =
|
||
(DWORD(*)( HANDLE, DWORD ))GetDDMEntryPoint("DDMConnectInterface");
|
||
|
||
if(NULL == DDMConnectInterface)
|
||
{
|
||
return ERROR_PROC_NOT_FOUND;
|
||
}
|
||
|
||
return( DDMConnectInterface( hDIMInterface, dwProtocolId ) );
|
||
}
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: DIMDisconnectInterface
|
||
//
|
||
// Returns: NO_ERROR - Already disconnected
|
||
// PENDING - Disconnection initiated successfully
|
||
// error code - Disconnection initiation failure
|
||
//
|
||
// Description: Called by a router manager to intiate a disconnection.
|
||
//
|
||
DWORD
|
||
DIMDisconnectInterface(
|
||
IN HANDLE hDIMInterface,
|
||
IN DWORD dwProtocolId
|
||
)
|
||
{
|
||
if ( gblDIMConfigInfo.ServiceStatus.dwCurrentState != SERVICE_RUNNING )
|
||
{
|
||
return( ERROR_DDM_NOT_RUNNING );
|
||
}
|
||
|
||
if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN )
|
||
{
|
||
return( ERROR_DDM_NOT_RUNNING );
|
||
}
|
||
else
|
||
{
|
||
DWORD (*DDMDisconnectInterface)( HANDLE, DWORD ) =
|
||
(DWORD(*)(HANDLE,DWORD ))GetDDMEntryPoint("DDMDisconnectInterface");
|
||
|
||
if(NULL == DDMDisconnectInterface)
|
||
{
|
||
return ERROR_PROC_NOT_FOUND;
|
||
}
|
||
|
||
return( DDMDisconnectInterface( hDIMInterface, dwProtocolId ) );
|
||
}
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: DIMSaveInterfaceInfo
|
||
//
|
||
// Returns: none
|
||
//
|
||
// Description: This call will make DIM store the interface information
|
||
// into the registry.
|
||
//
|
||
DWORD
|
||
DIMSaveInterfaceInfo(
|
||
IN HANDLE hDIMInterface,
|
||
IN DWORD dwProtocolId,
|
||
IN LPVOID pInterfaceInfo,
|
||
IN DWORD cbInterfaceInfoSize
|
||
)
|
||
{
|
||
HKEY hKey = NULL;
|
||
DWORD dwRetCode = NO_ERROR;
|
||
ROUTER_INTERFACE_OBJECT * pIfObject = NULL;
|
||
|
||
if ((gblDIMConfigInfo.ServiceStatus.dwCurrentState==SERVICE_STOP_PENDING)
|
||
||
|
||
(gblDIMConfigInfo.ServiceStatus.dwCurrentState==SERVICE_STOPPED) )
|
||
{
|
||
return( ERROR_DDM_NOT_RUNNING );
|
||
}
|
||
|
||
EnterCriticalSection( &(gblInterfaceTable.CriticalSection) );
|
||
|
||
do
|
||
{
|
||
if ( ( pIfObject = IfObjectGetPointer( hDIMInterface ) ) == NULL )
|
||
{
|
||
dwRetCode = ERROR_INVALID_HANDLE;
|
||
break;
|
||
}
|
||
|
||
dwRetCode = RegOpenAppropriateKey( pIfObject->lpwsInterfaceName,
|
||
dwProtocolId,
|
||
&hKey);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
break;
|
||
}
|
||
|
||
dwRetCode = RegSetValueEx(
|
||
hKey,
|
||
DIM_VALNAME_INTERFACE,
|
||
0,
|
||
REG_BINARY,
|
||
pInterfaceInfo,
|
||
cbInterfaceInfoSize );
|
||
|
||
} while( FALSE );
|
||
|
||
LeaveCriticalSection( &(gblInterfaceTable.CriticalSection) );
|
||
|
||
if ( hKey != NULL )
|
||
{
|
||
RegCloseKey( hKey );
|
||
}
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: DIMRestoreInterfaceInfo
|
||
//
|
||
// Returns: none
|
||
//
|
||
// Description: This will make DIM get interface information from the registry
|
||
//
|
||
DWORD
|
||
DIMRestoreInterfaceInfo(
|
||
IN HANDLE hDIMInterface,
|
||
IN DWORD dwProtocolId,
|
||
IN LPVOID lpInterfaceInfo,
|
||
IN LPDWORD lpcbInterfaceInfoSize
|
||
)
|
||
{
|
||
DWORD dwType;
|
||
HKEY hKey = NULL;
|
||
DWORD dwRetCode = NO_ERROR;
|
||
ROUTER_INTERFACE_OBJECT * pIfObject = NULL;
|
||
|
||
if ((gblDIMConfigInfo.ServiceStatus.dwCurrentState==SERVICE_STOP_PENDING)
|
||
||
|
||
(gblDIMConfigInfo.ServiceStatus.dwCurrentState==SERVICE_STOPPED) )
|
||
{
|
||
return( ERROR_DDM_NOT_RUNNING );
|
||
}
|
||
|
||
EnterCriticalSection( &(gblInterfaceTable.CriticalSection) );
|
||
|
||
do
|
||
{
|
||
if ( ( pIfObject = IfObjectGetPointer( hDIMInterface ) ) == NULL )
|
||
{
|
||
dwRetCode = ERROR_INVALID_HANDLE;
|
||
|
||
break;
|
||
}
|
||
|
||
dwRetCode = RegOpenAppropriateKey( pIfObject->lpwsInterfaceName,
|
||
dwProtocolId,
|
||
&hKey);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
break;
|
||
}
|
||
|
||
dwRetCode = RegQueryValueEx(
|
||
hKey,
|
||
DIM_VALNAME_INTERFACE,
|
||
0,
|
||
&dwType,
|
||
lpInterfaceInfo,
|
||
lpcbInterfaceInfoSize );
|
||
|
||
|
||
} while( FALSE );
|
||
|
||
LeaveCriticalSection( &(gblInterfaceTable.CriticalSection) );
|
||
|
||
if ( hKey != NULL )
|
||
{
|
||
RegCloseKey( hKey );
|
||
}
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
return( dwRetCode );
|
||
}
|
||
else if ( lpInterfaceInfo == NULL )
|
||
{
|
||
return( ERROR_BUFFER_TOO_SMALL );
|
||
}
|
||
else
|
||
{
|
||
return( NO_ERROR );
|
||
}
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: DIMSaveGlobalInfo
|
||
//
|
||
// Returns: none
|
||
//
|
||
// Description: This call will make DIM store the Global information
|
||
// into the registry.
|
||
//
|
||
DWORD
|
||
DIMSaveGlobalInfo(
|
||
IN DWORD dwProtocolId,
|
||
IN LPVOID pGlobalInfo,
|
||
IN DWORD cbGlobalInfoSize
|
||
)
|
||
{
|
||
HKEY hKey = NULL;
|
||
DWORD dwRetCode = NO_ERROR;
|
||
|
||
if ((gblDIMConfigInfo.ServiceStatus.dwCurrentState==SERVICE_STOP_PENDING)
|
||
||
|
||
(gblDIMConfigInfo.ServiceStatus.dwCurrentState==SERVICE_STOPPED) )
|
||
{
|
||
return( ERROR_DDM_NOT_RUNNING );
|
||
}
|
||
|
||
do
|
||
{
|
||
dwRetCode = RegOpenAppropriateRMKey(dwProtocolId, &hKey);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
break;
|
||
}
|
||
|
||
dwRetCode = RegSetValueEx(
|
||
hKey,
|
||
DIM_VALNAME_GLOBALINFO,
|
||
0,
|
||
REG_BINARY,
|
||
pGlobalInfo,
|
||
cbGlobalInfoSize );
|
||
|
||
} while( FALSE );
|
||
|
||
if ( hKey != NULL )
|
||
{
|
||
RegCloseKey( hKey );
|
||
}
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: DIMRouterStopped
|
||
//
|
||
// Returns: None
|
||
//
|
||
// Description: If the Router failed to start or stopped due to an error,
|
||
// This call should be called with the dwError value set to
|
||
// something other than NO_ERROR
|
||
//
|
||
VOID
|
||
DIMRouterStopped(
|
||
IN DWORD dwProtocolId,
|
||
IN DWORD dwError
|
||
)
|
||
{
|
||
DWORD dwTransportIndex = GetTransportIndex(dwProtocolId);
|
||
|
||
RTASSERT( dwTransportIndex != (DWORD)-1 );
|
||
|
||
gblRouterManagers[dwTransportIndex].fIsRunning = FALSE;
|
||
|
||
TracePrintfExA( gblDIMConfigInfo.dwTraceId, DIM_TRACE_FLAGS,
|
||
"DIMRouterStopped called by protocol 0x%x", dwProtocolId );
|
||
|
||
SetEvent( gblhEventRMState );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: DimUnloadRouterManagers
|
||
//
|
||
// Returns: none
|
||
//
|
||
// Description: Will block until all the router managers have unloaded
|
||
//
|
||
VOID
|
||
DimUnloadRouterManagers(
|
||
VOID
|
||
)
|
||
{
|
||
DWORD dwIndex;
|
||
DWORD dwRetCode;
|
||
BOOL fAllRouterManagersStopped;
|
||
|
||
if ( gblRouterManagers == NULL )
|
||
{
|
||
return;
|
||
}
|
||
|
||
for ( dwIndex = 0;
|
||
dwIndex < gblDIMConfigInfo.dwNumRouterManagers;
|
||
dwIndex++ )
|
||
{
|
||
if ( gblRouterManagers[dwIndex].fIsRunning )
|
||
{
|
||
dwRetCode = gblRouterManagers[dwIndex].DdmRouterIf.StopRouter();
|
||
|
||
if ( ( dwRetCode != NO_ERROR ) && ( dwRetCode != PENDING ) )
|
||
{
|
||
gblRouterManagers[dwIndex].fIsRunning = FALSE;
|
||
}
|
||
}
|
||
}
|
||
|
||
do
|
||
{
|
||
fAllRouterManagersStopped = TRUE;
|
||
|
||
for ( dwIndex = 0;
|
||
dwIndex < gblDIMConfigInfo.dwNumRouterManagers;
|
||
dwIndex++ )
|
||
{
|
||
if ( gblRouterManagers[dwIndex].fIsRunning == TRUE )
|
||
{
|
||
fAllRouterManagersStopped = FALSE;
|
||
}
|
||
}
|
||
|
||
if ( fAllRouterManagersStopped )
|
||
{
|
||
TracePrintfExA(gblDIMConfigInfo.dwTraceId, DIM_TRACE_FLAGS,
|
||
"DimUnloadRouterManagers: fAllRouterManagersStopped");
|
||
|
||
break;
|
||
}
|
||
|
||
WaitForSingleObject( gblhEventRMState, INFINITE );
|
||
|
||
}while(TRUE);
|
||
|
||
for ( dwIndex = 0;
|
||
dwIndex < gblDIMConfigInfo.dwNumRouterManagers;
|
||
dwIndex++ )
|
||
{
|
||
if ( gblRouterManagers[dwIndex].hModule != NULL )
|
||
{
|
||
FreeLibrary( gblRouterManagers[dwIndex].hModule );
|
||
}
|
||
}
|
||
|
||
LOCAL_FREE( gblRouterManagers );
|
||
|
||
gblRouterManagers = NULL;
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: DIMInterfaceEnabled
|
||
//
|
||
// Returns: none
|
||
//
|
||
// Description: This will set the state of a certain transport for the interface
|
||
//
|
||
DWORD
|
||
DIMInterfaceEnabled(
|
||
IN HANDLE hDIMInterface,
|
||
IN DWORD dwProtocolId,
|
||
IN BOOL fEnabled
|
||
)
|
||
{
|
||
DWORD dwRetCode = NO_ERROR;
|
||
ROUTER_INTERFACE_OBJECT* pIfObject = NULL;
|
||
DWORD dwTransportIndex = GetTransportIndex(dwProtocolId);
|
||
|
||
if ((gblDIMConfigInfo.ServiceStatus.dwCurrentState==SERVICE_STOP_PENDING)
|
||
||
|
||
(gblDIMConfigInfo.ServiceStatus.dwCurrentState==SERVICE_STOPPED) )
|
||
{
|
||
return( ERROR_DDM_NOT_RUNNING );
|
||
}
|
||
|
||
RTASSERT( dwTransportIndex != (DWORD)-1 );
|
||
|
||
EnterCriticalSection( &(gblInterfaceTable.CriticalSection) );
|
||
|
||
do
|
||
{
|
||
if ( ( pIfObject = IfObjectGetPointer( hDIMInterface ) ) == NULL )
|
||
{
|
||
dwRetCode = ERROR_INVALID_HANDLE;
|
||
break;
|
||
}
|
||
|
||
if ( fEnabled )
|
||
{
|
||
pIfObject->Transport[dwTransportIndex].fState|=RITRANSPORT_ENABLED;
|
||
}
|
||
else
|
||
{
|
||
pIfObject->Transport[dwTransportIndex].fState&=~RITRANSPORT_ENABLED;
|
||
}
|
||
|
||
} while( FALSE );
|
||
|
||
LeaveCriticalSection( &(gblInterfaceTable.CriticalSection) );
|
||
|
||
return( dwRetCode );
|
||
}
|