windows-nt/Source/XPSP1/NT/net/rras/ras/ddm/registry.c

1708 lines
48 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*******************************************************************/
/* Copyright(c) 1992 Microsoft Corporation */
/*******************************************************************/
//***
//
// Filename: registry.c
//
// Description: This module contains the code for DDM parameters
// initialization and loading from the registry.
//
// Author: Stefan Solomon (stefans) May 18, 1992.
//
//***
#include "ddm.h"
#include <string.h>
#include <stdlib.h>
#include <ddmparms.h>
#include <rasauth.h>
#include <util.h>
typedef struct _DDM_REGISTRY_PARAMS
{
LPWSTR pszValueName;
DWORD * pValue;
DWORD dwDefValue;
DWORD Min;
DWORD Max;
} DDM_REGISTRY_PARAMS, *PDDM_REGISTRY_PARAMS;
//
// DDM parameter descriptor table
//
DDM_REGISTRY_PARAMS DDMRegParams[] =
{
// authenticateretries
DDM_VALNAME_AUTHENTICATERETRIES,
&gblDDMConfigInfo.dwAuthenticateRetries,
DEF_AUTHENTICATERETRIES,
MIN_AUTHENTICATERETRIES,
MAX_AUTHENTICATERETRIES,
// authenticatetime
DDM_VALNAME_AUTHENTICATETIME,
&gblDDMConfigInfo.dwAuthenticateTime,
DEF_AUTHENTICATETIME,
MIN_AUTHENTICATETIME,
MAX_AUTHENTICATETIME,
// callbacktime
DDM_VALNAME_CALLBACKTIME,
&gblDDMConfigInfo.dwCallbackTime,
DEF_CALLBACKTIME,
MIN_CALLBACKTIME,
MAX_CALLBACKTIME,
// Autodisconnect Time
DDM_VALNAME_AUTODISCONNECTTIME,
&gblDDMConfigInfo.dwAutoDisconnectTime,
DEF_AUTODISCONNECTTIME,
MIN_AUTODISCONNECTTIME,
MAX_AUTODISCONNECTTIME,
// Clients per process
DDM_VALNAME_CLIENTSPERPROC,
&gblDDMConfigInfo.dwClientsPerProc,
DEF_CLIENTSPERPROC,
MIN_CLIENTSPERPROC,
MAX_CLIENTSPERPROC,
// Time for 3rd party security DLL to complete
DDM_VALNAME_SECURITYTIME,
&gblDDMConfigInfo.dwSecurityTime,
DEF_SECURITYTIME,
MIN_SECURITYTIME,
MAX_SECURITYTIME,
// Logging level
DDM_VALNAME_LOGGING_LEVEL,
&gblDDMConfigInfo.dwLoggingLevel,
DEF_LOGGINGLEVEL,
MIN_LOGGINGLEVEL,
MAX_LOGGINGLEVEL,
// Number of callback retries
DDM_VALNAME_NUM_CALLBACK_RETRIES,
&gblDDMConfigInfo.dwCallbackRetries,
DEF_NUMCALLBACKRETRIES,
MIN_NUMCALLBACKRETRIES,
MAX_NUMCALLBACKRETRIES,
DDM_VALNAME_SERVERFLAGS,
&gblDDMConfigInfo.dwServerFlags,
DEF_SERVERFLAGS,
0,
0xFFFFFFFF,
// End
NULL, NULL, 0, 0, 0
};
//***
//
// Function: GetKeyMax
//
// Descr: returns the nr of values in this key and the maximum
// size of the value data.
//
//***
DWORD
GetKeyMax(
IN HKEY hKey,
OUT LPDWORD MaxValNameSize_ptr, // longest valuename
OUT LPDWORD NumValues_ptr, // nr of values
OUT LPDWORD MaxValueDataSize_ptr // max size of data
)
{
DWORD NumSubKeys;
DWORD MaxSubKeySize;
DWORD dwRetCode;
dwRetCode = RegQueryInfoKey( hKey, NULL, NULL, NULL, &NumSubKeys,
&MaxSubKeySize, NULL, NumValues_ptr,
MaxValNameSize_ptr, MaxValueDataSize_ptr,
NULL, NULL );
(*MaxValNameSize_ptr)++;
return( dwRetCode );
}
//***
//
// Function: LoadDDMParameters
//
// Descr: Opens the registry, reads and sets specified supervisor
// parameters. If fatal error reading parameters writes the
// error log.
//
// Returns: NO_ERROR - success
// else - fatal error.
//
//***
DWORD
LoadDDMParameters(
IN HKEY hkeyParameters,
OUT BOOL* pfIpAllowed
)
{
DWORD dwIndex;
DWORD dwRetCode;
DWORD cbValueBuf;
DWORD dwType;
DWORD fIpxAllowed;
//
// Initialize Global values
//
gblDDMConfigInfo.fRemoteListen = TRUE;
gblDDMConfigInfo.dwAnnouncePresenceTimer = ANNOUNCE_PRESENCE_TIMEOUT;
//
// Let us not allow any protocol if DdmFindBoundProtocols fails.
//
gblDDMConfigInfo.dwServerFlags &=
~( PPPCFG_ProjectNbf |
PPPCFG_ProjectIp |
PPPCFG_ProjectIpx |
PPPCFG_ProjectAt );
dwRetCode = DdmFindBoundProtocols( pfIpAllowed,
&fIpxAllowed,
&gblDDMConfigInfo.fArapAllowed );
if ( dwRetCode != NO_ERROR )
{
return( dwRetCode );
}
if ( !*pfIpAllowed && !fIpxAllowed && !gblDDMConfigInfo.fArapAllowed )
{
DDMLogError( ROUTERLOG_NO_PROTOCOLS_CONFIGURED, 0, NULL, 0 );
return( dwRetCode );
}
//
// Run through and get all the DDM values
//
for ( dwIndex = 0; DDMRegParams[dwIndex].pszValueName != NULL; dwIndex++ )
{
cbValueBuf = sizeof( DWORD );
dwRetCode = RegQueryValueEx(
hkeyParameters,
DDMRegParams[dwIndex].pszValueName,
NULL,
&dwType,
(LPBYTE)(DDMRegParams[dwIndex].pValue),
&cbValueBuf
);
if ((dwRetCode != NO_ERROR) && (dwRetCode != ERROR_FILE_NOT_FOUND))
{
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
if ( dwRetCode == ERROR_FILE_NOT_FOUND )
{
*(DDMRegParams[dwIndex].pValue) = DDMRegParams[dwIndex].dwDefValue;
dwRetCode = NO_ERROR;
}
else
{
if ( ( dwType != REG_DWORD )
||(*(DDMRegParams[dwIndex].pValue) > DDMRegParams[dwIndex].Max)
||( *(DDMRegParams[dwIndex].pValue)<DDMRegParams[dwIndex].Min))
{
WCHAR * pChar = DDMRegParams[dwIndex].pszValueName;
DDMLogWarning( ROUTERLOG_REGVALUE_OVERIDDEN,1,&pChar);
*(DDMRegParams[dwIndex].pValue) =
DDMRegParams[dwIndex].dwDefValue;
}
}
}
if ( dwRetCode != NO_ERROR )
{
return( dwRetCode );
}
else
{
//
// Insert allowed protocols in the ServerFlags which will be sent to
// PPP engine
//
if ( *pfIpAllowed )
{
gblDDMConfigInfo.dwServerFlags |= PPPCFG_ProjectIp;
}
if ( fIpxAllowed )
{
gblDDMConfigInfo.dwServerFlags |= PPPCFG_ProjectIpx;
}
if ( gblDDMConfigInfo.fArapAllowed )
{
gblDDMConfigInfo.dwServerFlags |= PPPCFG_ProjectAt;
}
if ( gblDDMConfigInfo.dwServerFlags & PPPCFG_RequireStrongEncryption )
{
ModifyDefPolicyToForceEncryption( TRUE );
}
else if ( gblDDMConfigInfo.dwServerFlags & PPPCFG_RequireEncryption )
{
ModifyDefPolicyToForceEncryption( FALSE );
}
gblDDMConfigInfo.dwServerFlags &= ~PPPCFG_RequireStrongEncryption;
gblDDMConfigInfo.dwServerFlags &= ~PPPCFG_RequireEncryption;
}
return( NO_ERROR );
}
//***
//
// Function: LoadSecurityModule
//
// Descr: Opens the registry, reads and sets specified supervisor
// parameters for the secuirity module. If fatal error reading
// parameters writes the error log.
//
// Returns: NO_ERROR - success
// otherwise - fatal error.
//
//***
DWORD
LoadSecurityModule(
VOID
)
{
HKEY hKey;
DWORD dwRetCode = NO_ERROR;
DWORD MaxValueDataSize;
DWORD MaxValNameSize;
DWORD NumValues;
DWORD dwType;
WCHAR * pDllPath = NULL;
WCHAR * pDllExpandedPath = NULL;
DWORD cbSize;
//
// get handle to the RAS key
//
dwRetCode = RegOpenKey( HKEY_LOCAL_MACHINE, DDM_SEC_KEY_PATH, &hKey);
if ( dwRetCode == ERROR_FILE_NOT_FOUND )
{
return( NO_ERROR );
}
else if ( dwRetCode != NO_ERROR )
{
DDMLogErrorString( ROUTERLOG_CANT_OPEN_SECMODULE_KEY, 0,
NULL, dwRetCode, 0);
return ( dwRetCode );
}
do
{
//
// get the length of the path.
//
if (( dwRetCode = GetKeyMax( hKey,
&MaxValNameSize,
&NumValues,
&MaxValueDataSize)))
{
DDMLogError(ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode);
break;
}
if ((pDllPath = LOCAL_ALLOC(LPTR,MaxValueDataSize+sizeof(WCHAR)))==NULL)
{
dwRetCode = GetLastError();
DDMLogError( ROUTERLOG_NOT_ENOUGH_MEMORY, 0, NULL, dwRetCode);
break;
}
//
// Read in the path
//
dwRetCode = RegQueryValueEx(
hKey,
DDM_VALNAME_DLLPATH,
NULL,
&dwType,
(LPBYTE)pDllPath,
&MaxValueDataSize );
if ( dwRetCode != NO_ERROR )
{
DDMLogError(ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode);
break;
}
if ( ( dwType != REG_EXPAND_SZ ) && ( dwType != REG_SZ ) )
{
dwRetCode = ERROR_REGISTRY_CORRUPT;
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
//
// Replace the %SystemRoot% with the actual path.
//
cbSize = ExpandEnvironmentStrings( pDllPath, NULL, 0 );
if ( cbSize == 0 )
{
dwRetCode = GetLastError();
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
pDllExpandedPath = (LPWSTR)LOCAL_ALLOC( LPTR, cbSize*sizeof(WCHAR) );
if ( pDllExpandedPath == (LPWSTR)NULL )
{
dwRetCode = GetLastError();
DDMLogError( ROUTERLOG_NOT_ENOUGH_MEMORY, 0, NULL, dwRetCode );
break;
}
cbSize = ExpandEnvironmentStrings(
pDllPath,
pDllExpandedPath,
cbSize );
if ( cbSize == 0 )
{
dwRetCode = GetLastError();
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
gblDDMConfigInfo.hInstSecurityModule = LoadLibrary( pDllExpandedPath );
if ( gblDDMConfigInfo.hInstSecurityModule == (HINSTANCE)NULL )
{
dwRetCode = GetLastError();
DDMLogErrorString(ROUTERLOG_CANT_LOAD_SECDLL, 0, NULL, dwRetCode,0);
break;
}
gblDDMConfigInfo.lpfnRasBeginSecurityDialog =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstSecurityModule,
"RasSecurityDialogBegin" );
if ( gblDDMConfigInfo.lpfnRasBeginSecurityDialog == NULL )
{
dwRetCode = GetLastError();
DDMLogErrorString(ROUTERLOG_CANT_LOAD_SECDLL,0,NULL,dwRetCode,0);
break;
}
gblDDMConfigInfo.lpfnRasEndSecurityDialog =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstSecurityModule,
"RasSecurityDialogEnd" );
if ( gblDDMConfigInfo.lpfnRasEndSecurityDialog == NULL )
{
dwRetCode = GetLastError();
DDMLogErrorString(ROUTERLOG_CANT_LOAD_SECDLL,0,NULL,dwRetCode,0);
break;
}
}while(FALSE);
if ( pDllPath != NULL )
{
LOCAL_FREE( pDllPath );
}
if ( pDllExpandedPath != NULL )
{
LOCAL_FREE( pDllExpandedPath );
}
RegCloseKey( hKey );
return( dwRetCode );
}
//***
//
// Function: LoadAdminModule
//
// Descr: Opens the registry, reads and sets specified supervisor
// parameters for the admin module. If fatal error reading
// parameters writes the error log.
//
// Returns: NO_ERROR - success
// otherwise - fatal error.
//
//***
DWORD
LoadAdminModule(
VOID
)
{
DWORD RetCode = NO_ERROR;
DWORD MaxValueDataSize;
DWORD MaxValNameSize;
DWORD NumValues;
DWORD dwType;
WCHAR * pDllPath = NULL;
WCHAR * pDllExpandedPath = NULL;
DWORD cbSize;
HKEY hKey;
DWORD (*lpfnRasAdminInitializeDll)();
// get handle to the RAS key
RetCode = RegOpenKey( HKEY_LOCAL_MACHINE, DDM_ADMIN_KEY_PATH, &hKey);
if ( RetCode == ERROR_FILE_NOT_FOUND )
{
return( NO_ERROR );
}
else if ( RetCode != NO_ERROR )
{
DDMLogErrorString(ROUTERLOG_CANT_OPEN_ADMINMODULE_KEY,0,NULL,RetCode,0);
return ( RetCode );
}
do {
// get the length of the path.
if (( RetCode = GetKeyMax(hKey,
&MaxValNameSize,
&NumValues,
&MaxValueDataSize)))
{
DDMLogError(ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, RetCode);
break;
}
if (( pDllPath = LOCAL_ALLOC(LPTR,MaxValueDataSize+sizeof(WCHAR)))
== NULL)
{
DDMLogError(ROUTERLOG_NOT_ENOUGH_MEMORY, 0, NULL, 0);
break;
}
//
// Read in the path
//
RetCode = RegQueryValueEx( hKey,
DDM_VALNAME_DLLPATH,
NULL,
&dwType,
(LPBYTE)pDllPath,
&MaxValueDataSize );
if ( RetCode != NO_ERROR )
{
DDMLogError(ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, RetCode);
break;
}
if ( ( dwType != REG_EXPAND_SZ ) && ( dwType != REG_SZ ) )
{
RetCode = ERROR_REGISTRY_CORRUPT;
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, RetCode );
break;
}
//
// Replace the %SystemRoot% with the actual path.
//
cbSize = ExpandEnvironmentStrings( pDllPath, NULL, 0 );
if ( cbSize == 0 )
{
RetCode = GetLastError();
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, RetCode );
break;
}
pDllExpandedPath = (LPWSTR)LOCAL_ALLOC( LPTR, cbSize*sizeof(WCHAR) );
if ( pDllExpandedPath == (LPWSTR)NULL )
{
RetCode = GetLastError();
DDMLogError( ROUTERLOG_NOT_ENOUGH_MEMORY, 0, NULL, RetCode );
break;
}
cbSize = ExpandEnvironmentStrings(
pDllPath,
pDllExpandedPath,
cbSize );
if ( cbSize == 0 )
{
RetCode = GetLastError();
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, RetCode );
break;
}
gblDDMConfigInfo.hInstAdminModule = LoadLibrary( pDllExpandedPath );
if ( gblDDMConfigInfo.hInstAdminModule == (HINSTANCE)NULL )
{
RetCode = GetLastError();
DDMLogErrorString(ROUTERLOG_CANT_LOAD_ADMINDLL,0,NULL,RetCode,0);
break;
}
lpfnRasAdminInitializeDll = (DWORD(*)(VOID))GetProcAddress(
gblDDMConfigInfo.hInstAdminModule,
"MprAdminInitializeDll" );
if ( lpfnRasAdminInitializeDll != NULL )
{
RetCode = (*lpfnRasAdminInitializeDll)();
if(ERROR_SUCCESS != RetCode)
{
DDMLogErrorString(ROUTERLOG_CANT_LOAD_ADMINDLL,
0,NULL,RetCode,0);
break;
}
}
gblDDMConfigInfo.lpfnRasAdminTerminateDll =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstAdminModule,
"MprAdminTerminateDll" );
gblDDMConfigInfo.lpfnRasAdminAcceptNewConnection =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstAdminModule,
"MprAdminAcceptNewConnection" );
gblDDMConfigInfo.lpfnRasAdminAcceptNewConnection2 =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstAdminModule,
"MprAdminAcceptNewConnection2" );
//
// At least one of these 2 must be available
//
if ( ( gblDDMConfigInfo.lpfnRasAdminAcceptNewConnection == NULL ) &&
( gblDDMConfigInfo.lpfnRasAdminAcceptNewConnection2 == NULL ) )
{
RetCode = GetLastError();
DDMLogErrorString(ROUTERLOG_CANT_LOAD_ADMINDLL,0,NULL,RetCode,0);
break;
}
gblDDMConfigInfo.lpfnRasAdminAcceptNewLink =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstAdminModule,
"MprAdminAcceptNewLink" );
if ( gblDDMConfigInfo.lpfnRasAdminAcceptNewLink == NULL )
{
RetCode = GetLastError();
DDMLogErrorString(ROUTERLOG_CANT_LOAD_ADMINDLL,0,NULL,RetCode,0);
break;
}
gblDDMConfigInfo.lpfnRasAdminConnectionHangupNotification =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstAdminModule,
"MprAdminConnectionHangupNotification" );
gblDDMConfigInfo.lpfnRasAdminConnectionHangupNotification2 =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstAdminModule,
"MprAdminConnectionHangupNotification2" );
//
// At least one of these 2 entrypoints must be available
//
if ( (gblDDMConfigInfo.lpfnRasAdminConnectionHangupNotification==NULL)
&&
(gblDDMConfigInfo.lpfnRasAdminConnectionHangupNotification2==NULL))
{
RetCode = GetLastError();
DDMLogErrorString(ROUTERLOG_CANT_LOAD_ADMINDLL,0,NULL,RetCode,0);
break;
}
gblDDMConfigInfo.lpfnRasAdminLinkHangupNotification =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstAdminModule,
"MprAdminLinkHangupNotification" );
if ( gblDDMConfigInfo.lpfnRasAdminLinkHangupNotification == NULL )
{
RetCode = GetLastError();
DDMLogErrorString(ROUTERLOG_CANT_LOAD_ADMINDLL,0,NULL,RetCode,0);
break;
}
gblDDMConfigInfo.lpfnMprAdminGetIpAddressForUser =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstAdminModule,
"MprAdminGetIpAddressForUser" );
if ( gblDDMConfigInfo.lpfnMprAdminGetIpAddressForUser == NULL )
{
RetCode = GetLastError();
DDMLogErrorString(ROUTERLOG_CANT_LOAD_ADMINDLL,0,NULL,RetCode,0);
break;
}
gblDDMConfigInfo.lpfnMprAdminReleaseIpAddress =
(PVOID)GetProcAddress(
gblDDMConfigInfo.hInstAdminModule,
"MprAdminReleaseIpAddress" );
if ( gblDDMConfigInfo.lpfnMprAdminReleaseIpAddress == NULL )
{
RetCode = GetLastError();
DDMLogErrorString(ROUTERLOG_CANT_LOAD_ADMINDLL,0,NULL,RetCode,0);
break;
}
}while(FALSE);
if ( pDllPath != NULL )
{
LOCAL_FREE( pDllPath );
}
if ( pDllExpandedPath != NULL )
{
LOCAL_FREE( pDllExpandedPath );
}
RegCloseKey( hKey );
return( RetCode );
}
//**
//
// Call: LoadAndInitAuthOrAcctProvider
//
// Returns: NO_ERROR - Success
// Non-zero returns - Failure
//
// Description:
//
DWORD
LoadAndInitAuthOrAcctProvider(
IN BOOL fAuthenticationProvider,
IN DWORD dwNASIpAddress,
OUT DWORD * lpdwStartAccountingSessionId,
OUT LPVOID * plpfnRasAuthProviderAuthenticateUser,
OUT LPVOID * plpfnRasAuthProviderFreeAttributes,
OUT LPVOID * plpfnRasAuthConfigChangeNotification,
OUT LPVOID * plpfnRasAcctProviderStartAccounting,
OUT LPVOID * plpfnRasAcctProviderInterimAccounting,
OUT LPVOID * plpfnRasAcctProviderStopAccounting,
OUT LPVOID * plpfnRasAcctProviderFreeAttributes,
OUT LPVOID * plpfnRasAcctConfigChangeNotification
)
{
HKEY hKeyProviders = NULL;
HKEY hKeyCurrentProvider = NULL;
LPWSTR pDllPath = (LPWSTR)NULL;
LPWSTR pDllExpandedPath = (LPWSTR)NULL;
LPWSTR pProviderName = (LPWSTR)NULL;
HINSTANCE hinstProviderModule = NULL;
DWORD dwRetCode;
WCHAR chSubKeyName[100];
DWORD cbSubKeyName;
DWORD dwNumSubKeys;
DWORD dwMaxSubKeySize;
DWORD dwNumValues;
DWORD cbMaxValNameLen;
DWORD cbMaxValueDataSize;
DWORD cbSize;
DWORD dwType;
CHAR chComputerName[MAX_COMPUTERNAME_LENGTH + 1];
RAS_AUTH_ATTRIBUTE ServerAttributes[2];
CHAR szAcctSessionId[20];
do
{
dwRetCode = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
fAuthenticationProvider
? RAS_AUTHPROVIDER_REGISTRY_LOCATION
: RAS_ACCTPROVIDER_REGISTRY_LOCATION,
0,
KEY_READ,
&hKeyProviders );
if ( dwRetCode != NO_ERROR )
{
LPWSTR lpStr = fAuthenticationProvider
? RAS_AUTHPROVIDER_REGISTRY_LOCATION
: RAS_ACCTPROVIDER_REGISTRY_LOCATION;
DDMLogError( ROUTERLOG_CANT_OPEN_REGKEY, 1, &lpStr, dwRetCode );
break;
}
//
// Find out the size of the provider value
//
dwRetCode = RegQueryInfoKey(
hKeyProviders,
NULL,
NULL,
NULL,
&dwNumSubKeys,
&dwMaxSubKeySize,
NULL,
&dwNumValues,
&cbMaxValNameLen,
&cbMaxValueDataSize,
NULL,
NULL
);
if ( dwRetCode != NO_ERROR )
{
DDMLogError(ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
//
// One extra for the NULL terminator
//
cbMaxValueDataSize += sizeof(WCHAR);
pProviderName = (LPWSTR)LOCAL_ALLOC( LPTR, cbMaxValueDataSize );
if ( pProviderName == NULL )
{
dwRetCode = GetLastError();
break;
}
//
// Find out the provider to use
//
dwRetCode = RegQueryValueEx(
hKeyProviders,
RAS_VALNAME_ACTIVEPROVIDER,
NULL,
&dwType,
(BYTE*)pProviderName,
&cbMaxValueDataSize
);
if ( dwRetCode != NO_ERROR )
{
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
if ( dwType != REG_SZ )
{
dwRetCode = ERROR_REGISTRY_CORRUPT;
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
if ( wcslen( pProviderName ) == 0 )
{
dwRetCode = fAuthenticationProvider
? ERROR_REGISTRY_CORRUPT : NO_ERROR;
break;
}
else
{
if ( !fAuthenticationProvider )
{
HKEY hKeyAccounting;
dwRetCode = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
RAS_KEYPATH_ACCOUNTING,
0,
KEY_READ,
&hKeyAccounting );
if ( dwRetCode == NO_ERROR )
{
cbMaxValueDataSize = sizeof( DWORD );
dwRetCode =
RegQueryValueEx(
hKeyAccounting,
RAS_VALNAME_ACCTSESSIONID,
NULL,
&dwType,
(BYTE*)lpdwStartAccountingSessionId,
&cbMaxValueDataSize );
if ( ( dwRetCode != NO_ERROR ) || ( dwType != REG_DWORD ) )
{
*lpdwStartAccountingSessionId = 0;
}
RegCloseKey( hKeyAccounting );
}
if ( wcscmp( pProviderName,
TEXT("{1AA7F840-C7F5-11D0-A376-00C04FC9DA04}") )
== 0 )
{
gblDDMConfigInfo.fFlags |= DDM_USING_RADIUS_ACCOUNTING;
}
}
else
{
if ( wcscmp( pProviderName,
TEXT("{1AA7F83F-C7F5-11D0-A376-00C04FC9DA04}") )
== 0 )
{
gblDDMConfigInfo.fFlags |= DDM_USING_RADIUS_AUTHENTICATION;
}
else if ( wcscmp(
pProviderName,
TEXT("{1AA7F841-C7F5-11D0-A376-00C04FC9DA04}") )
== 0 )
{
gblDDMConfigInfo.fFlags |= DDM_USING_NT_AUTHENTICATION;
}
}
}
dwRetCode = RegOpenKeyEx(
hKeyProviders,
pProviderName,
0,
KEY_READ,
&hKeyCurrentProvider );
if ( dwRetCode != NO_ERROR )
{
LPWSTR lpStr = RAS_ACCTPROVIDER_REGISTRY_LOCATION;
DDMLogError( ROUTERLOG_CANT_OPEN_REGKEY, 1, &lpStr, dwRetCode );
break;
}
//
// Find out the size of the path value.
//
dwRetCode = RegQueryInfoKey(
hKeyCurrentProvider,
NULL,
NULL,
NULL,
&dwNumSubKeys,
&dwMaxSubKeySize,
NULL,
&dwNumValues,
&cbMaxValNameLen,
&cbMaxValueDataSize,
NULL,
NULL
);
if ( dwRetCode != NO_ERROR )
{
DDMLogError(ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
//
// Allocate space for path and add one for NULL terminator
//
cbMaxValueDataSize += sizeof(WCHAR);
pDllPath = (LPWSTR)LOCAL_ALLOC( LPTR, cbMaxValueDataSize );
if ( pDllPath == (LPWSTR)NULL )
{
dwRetCode = GetLastError();
DDMLogError( ROUTERLOG_NOT_ENOUGH_MEMORY, 0, NULL, dwRetCode);
break;
}
//
// Read in the path
//
dwRetCode = RegQueryValueEx(
hKeyCurrentProvider,
RAS_PROVIDER_VALUENAME_PATH,
NULL,
&dwType,
(PBYTE)pDllPath,
&cbMaxValueDataSize
);
if ( dwRetCode != NO_ERROR )
{
DDMLogError(ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
if ( ( dwType != REG_EXPAND_SZ ) && ( dwType != REG_SZ ) )
{
dwRetCode = ERROR_REGISTRY_CORRUPT;
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
//
// Replace the %SystemRoot% with the actual path.
//
cbSize = ExpandEnvironmentStrings( pDllPath, NULL, 0 );
if ( cbSize == 0 )
{
dwRetCode = GetLastError();
DDMLogError( ROUTERLOG_CANT_GET_REGKEYVALUES, 0, NULL, dwRetCode );
break;
}
cbSize *= sizeof( WCHAR );
pDllExpandedPath = (LPWSTR)LOCAL_ALLOC( LPTR, cbSize );
if ( pDllExpandedPath == (LPWSTR)NULL )
{
dwRetCode = GetLastError();
DDMLogError( ROUTERLOG_NOT_ENOUGH_MEMORY, 0, NULL, dwRetCode);
break;
}
cbSize = ExpandEnvironmentStrings(
pDllPath,
pDllExpandedPath,
cbSize );
if ( cbSize == 0 )
{
dwRetCode = GetLastError();
DDMLogError(ROUTERLOG_CANT_GET_REGKEYVALUES,0,NULL,dwRetCode);
break;
}
hinstProviderModule = LoadLibrary( pDllExpandedPath );
if ( hinstProviderModule == (HINSTANCE)NULL )
{
dwRetCode = GetLastError();
break;
}
//
// Get server attributes that will be used to initialize authentication
// and accounting providers
//
if ( dwNASIpAddress == 0 )
{
DWORD dwComputerNameLen = sizeof( chComputerName);
//
// Failed to get the LOCAL IP address, use computer name instead.
//
if ( !GetComputerNameA( chComputerName, &dwComputerNameLen ) )
{
dwRetCode = GetLastError();
break;
}
ServerAttributes[0].raaType = raatNASIdentifier;
ServerAttributes[0].dwLength = strlen(chComputerName);
ServerAttributes[0].Value = chComputerName;
}
else
{
ServerAttributes[0].raaType = raatNASIPAddress;
ServerAttributes[0].dwLength = 4;
ServerAttributes[0].Value = UlongToPtr(dwNASIpAddress);
}
if ( !fAuthenticationProvider )
{
ZeroMemory( szAcctSessionId, sizeof( szAcctSessionId ) );
_itoa( (*lpdwStartAccountingSessionId)++, szAcctSessionId, 10 );
ServerAttributes[1].raaType = raatAcctSessionId;
ServerAttributes[1].dwLength = strlen( szAcctSessionId );
ServerAttributes[1].Value = (PVOID)szAcctSessionId;
ServerAttributes[2].raaType = raatMinimum;
ServerAttributes[2].dwLength = 0;
ServerAttributes[2].Value = NULL;
}
else
{
ServerAttributes[1].raaType = raatMinimum;
ServerAttributes[1].dwLength = 0;
ServerAttributes[1].Value = NULL;
}
if ( fAuthenticationProvider )
{
DWORD (*RasAuthProviderInitialize)( RAS_AUTH_ATTRIBUTE *, HANDLE, DWORD );
gblDDMConfigInfo.hinstAuthModule = hinstProviderModule;
RasAuthProviderInitialize =
(DWORD(*)(RAS_AUTH_ATTRIBUTE*, HANDLE, DWORD))
GetProcAddress(
hinstProviderModule,
"RasAuthProviderInitialize" );
if ( RasAuthProviderInitialize == NULL )
{
dwRetCode = GetLastError();
break;
}
dwRetCode = RasAuthProviderInitialize(
(RAS_AUTH_ATTRIBUTE *)&ServerAttributes,
gblDDMConfigInfo.hLogEvents,
gblDDMConfigInfo.dwLoggingLevel );
if ( dwRetCode != NO_ERROR )
{
break;
}
gblDDMConfigInfo.lpfnRasAuthProviderTerminate = (DWORD(*)(VOID))
GetProcAddress(
hinstProviderModule,
"RasAuthProviderTerminate" );
if ( gblDDMConfigInfo.lpfnRasAuthProviderTerminate == NULL )
{
dwRetCode = GetLastError();
break;
}
*plpfnRasAuthProviderAuthenticateUser =
GetProcAddress(
hinstProviderModule,
"RasAuthProviderAuthenticateUser" );
if ( *plpfnRasAuthProviderAuthenticateUser == NULL )
{
dwRetCode = GetLastError();
break;
}
*plpfnRasAuthProviderFreeAttributes =
GetProcAddress(
hinstProviderModule,
"RasAuthProviderFreeAttributes" );
if ( *plpfnRasAuthProviderFreeAttributes == NULL )
{
dwRetCode = GetLastError();
break;
}
*plpfnRasAuthConfigChangeNotification =
GetProcAddress(
hinstProviderModule,
"RasAuthConfigChangeNotification" );
if ( *plpfnRasAuthConfigChangeNotification == NULL )
{
dwRetCode = GetLastError();
break;
}
}
else
{
DWORD (*RasAcctProviderInitialize)( RAS_AUTH_ATTRIBUTE *, HANDLE, DWORD );
gblDDMConfigInfo.hinstAcctModule = hinstProviderModule;
RasAcctProviderInitialize =
(DWORD(*)(RAS_AUTH_ATTRIBUTE*, HANDLE, DWORD))
GetProcAddress(
hinstProviderModule,
"RasAcctProviderInitialize" );
if ( RasAcctProviderInitialize == NULL )
{
dwRetCode = GetLastError();
break;
}
dwRetCode = RasAcctProviderInitialize(
(RAS_AUTH_ATTRIBUTE *)&ServerAttributes,
gblDDMConfigInfo.hLogEvents,
gblDDMConfigInfo.dwLoggingLevel );
if ( dwRetCode != NO_ERROR )
{
break;
}
gblDDMConfigInfo.lpfnRasAcctProviderTerminate = (DWORD(*)(VOID))
GetProcAddress(
hinstProviderModule,
"RasAcctProviderTerminate" );
if ( gblDDMConfigInfo.lpfnRasAcctProviderTerminate == NULL )
{
dwRetCode = GetLastError();
break;
}
*plpfnRasAcctProviderStartAccounting =
GetProcAddress(
hinstProviderModule,
"RasAcctProviderStartAccounting" );
if ( *plpfnRasAcctProviderStartAccounting == NULL )
{
dwRetCode = GetLastError();
break;
}
*plpfnRasAcctProviderStopAccounting =
GetProcAddress(
hinstProviderModule,
"RasAcctProviderStopAccounting" );
if ( *plpfnRasAcctProviderStopAccounting == NULL )
{
dwRetCode = GetLastError();
break;
}
*plpfnRasAcctProviderInterimAccounting =
GetProcAddress(
hinstProviderModule,
"RasAcctProviderInterimAccounting");
if ( *plpfnRasAcctProviderInterimAccounting == NULL )
{
dwRetCode = GetLastError();
break;
}
*plpfnRasAcctProviderFreeAttributes =
GetProcAddress(
hinstProviderModule,
"RasAcctProviderFreeAttributes" );
if ( *plpfnRasAcctProviderFreeAttributes == NULL )
{
dwRetCode = GetLastError();
break;
}
*plpfnRasAcctConfigChangeNotification =
GetProcAddress(
hinstProviderModule,
"RasAcctConfigChangeNotification" );
if ( *plpfnRasAcctConfigChangeNotification == NULL )
{
dwRetCode = GetLastError();
break;
}
}
}while( FALSE );
if ( hKeyProviders != NULL )
{
RegCloseKey( hKeyProviders );
}
if ( hKeyCurrentProvider != NULL )
{
RegCloseKey( hKeyCurrentProvider );
}
if ( pDllPath != NULL )
{
LOCAL_FREE( pDllPath );
}
if ( pDllExpandedPath != NULL )
{
LOCAL_FREE( pDllExpandedPath );
}
if ( pProviderName != NULL )
{
LOCAL_FREE( pProviderName );
}
return( dwRetCode );
}
LONG
RegQueryDword (HKEY hkey, LPCTSTR szValueName, LPDWORD pdwValue)
{
// Get the value.
//
DWORD dwType;
DWORD cbData = sizeof(DWORD);
LONG lr = RegQueryValueEx (hkey, szValueName, NULL, &dwType,
(LPBYTE)pdwValue, &cbData);
// It's type should be REG_DWORD. (duh).
//
if ((ERROR_SUCCESS == lr) && (REG_DWORD != dwType))
{
lr = ERROR_INVALID_DATATYPE;
}
// Make sure we initialize the output value on error.
// (We don't know for sure that RegQueryValueEx does this.)
//
if (ERROR_SUCCESS != lr)
{
*pdwValue = 0;
}
return lr;
}
DWORD
lProtocolEnabled(
IN HKEY hKey,
IN DWORD dwPid,
IN BOOL fRasSrv,
IN BOOL fRouter,
IN BOOL * pfEnabled
)
{
static const TCHAR c_szRegValEnableIn[] = TEXT("EnableIn");
static const TCHAR c_szRegValEnableRoute[] = TEXT("EnableRoute");
static const TCHAR c_szRegSubkeyIp[] = TEXT("Ip");
static const TCHAR c_szRegSubkeyIpx[] = TEXT("Ipx");
static const TCHAR c_szRegSubkeyATalk[] = TEXT("AppleTalk");
DWORD dwValue;
DWORD lr;
HKEY hkeyProtocol = NULL;
const TCHAR * pszSubkey;
switch ( dwPid )
{
case PID_IP:
pszSubkey = c_szRegSubkeyIp;
break;
case PID_IPX:
pszSubkey = c_szRegSubkeyIpx;
break;
case PID_ATALK:
pszSubkey = c_szRegSubkeyATalk;
break;
default:
return( FALSE );
}
*pfEnabled = FALSE;
lr = RegOpenKey( hKey, pszSubkey, &hkeyProtocol );
if ( 0 != lr )
{
goto done;
}
if (fRasSrv)
{
lr = RegQueryDword(hkeyProtocol, c_szRegValEnableIn, &dwValue);
if ( (ERROR_FILE_NOT_FOUND == lr)
|| ((ERROR_SUCCESS == lr) && (dwValue != 0)))
{
lr = ERROR_SUCCESS;
*pfEnabled = TRUE;
goto done;
}
}
if (fRouter)
{
lr = RegQueryDword(hkeyProtocol, c_szRegValEnableRoute, &dwValue);
if ( (ERROR_FILE_NOT_FOUND == lr)
|| ((ERROR_SUCCESS == lr) && (dwValue != 0)))
{
lr = ERROR_SUCCESS;
*pfEnabled = TRUE;
goto done;
}
}
done:
if(NULL != hkeyProtocol)
{
RegCloseKey ( hkeyProtocol );
}
return lr;
}
DWORD
DdmFindBoundProtocols(
OUT BOOL * pfBoundToIp,
OUT BOOL * pfBoundToIpx,
OUT BOOL * pfBoundToATalk
)
{
static const TCHAR c_szRegKeyRemoteAccessParams[]
= TEXT("SYSTEM\\CurrentControlSet\\Services\\RemoteAccess\\Parameters");
RASMAN_GET_PROTOCOL_INFO InstalledProtocols;
LONG lResult = 0;
HKEY hKey = NULL;
DWORD i;
*pfBoundToIp = FALSE;
*pfBoundToIpx = FALSE;
*pfBoundToATalk = FALSE;
lResult = RasGetProtocolInfo( NULL, &InstalledProtocols );
if ( lResult != NO_ERROR )
{
goto done;
}
lResult = RegOpenKey( HKEY_LOCAL_MACHINE, c_szRegKeyRemoteAccessParams, &hKey );
if ( 0 != lResult )
{
goto done;
}
for ( i = 0; i < InstalledProtocols.ulNumProtocols; i++ )
{
switch( InstalledProtocols.ProtocolInfo[i].ProtocolType )
{
case IPX:
lResult=lProtocolEnabled( hKey,
PID_IPX,
TRUE,
FALSE,
pfBoundToIpx);
break;
case IP:
lResult=lProtocolEnabled( hKey,
PID_IP,
TRUE,
FALSE,
pfBoundToIp );
break;
case APPLETALK:
lResult=lProtocolEnabled( hKey,
PID_ATALK,
TRUE,
FALSE,
pfBoundToATalk);
break;
default:
break;
}
}
RegCloseKey( hKey );
done:
return ( DWORD ) lResult;
}
DWORD
GetArrayOfIpAddresses(PWSTR pwszIpAddresses,
DWORD *pcNumValues,
PWSTR **papwstrValues)
{
DWORD cValues = 0;
PWSTR psz = pwszIpAddresses;
DWORD dwErr = ERROR_SUCCESS;
DWORD i;
PWSTR *apwstrValues = NULL;
do
{
for(; TEXT('\0') != *psz; cValues++)
{
psz += (wcslen(psz) + 1);
}
apwstrValues = LocalAlloc(LPTR, cValues * sizeof(PWSTR));
if(NULL == apwstrValues)
{
dwErr = GetLastError();
break;
}
psz = pwszIpAddresses;
for(i = 0; TEXT('\0') != *psz; i++)
{
apwstrValues[i] = psz;
psz += (wcslen(psz) + 1);
}
} while (FALSE);
*pcNumValues = cValues;
*papwstrValues = apwstrValues;
return dwErr;
}
DWORD
GetIPAddressPoolFromRegistry(
HKEY hkey,
PWSTR pszValueName,
DWORD *pcNumValues,
PWSTR **papwstrValues
)
{
DWORD dwErr = ERROR_SUCCESS;
DWORD dwType;
DWORD dwSize = 0;
PWSTR pwszIpAddresses = NULL;
do
{
if( (NULL == papwstrValues)
|| (NULL == pcNumValues)
|| (NULL == pszValueName)
|| (NULL == hkey))
{
dwErr = ERROR_INVALID_HANDLE;
break;
}
*pcNumValues = 0;
*papwstrValues = NULL;
//
// Find the size of the MULTI_SZ
//
dwErr = RegQueryValueEx(
hkey,
pszValueName,
NULL,
&dwType,
NULL,
&dwSize);
if( (ERROR_SUCCESS != dwErr)
|| (REG_MULTI_SZ != dwType)
|| (0 == dwSize))
{
//
// Trace out that failed to read the information
// and bail.
//
break;
}
//
// Allocate the bufffer
//
pwszIpAddresses = LocalAlloc(LPTR, dwSize);
if(NULL == pwszIpAddresses)
{
dwErr = GetLastError();
break;
}
//
// Get the strings
//
dwErr = RegQueryValueEx(
hkey,
pszValueName,
NULL,
&dwType,
(LPBYTE) pwszIpAddresses,
&dwSize);
if(ERROR_SUCCESS != dwErr)
{
//
// Trace
//
break;
}
//
// Construct the array of IPAddresses
//
dwErr = GetArrayOfIpAddresses(pwszIpAddresses,
pcNumValues,
papwstrValues);
} while (FALSE);
return dwErr;
}
DWORD
AddressPoolInit(
VOID
)
{
HKEY hkey = NULL;
DWORD dwErr = ERROR_SUCCESS;
gblDDMConfigInfo.cAnalogIPAddresses = 0;
gblDDMConfigInfo.apAnalogIPAddresses = NULL;
gblDDMConfigInfo.cDigitalIPAddresses = 0;
gblDDMConfigInfo.apDigitalIPAddresses = NULL;
do
{
dwErr = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
TEXT("System\\CurrentControlSet\\Services\\PptpProtocol\\Parameters"),
0,
KEY_READ,
&hkey);
if(ERROR_SUCCESS != dwErr)
{
break;
}
//
// Get Analog IP Address Pool
//
dwErr = GetIPAddressPoolFromRegistry(
hkey,
TEXT("AnalogIPAddressPool"),
&gblDDMConfigInfo.cAnalogIPAddresses,
&gblDDMConfigInfo.apAnalogIPAddresses);
//
// Trace out the errors here
//
//
// Get Digital IP Address Pool
//
dwErr = GetIPAddressPoolFromRegistry(
hkey,
TEXT("DigitalIPAddressPool"),
&gblDDMConfigInfo.cDigitalIPAddresses,
&gblDDMConfigInfo.apDigitalIPAddresses);
//
// Trace out the errors here
//
} while(FALSE);
if(NULL != hkey)
{
RegCloseKey(hkey);
}
if(ERROR_FILE_NOT_FOUND == dwErr)
{
dwErr = ERROR_SUCCESS;
}
return dwErr;
}