/*++ 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; }