windows-nt/Source/XPSP1/NT/net/rras/ras/rasman/tapi32/rtnetcfg.c
2020-09-26 16:20:57 +08:00

436 lines
9.3 KiB
C

/*++
Copyright (c) 1989-1994 Microsoft Corporation
Module Name:
rtnetcfg.c
Abstract:
Helper routines to read PortUsage and other information
from registry.
Author:
Rao Salapaka (raos) 29-Mar-97
Revision History:
--*/
#ifndef UNICODE
#define UNICODE
#endif
#ifndef _UNICODE
#define _UNICODE
#endif
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <tchar.h>
#include <rtutils.h>
#include <rasman.h>
#include <reghelp.h>
#define REGISTRY_NUMBEROFRINGS TEXT("NumberOfRings")
#define RNETCFG_RASCLI 1
#define RNETCFG_RASSRV 2
#define RNETCFG_ROUTER 4
DWORD g_dwRasComponent = 0;
#define TRACESETTINGS (0x00010000 \
| TRACE_USE_MASK \
| TRACE_USE_MSEC)
DWORD dwTraceId;
DWORD dwGetNumberOfRings ( PDWORD pdwRings );
DWORD dwGetPortUsage(DWORD *pdwPortUsage);
LONG lrIsModemRasEnabled(HKEY hkey,
BOOL *pfRasEnabled,
BOOL *pfRouterEnabled);
DeviceInfo * GetDeviceInfo (PBYTE pbGuid );
/*++
Routine Description:
Reads the value specified by lpcszValue parameter in the
hkeyRas location of registry and returns the data assoc.
with it. It is assumed that the data is a REG_DWORD. Side
effect is that this key is created if not already present
and defaults the value to the fEnable passed in.
Arguments:
hkeyRas - handle of the registry key where this value is
to be checked.
lpcszValue - Const. string representing the value to be
read.
pfEnabled - pointer to a BOOL where the value read from
the registry is to be returned.
fEnable - the default value to set if the value is not
present and this routine creates it.
Return Value:
Values from the registry apis.
--*/
LONG
lrCheckValue(
HKEY hkeyRas,
LPCTSTR lpcszValue,
BOOL *pfEnabled,
BOOL fEnable)
{
DWORD dwdata = 0;
DWORD dwtype;
DWORD dwsize = sizeof(DWORD);
LONG lr;
*pfEnabled = FALSE;
if(ERROR_FILE_NOT_FOUND == (lr = RegQueryValueEx(
hkeyRas,
lpcszValue,
0,
&dwtype,
(PBYTE) &dwdata,
&dwsize)))
{
TracePrintfExA(dwTraceId,
TRACESETTINGS,
"lrCheckValue: value %ws not found",
lpcszValue);
if(lr = lrRasEnableDevice(hkeyRas,
(LPTSTR) lpcszValue,
fEnable))
{
TracePrintfExA(
dwTraceId,
TRACESETTINGS,
"lrCheckValue: Couldn't set value %ws. 0x%x",
lpcszValue,
lr);
goto done;
}
*pfEnabled = fEnable;
goto done;
}
*pfEnabled = dwdata;
done:
return lr;
}
/*++
Routine Description:
This routine is called only for modems. It checks the
registry and determines if the modem is registered
for RasDialIn and Routing. These values in registry
are created if they are not already present and
are defaulted appropriately.
Arguments:
hkey - handle to the modems instance key in registry.
pfRasEnabled - address where the data indicating if
the modem is enabled for ras dialin is
stored. If the key for this value doesn't
exist this value determines the default
value as an in parameter.
pfRouterEnabled - address where the data indicating if
the modem is enabled for routing is
enabled.
Return Value:
Return values from the registry apis.
--*/
LONG
lrIsModemRasEnabled(HKEY hkey,
BOOL *pfRasEnabled,
BOOL *pfRouterEnabled)
{
DWORD dwdata;
DWORD dwsize = sizeof ( DWORD );
DWORD dwtype;
LONG lr;
HKEY hkeyRas = NULL;
DWORD dwDisposition;
BOOL fDefaultForRasEnabled = *pfRasEnabled;
*pfRasEnabled =
*pfRouterEnabled = FALSE;
//
// Open the RAS key and if the key is not present
// create the key.
//
if (lr = RegCreateKeyEx(
hkey,
TEXT("Clients\\Ras"),
0, NULL, 0,
KEY_ALL_ACCESS,
NULL,
&hkeyRas,
&dwDisposition))
{
TracePrintfExA(
dwTraceId,
TRACESETTINGS,
"dwFindModemPortUsage: Failed to create/open"
" RAS key under modem class. 0x%x",
lr);
goto done;
}
//
// Check to see if the modem is enabled for ras dialin
// Enable the modem for dialin by default to whatever
// value is passed in
//
if(lr = lrCheckValue(
hkeyRas,
TEXT("EnableForRas"),
pfRasEnabled,
fDefaultForRasEnabled))
{
TracePrintfExA(
dwTraceId,
TRACESETTINGS,
"dwFindModemPortUsage: lrCheckValue failed for "
"RasEnabled. %d",
lr );
lr = ERROR_SUCCESS;
}
if (!*pfRasEnabled)
{
TracePrintfExA(
dwTraceId,
TRACESETTINGS,
"dwFindModemPortUsage: Modem is not "
"enabled for RAS");
}
//
// Check to see if the modem is enabled for routing
// disable the modem for routing by default
//
if(lr = lrCheckValue(
hkeyRas,
TEXT("EnableForRouting"),
pfRouterEnabled,
FALSE))
{
TracePrintfExA(
dwTraceId,
TRACESETTINGS,
"dwFindModemPortUsage: lrCheckValue failed for "
"RouterEnabled. %d",
lr );
lr = ERROR_SUCCESS;
}
if (!*pfRouterEnabled)
{
TracePrintfExA(
dwTraceId,
TRACESETTINGS,
"dwFindModemPortUsage: Modem is not "
"enabled for Routing");
}
done:
if(hkeyRas)
{
RegCloseKey(hkeyRas);
}
return (DWORD) lr;
}
/*++
Routine Description:
Gets the default port usage for the device. The default
is if ras server is installed, the port is enabled for
ras dialin and routing. The device is always enabled for
dialout.
Arguments:
pdwUsage - buffer to receive the port usage.
Return Value:
ERROR_SUCCESS.
--*/
DWORD
dwGetPortUsage(DWORD *pdwUsage)
{
HKEY hkey = NULL;
DWORD dwRetCode = ERROR_SUCCESS;
static const TCHAR c_szRemoteAccess[] =
TEXT("System\\CurrentControlSet\\Services\\RemoteAccess");
TracePrintfExA(dwTraceId,
TRACESETTINGS,
"dwGetPorTUsage:...");
if(0 == g_dwRasComponent)
{
//
// Check to see if Ras Server is installed
//
g_dwRasComponent = RNETCFG_RASCLI;
if (RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
c_szRemoteAccess,
0, KEY_QUERY_VALUE,
&hkey))
{
TracePrintfExA(
dwTraceId,
TRACESETTINGS,
"dwAssignDefaultPortUsage: RemoteAccess"
" not installed");
}
else
{
g_dwRasComponent = RNETCFG_RASSRV;
}
}
*pdwUsage = CALL_OUT;
*pdwUsage |= ((g_dwRasComponent & RNETCFG_RASSRV) ?
(CALL_IN | CALL_ROUTER) : 0);
if(NULL != hkey)
{
RegCloseKey(hkey);
}
return dwRetCode;
}
/*++
Routine Description:
Gets the information from registry about how many
rings to wait for before picking up an incoming
call.
Arguments:
pdwRings - buffer to receive the number of rings
read from registry.
Return Value:
Return Values from registry apis.
--*/
DWORD
dwGetNumberOfRings (PDWORD pdwRings)
{
LONG lr = ERROR_SUCCESS;
HKEY hkey = NULL;
DWORD dwsize = sizeof(DWORD);
DWORD dwtype;
TCHAR c_szRasmanParam[] =
TEXT("SYSTEM\\CurrentControlSet\\Services\\Rasman\\Parameters");
if(lr = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
c_szRasmanParam,
0, KEY_READ,
&hkey))
{
TracePrintfExA(
dwTraceId,
TRACESETTINGS,
"dwGetNumberOfRings: failed to open rasman key"
" in registry. 0x%x",
lr);
goto done;
}
if(lr = RegQueryValueEx(
hkey,
TEXT("NumberOfRings"),
0, &dwtype,
(PBYTE) pdwRings,
&dwsize))
{
*pdwRings = 2;
}
if (*pdwRings > 20)
{
*pdwRings = 2;
}
done:
if(hkey)
{
RegCloseKey(hkey);
}
TracePrintfExA(
dwTraceId,
TRACESETTINGS,
"dwGetNumberOfRings: dwRings=%d. lr=0x%x",
*pdwRings,
lr);
return (DWORD) lr;
}