213 lines
6 KiB
C
213 lines
6 KiB
C
/*********************************************************************/
|
||
/** Copyright(c) 1995 Microsoft Corporation. **/
|
||
/*********************************************************************/
|
||
|
||
//***
|
||
//
|
||
// Filename: rasapihd.c
|
||
//
|
||
// Description: Handler for RASAPI32 disconnect events
|
||
//
|
||
// History: May 11,1996 NarenG Created original version.
|
||
//
|
||
#include "ddm.h"
|
||
#include "objects.h"
|
||
#include "handlers.h"
|
||
|
||
//**
|
||
//
|
||
// Call: RasApiCleanUpPort
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description: Will cleanup a locally initiated disconnected port.
|
||
//
|
||
VOID
|
||
RasApiCleanUpPort(
|
||
IN PDEVICE_OBJECT pDeviceObj
|
||
)
|
||
{
|
||
PCONNECTION_OBJECT pConnObj = NULL;
|
||
|
||
//
|
||
// If already cleaned up, then simply return
|
||
//
|
||
|
||
if ( pDeviceObj->hRasConn == NULL )
|
||
{
|
||
return;
|
||
}
|
||
|
||
pConnObj = ConnObjGetPointer(pDeviceObj->hConnection);
|
||
|
||
if( (NULL != pConnObj) &&
|
||
(0 == (pConnObj->fFlags & CONN_OBJ_DISCONNECT_INITIATED)))
|
||
{
|
||
DDM_PRINT( gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
||
"RasApiCleanUpPort: hanging up 0x%x",
|
||
pDeviceObj->hRasConn);
|
||
|
||
RasHangUp( pDeviceObj->hRasConn );
|
||
}
|
||
|
||
ConnObjRemoveLink( pDeviceObj->hConnection, pDeviceObj );
|
||
|
||
DDM_PRINT(gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
||
"RasApiDisconnectHandler:Cleaning up locally initiated connection hPort=%d",
|
||
pDeviceObj->hPort );
|
||
|
||
//
|
||
// Was this the last link in the connection
|
||
//
|
||
|
||
if ( ( pConnObj != NULL ) && ( pConnObj->cActiveDevices == 0 ) )
|
||
{
|
||
if ( pConnObj->hDIMInterface != INVALID_HANDLE_VALUE )
|
||
{
|
||
ROUTER_INTERFACE_OBJECT * pIfObject;
|
||
|
||
EnterCriticalSection( &(gblpInterfaceTable->CriticalSection));
|
||
|
||
pIfObject = IfObjectGetPointer( pConnObj->hDIMInterface );
|
||
|
||
if ( pIfObject != NULL )
|
||
{
|
||
IfObjectDisconnected( pIfObject );
|
||
}
|
||
|
||
LeaveCriticalSection( &(gblpInterfaceTable->CriticalSection));
|
||
}
|
||
|
||
//
|
||
// Remove the Connection Object
|
||
//
|
||
|
||
ConnObjRemoveAndDeAllocate( pDeviceObj->hConnection );
|
||
}
|
||
|
||
//
|
||
// Increase media for this port if we were previously connected.
|
||
//
|
||
|
||
if ( pDeviceObj->fFlags & DEV_OBJ_MARKED_AS_INUSE )
|
||
{
|
||
pDeviceObj->fFlags &= ~DEV_OBJ_MARKED_AS_INUSE;
|
||
|
||
gblDeviceTable.NumDevicesInUse--;
|
||
|
||
//
|
||
// Increase media count for this device
|
||
//
|
||
|
||
if ( pDeviceObj->fFlags & DEV_OBJ_ALLOW_ROUTERS )
|
||
{
|
||
MediaObjAddToTable( pDeviceObj->wchDeviceType );
|
||
}
|
||
|
||
//
|
||
// Possibly need to notify router managers of reachability
|
||
// change
|
||
//
|
||
|
||
EnterCriticalSection( &(gblpInterfaceTable->CriticalSection) );
|
||
|
||
IfObjectNotifyAllOfReachabilityChange(TRUE,INTERFACE_OUT_OF_RESOURCES);
|
||
|
||
LeaveCriticalSection( &(gblpInterfaceTable->CriticalSection) );
|
||
}
|
||
|
||
pDeviceObj->fFlags &= ~DEV_OBJ_OPENED_FOR_DIALOUT;
|
||
pDeviceObj->hConnection = (HCONN)INVALID_HANDLE_VALUE;
|
||
pDeviceObj->wchUserName[0] = (WCHAR)NULL;
|
||
pDeviceObj->wchDomainName[0] = (WCHAR)NULL;
|
||
pDeviceObj->wchCallbackNumber[0] = (WCHAR)NULL;
|
||
pDeviceObj->hRasConn = NULL;
|
||
|
||
//
|
||
// If the service was paused while we were dialed out
|
||
//
|
||
|
||
if ( gblDDMConfigInfo.pServiceStatus->dwCurrentState == SERVICE_PAUSED )
|
||
{
|
||
DeviceObjCloseListening( pDeviceObj, NULL, 0, 0 );
|
||
}
|
||
|
||
RasSetRouterUsage( pDeviceObj->hPort, FALSE );
|
||
|
||
//
|
||
// If we have gotten a PnP remove message, then discard this port
|
||
//
|
||
|
||
if ( pDeviceObj->fFlags & DEV_OBJ_PNP_DELETE )
|
||
{
|
||
//
|
||
// We do this in a worker thread since this thread may be
|
||
// walking the device list, hence we cannot modify it here.
|
||
//
|
||
|
||
RtlQueueWorkItem( DeviceObjRemoveFromTable,
|
||
pDeviceObj->hPort,
|
||
WT_EXECUTEDEFAULT );
|
||
}
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: RasApiDisconnectHandler
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description: Handles a disconnect notification for a port on which a
|
||
// dialout was initiated by the router. We made this a separate
|
||
// handler with a separate event because otherwise we would have
|
||
// problems with race conditions between rasman setting this event
|
||
// and rasapi32 setting this event.
|
||
//
|
||
VOID
|
||
RasApiDisconnectHandler(
|
||
IN DWORD dwEventIndex
|
||
)
|
||
{
|
||
PDEVICE_OBJECT pDeviceObj;
|
||
DWORD dwRetCode = NO_ERROR;
|
||
RASCONNSTATUS RasConnectionStatus;
|
||
DWORD dwBucketIndex = dwEventIndex
|
||
- NUM_DDM_EVENTS
|
||
- (gblDeviceTable.NumDeviceBuckets*2);
|
||
|
||
EnterCriticalSection( &(gblDeviceTable.CriticalSection) );
|
||
|
||
DDM_PRINT(gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
||
"RasApiDisconnectHandler: Entered");
|
||
|
||
for ( pDeviceObj = gblDeviceTable.DeviceBucket[dwBucketIndex];
|
||
pDeviceObj != (DEVICE_OBJECT *)NULL;
|
||
pDeviceObj = pDeviceObj->pNext )
|
||
{
|
||
//
|
||
// If locally initiated, then this event means that the port is now
|
||
// disconnected
|
||
//
|
||
|
||
if ( pDeviceObj->fFlags & DEV_OBJ_OPENED_FOR_DIALOUT )
|
||
{
|
||
ZeroMemory( &RasConnectionStatus, sizeof( RasConnectionStatus ) );
|
||
|
||
RasConnectionStatus.dwSize = sizeof( RasConnectionStatus );
|
||
|
||
dwRetCode = RasGetConnectStatus( pDeviceObj->hRasConn, &RasConnectionStatus );
|
||
|
||
if ( ( dwRetCode != NO_ERROR ) ||
|
||
( ( dwRetCode == NO_ERROR ) &&
|
||
( RasConnectionStatus.rasconnstate == RASCS_Disconnected ) ) )
|
||
{
|
||
RasApiCleanUpPort( pDeviceObj );
|
||
}
|
||
}
|
||
}
|
||
|
||
LeaveCriticalSection( &(gblDeviceTable.CriticalSection) );
|
||
}
|