Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

758 lines
19 KiB

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
registry.c
Abstract:
Routines for reading registry configuration.
Environment:
User Mode - Win32
--*/
///////////////////////////////////////////////////////////////////////////////
// //
// Include files //
// //
///////////////////////////////////////////////////////////////////////////////
#include "globals.h"
#include "registry.h"
#include "termcaps.h"
///////////////////////////////////////////////////////////////////////////////
// //
// Global variables //
// //
///////////////////////////////////////////////////////////////////////////////
HKEY g_hKey = NULL;
H323_REGISTRY_SETTINGS g_RegistrySettings;
///////////////////////////////////////////////////////////////////////////////
// //
// Public procedures //
// //
///////////////////////////////////////////////////////////////////////////////
BOOL
H323SetDefaultConfig(
)
/*++
Routine Description:
Changes configuration settings back to defaults.
Arguments:
None.
Return Values:
Returns true if successful.
--*/
{
#if DBG
// initialize debug settings to defaults
g_RegistrySettings.dwLogType = H323_DEBUG_LOGTYPE;
g_RegistrySettings.dwLogLevel = H323_DEBUG_LOGLEVEL;
g_RegistrySettings.dwH245LogLevel = g_RegistrySettings.dwLogLevel;
g_RegistrySettings.dwH225LogLevel = g_RegistrySettings.dwLogLevel;
g_RegistrySettings.dwQ931LogLevel = g_RegistrySettings.dwLogLevel;
g_RegistrySettings.dwLinkLogLevel = g_RegistrySettings.dwLogLevel;
// copy default debug log file name
lstrcpy(g_RegistrySettings.szLogFile, H323_DEBUG_LOGFILE);
#endif // DBG
// initialize alerting timeout to default
g_RegistrySettings.dwQ931AlertingTimeout = 0;
// set alerting timeout
CC_SetCallControlTimeout(
CC_Q931_ALERTING_TIMEOUT,
g_RegistrySettings.dwQ931AlertingTimeout
);
// initialize call signalling port to default
g_RegistrySettings.dwQ931CallSignallingPort = CC_H323_HOST_CALL;
// initialize g711 audio codec settings
g_RegistrySettings.dwG711MillisecondsPerPacket =
G711_DEFAULT_MILLISECONDS_PER_PACKET
;
// initialize g723 audio codec settings
g_RegistrySettings.dwG723MillisecondsPerPacket =
G723_DEFAULT_MILLISECONDS_PER_PACKET
;
// success
return TRUE;
}
BOOL
H323GetConfigFromRegistry(
)
/*++
Routine Description:
Loads registry settings for service provider.
Arguments:
None.
Return Values:
Returns true if successful.
--*/
{
LONG lStatus = ERROR_SUCCESS;
CHAR szAddr[H323_MAXDESTNAMELEN];
DWORD dwValue;
DWORD dwValueSize;
DWORD dwValueType;
LPSTR pszValue;
// see if key open
if (g_hKey == NULL) {
// open registry subkey
lStatus = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
H323_REGKEY_ROOT,
0,
KEY_READ,
&g_hKey
);
}
// validate return code
if (lStatus != ERROR_SUCCESS) {
H323DBG((
DEBUG_LEVEL_WARNING,
"error 0x%08lx opening tsp registry key.\n",
lStatus
));
// success
return TRUE;
}
#if DBG
// do not support modifying log type via registry
g_RegistrySettings.dwLogType = H323_DEBUG_LOGTYPE;
// initialize value name
pszValue = H323_REGVAL_DEBUGLEVEL;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&g_RegistrySettings.dwLogLevel,
&dwValueSize
);
// validate return code
if (lStatus != ERROR_SUCCESS) {
// copy default value into global settings
g_RegistrySettings.dwLogLevel = H323_DEBUG_LOGLEVEL;
}
// initialize value name
pszValue = H245_REGVAL_DEBUGLEVEL;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&g_RegistrySettings.dwH245LogLevel,
&dwValueSize
);
// validate return code
if (lStatus != ERROR_SUCCESS) {
// copy default value into global settings
g_RegistrySettings.dwH245LogLevel = g_RegistrySettings.dwLogLevel;
}
// initialize value name
pszValue = H225_REGVAL_DEBUGLEVEL;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&g_RegistrySettings.dwH225LogLevel,
&dwValueSize
);
// validate return code
if (lStatus != ERROR_SUCCESS) {
// copy default value into global settings
g_RegistrySettings.dwH225LogLevel = g_RegistrySettings.dwLogLevel;
}
// initialize value name
pszValue = Q931_REGVAL_DEBUGLEVEL;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&g_RegistrySettings.dwQ931LogLevel,
&dwValueSize
);
// validate return code
if (lStatus != ERROR_SUCCESS) {
// copy default value into global settings
g_RegistrySettings.dwQ931LogLevel = g_RegistrySettings.dwLogLevel;
}
// initialize value name
pszValue = LINK_REGVAL_DEBUGLEVEL;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&g_RegistrySettings.dwLinkLogLevel,
&dwValueSize
);
// validate return code
if (lStatus != ERROR_SUCCESS) {
// copy default value into global settings
g_RegistrySettings.dwLinkLogLevel = g_RegistrySettings.dwLogLevel;
}
// initialize value name
pszValue = H323_REGVAL_DEBUGLOG;
// initialize type
dwValueType = REG_SZ;
dwValueSize = sizeof(g_RegistrySettings.szLogFile);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
g_RegistrySettings.szLogFile,
&dwValueSize
);
// validate return code
if (lStatus != ERROR_SUCCESS) {
// copy default value into global settings
lstrcpy(g_RegistrySettings.szLogFile, H323_DEBUG_LOGFILE);
}
#endif // DBG
// initialize value name
pszValue = H323_REGVAL_CALLSIGNALLINGPORT;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&g_RegistrySettings.dwQ931CallSignallingPort,
&dwValueSize
);
// validate return code
if (lStatus != ERROR_SUCCESS) {
// copy default value into global settings
g_RegistrySettings.dwQ931CallSignallingPort = CC_H323_HOST_CALL;
}
H323DBG((
DEBUG_LEVEL_VERBOSE,
"using call signalling port %d.\n",
g_RegistrySettings.dwQ931CallSignallingPort
));
// initialize value name
pszValue = H323_REGVAL_Q931ALERTINGTIMEOUT;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&g_RegistrySettings.dwQ931AlertingTimeout,
&dwValueSize
);
// validate return code
if (lStatus == ERROR_SUCCESS) {
H323DBG((
DEBUG_LEVEL_VERBOSE,
"using Q931 timeout of %d milliseconds.\n",
g_RegistrySettings.dwQ931AlertingTimeout
));
} else {
H323DBG((
DEBUG_LEVEL_VERBOSE,
"using default Q931 timeout.\n"
));
// copy default value into global settings
g_RegistrySettings.dwQ931AlertingTimeout = 0;
}
// set alerting timeout
CC_SetCallControlTimeout(
CC_Q931_ALERTING_TIMEOUT,
g_RegistrySettings.dwQ931AlertingTimeout
);
// initialize value name
pszValue = H323_REGVAL_G711MILLISECONDSPERPACKET;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&g_RegistrySettings.dwG711MillisecondsPerPacket,
&dwValueSize
);
// validate return code
if (lStatus != ERROR_SUCCESS) {
// copy default value into global settings
g_RegistrySettings.dwG711MillisecondsPerPacket =
G711_DEFAULT_MILLISECONDS_PER_PACKET
;
}
H323DBG((
DEBUG_LEVEL_VERBOSE,
"using G.711 setting of %d milliseconds per packet.\n",
g_RegistrySettings.dwG711MillisecondsPerPacket
));
// initialize value name
pszValue = H323_REGVAL_G723MILLISECONDSPERPACKET;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&g_RegistrySettings.dwG723MillisecondsPerPacket,
&dwValueSize
);
// validate return code
if (lStatus != ERROR_SUCCESS) {
// copy default value into global settings
g_RegistrySettings.dwG723MillisecondsPerPacket =
G723_DEFAULT_MILLISECONDS_PER_PACKET
;
}
H323DBG((
DEBUG_LEVEL_VERBOSE,
"using G.723 setting of %d milliseconds per packet.\n",
g_RegistrySettings.dwG723MillisecondsPerPacket
));
// initialize value name
pszValue = H323_REGVAL_GATEWAYADDR;
// initialize type
dwValueType = REG_SZ;
dwValueSize = sizeof(szAddr);
// initialize ip address
dwValue = UNINITIALIZED;
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
szAddr,
&dwValueSize
);
// validate return code
if (lStatus == ERROR_SUCCESS) {
// convert ip address
dwValue = inet_addr(szAddr);
// see if address converted
if (dwValue == UNINITIALIZED) {
struct hostent * pHost;
// attempt to lookup hostname
pHost = gethostbyname(szAddr);
// validate pointer
if (pHost != NULL) {
// retrieve host address from structure
dwValue = *(unsigned long *)pHost->h_addr;
}
}
}
// see if address converted and check for null
if ((dwValue > 0) && (dwValue != UNINITIALIZED)) {
// save new gateway address in registry structure
g_RegistrySettings.ccGatewayAddr.nAddrType = CC_IP_BINARY;
g_RegistrySettings.ccGatewayAddr.Addr.IP_Binary.dwAddr = ntohl(dwValue);
g_RegistrySettings.ccGatewayAddr.Addr.IP_Binary.wPort =
LOWORD(g_RegistrySettings.dwQ931CallSignallingPort);
g_RegistrySettings.ccGatewayAddr.bMulticast =
IN_MULTICAST(g_RegistrySettings.ccGatewayAddr.Addr.IP_Binary.dwAddr);
H323DBG((
DEBUG_LEVEL_TRACE,
"gateway address resolved to %s.\n",
H323AddrToString(dwValue)
));
} else {
// clear memory used for gateway address
memset(&g_RegistrySettings.ccGatewayAddr,0,sizeof(CC_ADDR));
}
// initialize value name
pszValue = H323_REGVAL_GATEWAYENABLED;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&dwValue,
&dwValueSize
);
// validate return code
if (lStatus == ERROR_SUCCESS) {
// if value non-zero then gateway address enabled
g_RegistrySettings.fIsGatewayEnabled = (dwValue != 0);
} else {
// copy default value into settings
g_RegistrySettings.fIsGatewayEnabled = FALSE;
}
// initialize value name
pszValue = H323_REGVAL_PROXYADDR;
// initialize type
dwValueType = REG_SZ;
dwValueSize = sizeof(szAddr);
// initialize ip address
dwValue = UNINITIALIZED;
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
szAddr,
&dwValueSize
);
// validate return code
if (lStatus == ERROR_SUCCESS) {
// convert ip address
dwValue = inet_addr(szAddr);
// see if address converted
if (dwValue == UNINITIALIZED) {
struct hostent * pHost;
// attempt to lookup hostname
pHost = gethostbyname(szAddr);
// validate pointer
if (pHost != NULL) {
// retrieve host address from structure
dwValue = *(unsigned long *)pHost->h_addr;
}
}
}
// see if address converted
if ((dwValue > 0) && (dwValue != UNINITIALIZED)) {
// save new gateway address in registry structure
g_RegistrySettings.ccProxyAddr.nAddrType = CC_IP_BINARY;
g_RegistrySettings.ccProxyAddr.Addr.IP_Binary.dwAddr = ntohl(dwValue);
g_RegistrySettings.ccProxyAddr.Addr.IP_Binary.wPort =
LOWORD(g_RegistrySettings.dwQ931CallSignallingPort);
g_RegistrySettings.ccProxyAddr.bMulticast =
IN_MULTICAST(g_RegistrySettings.ccProxyAddr.Addr.IP_Binary.dwAddr);
H323DBG((
DEBUG_LEVEL_TRACE,
"proxy address resolved to %s.\n",
H323AddrToString(dwValue)
));
} else {
// clear memory used for gateway address
memset(&g_RegistrySettings.ccProxyAddr,0,sizeof(CC_ADDR));
}
// initialize value name
pszValue = H323_REGVAL_PROXYENABLED;
// initialize type
dwValueType = REG_DWORD;
dwValueSize = sizeof(DWORD);
// query for registry value
lStatus = RegQueryValueEx(
g_hKey,
pszValue,
NULL,
&dwValueType,
(LPBYTE)&dwValue,
&dwValueSize
);
// validate return code
if (lStatus == ERROR_SUCCESS) {
// if value non-zero then gateway address enabled
g_RegistrySettings.fIsProxyEnabled = (dwValue != 0);
} else {
// copy default value into settings
g_RegistrySettings.fIsProxyEnabled = FALSE;
}
// success
return TRUE;
}
BOOL
H323ListenForRegistryChanges(
HANDLE hEvent
)
/*++
Routine Description:
Initializes registry key change notification.
Arguments:
hEvent - event to associate with registry key.
Return Values:
Returns true if successful.
--*/
{
LONG lStatus = ERROR_SUCCESS;
// see if key open
if (g_hKey == NULL) {
// open registry subkey
lStatus = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
H323_REGKEY_ROOT,
0,
KEY_READ,
&g_hKey
);
}
// validate return code
if (lStatus != ERROR_SUCCESS) {
H323DBG((
DEBUG_LEVEL_WARNING,
"error 0x%08lx opening tsp registry key.\n",
lStatus
));
// failure
return FALSE;
}
// registry event with registry key
lStatus = RegNotifyChangeKeyValue(
g_hKey, // hKey
FALSE, // bWatchSubTree
REG_NOTIFY_CHANGE_ATTRIBUTES | // dwNotifyFilter
REG_NOTIFY_CHANGE_LAST_SET |
REG_NOTIFY_CHANGE_SECURITY,
hEvent, // hEvent
TRUE // fAsychnronous
);
// validate return code
if (lStatus != ERROR_SUCCESS) {
H323DBG((
DEBUG_LEVEL_WARNING,
"error 0x%08lx associating event with registry key.\n",
lStatus
));
// failure
return FALSE;
}
// success
return TRUE;
}
BOOL
H323StopListeningForRegistryChanges(
)
/*++
Routine Description:
Closes registry key.
Arguments:
None.
Return Values:
Returns true if successful.
--*/
{
// see if key open
if (g_hKey != NULL) {
// close key
RegCloseKey(g_hKey);
// re-init
g_hKey = NULL;
}
// success
return TRUE;
}