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