mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|