Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

260 lines
7.1 KiB

/********************************************************************/
/** Copyright(c) 1985-1997 Microsoft Corporation. **/
/********************************************************************/
//***
//
// Filename: pnphand.c
//
// Description: Will receive and handle pnp notifications to add/remove devices
//
// History: May 11,1997 NarenG Created original version.
//
#include "ddm.h"
#include "timer.h"
#include "handlers.h"
#include "objects.h"
#include "util.h"
#include "routerif.h"
#include <raserror.h>
#include <rassrvr.h>
#include <rasppp.h>
#include <ddmif.h>
#include <serial.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>
//**
//
// Call: DdmDevicePnpHandler
//
// Returns: NO_ERROR - Success
// Non-zero returns - Failure
//
// Description: Will handle and act upon a device addition or removal.
//
DWORD
DdmDevicePnpHandler(
HANDLE pdwArg
)
{
PNP_EVENT_NOTIF * ppnpEvent = ( PPNP_EVENT_NOTIF )pdwArg;
PPP_MESSAGE PppMessage;
ZeroMemory( &PppMessage, sizeof( PppMessage ) );
PppMessage.dwMsgId = PPPDDMMSG_PnPNotification;
PppMessage.ExtraInfo.DdmPnPNotification.PnPNotification = *ppnpEvent;
SendPppMessageToDDM( &PppMessage );
LocalFree( ppnpEvent );
return( NO_ERROR );
}
//**
//
// Call: ChangeNotificationEventHandler
//
// Returns: NO_ERROR - Success
// Non-zero returns - Failure
//
// Description:
//
VOID
ChangeNotificationEventHandler(
VOID
)
{
DWORD dwRetCode;
BOOL fIpAllowed = FALSE;
DDMTRACE( "ChangeNotificationEventHandler called" );
dwRetCode = LoadDDMParameters( gblDDMConfigInfo.hkeyParameters,
&fIpAllowed );
DeviceObjIterator( DeviceObjForceIpSec, FALSE, NULL );
if ( fIpAllowed && ( !gblDDMConfigInfo.fRasSrvrInitialized ) )
{
DWORD i;
BOOL bCalled = FALSE;
for (i=0; i<gblDDMConfigInfo.NumAdminDlls; i++)
{
PADMIN_DLL_CALLBACKS AdminDllCallbacks = &gblDDMConfigInfo.AdminDllCallbacks[i];
if (AdminDllCallbacks[i].lpfnMprAdminGetIpAddressForUser!=NULL)
{
dwRetCode = RasSrvrInitialize(
AdminDllCallbacks[i].lpfnMprAdminGetIpAddressForUser,
AdminDllCallbacks[i].lpfnMprAdminReleaseIpAddress );
bCalled = TRUE;
break;
}
}
if (!bCalled)
{
dwRetCode = RasSrvrInitialize(NULL, NULL);
}
if ( dwRetCode != NO_ERROR )
{
DDMLogErrorString( ROUTERLOG_CANT_INITIALIZE_IP_SERVER,
0, NULL, dwRetCode, 0 );
}
else
{
gblDDMConfigInfo.fRasSrvrInitialized = TRUE;
}
}
if ( NULL != gblDDMConfigInfo.lpfnRasAuthConfigChangeNotification )
{
gblDDMConfigInfo.lpfnRasAuthConfigChangeNotification(
gblDDMConfigInfo.dwLoggingLevel );
}
if ( NULL != gblDDMConfigInfo.lpfnRasAcctConfigChangeNotification )
{
gblDDMConfigInfo.lpfnRasAcctConfigChangeNotification(
gblDDMConfigInfo.dwLoggingLevel );
}
PppDdmChangeNotification( gblDDMConfigInfo.dwServerFlags,
gblDDMConfigInfo.dwLoggingLevel );
RegNotifyChangeKeyValue( gblDDMConfigInfo.hkeyParameters,
TRUE,
REG_NOTIFY_CHANGE_LAST_SET,
gblSupervisorEvents[DDM_EVENT_CHANGE_NOTIFICATION],
TRUE );
RegNotifyChangeKeyValue( gblDDMConfigInfo.hkeyAccounting,
TRUE,
REG_NOTIFY_CHANGE_LAST_SET,
gblSupervisorEvents[DDM_EVENT_CHANGE_NOTIFICATION1],
TRUE );
RegNotifyChangeKeyValue( gblDDMConfigInfo.hkeyAuthentication,
TRUE,
REG_NOTIFY_CHANGE_LAST_SET,
gblSupervisorEvents[DDM_EVENT_CHANGE_NOTIFICATION2],
TRUE );
}
//**
//
// Call: DDMTransportCreate
//
// Returns: NO_ERROR - Success
// Non-zero returns - Failure
//
// Description:
//
DWORD
DDMTransportCreate(
IN DWORD dwTransportId
)
{
static const TCHAR c_szRegKeyRemoteAccessParams[]
= TEXT("SYSTEM\\CurrentControlSet\\Services\\RemoteAccess\\Parameters");
DWORD dwRetCode = NO_ERROR;
BOOL fEnabled = FALSE;
HKEY hKey = NULL;
DDMTRACE1( "DDMTransportCreate called for Transport Id = %d", dwTransportId );
//
// Find out if this transport is set to allow for dialin clients
//
dwRetCode = RegOpenKey( HKEY_LOCAL_MACHINE, c_szRegKeyRemoteAccessParams, &hKey );
if ( dwRetCode != NO_ERROR )
{
return( dwRetCode );
}
dwRetCode = lProtocolEnabled( hKey, dwTransportId, TRUE, FALSE, &fEnabled );
if ( dwRetCode != NO_ERROR )
{
return( dwRetCode );
}
RegCloseKey( hKey );
//
// Not enabled for dialin so we are done
//
if ( !fEnabled )
{
return( NO_ERROR );
}
if ( ( dwTransportId == PID_IP ) && ( !gblDDMConfigInfo.fRasSrvrInitialized ) )
{
DWORD i;
BOOL bCalled = FALSE;
for (i=0; i<gblDDMConfigInfo.NumAdminDlls; i++)
{
PADMIN_DLL_CALLBACKS AdminDllCallbacks = &gblDDMConfigInfo.AdminDllCallbacks[i];
if (AdminDllCallbacks[i].lpfnMprAdminGetIpAddressForUser!=NULL)
{
dwRetCode = RasSrvrInitialize(
AdminDllCallbacks[i].lpfnMprAdminGetIpAddressForUser,
AdminDllCallbacks[i].lpfnMprAdminReleaseIpAddress );
bCalled = TRUE;
break;
}
}
if (!bCalled)
{
dwRetCode = RasSrvrInitialize(NULL, NULL);
}
if ( dwRetCode != NO_ERROR )
{
DDMLogErrorString( ROUTERLOG_CANT_INITIALIZE_IP_SERVER,
0, NULL, dwRetCode, 0 );
}
else
{
gblDDMConfigInfo.fRasSrvrInitialized = TRUE;
}
}
//
// Insert allowed protocols in the ServerFlags which will be sent to PPP engine
//
switch( dwTransportId )
{
case PID_IP:
gblDDMConfigInfo.dwServerFlags |= PPPCFG_ProjectIp;
break;
case PID_IPX:
gblDDMConfigInfo.dwServerFlags |= PPPCFG_ProjectIpx;
break;
case PID_ATALK:
gblDDMConfigInfo.dwServerFlags |= PPPCFG_ProjectAt;
break;
default:
break;
}
PppDdmChangeNotification( gblDDMConfigInfo.dwServerFlags,
gblDDMConfigInfo.dwLoggingLevel );
return( dwRetCode );
}