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.
198 lines
5.0 KiB
198 lines
5.0 KiB
/*++
|
|
|
|
Copyright (c) 1997-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
rndreg.cpp
|
|
|
|
Abstract:
|
|
|
|
This module contains implementation of registry operations used
|
|
in the Rendezvous control.
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "rndreg.h"
|
|
#include "rndils.h"
|
|
|
|
const WCHAR gsz_RendezvousRoot[] =
|
|
L"Software\\Microsoft\\Windows\\CurrentVersion\\Dynamic Directory";
|
|
|
|
const WCHAR gsz_ConfInstRelRoot[] = L"Conference";
|
|
|
|
DWORD CRegistry::ms_ErrorCode = ERROR_SUCCESS;
|
|
|
|
WCHAR CRegistry::ms_ServerName[MAX_REG_WSTR_SIZE];
|
|
|
|
WCHAR CRegistry::ms_ProtocolId[MAX_REG_WSTR_SIZE];
|
|
WCHAR CRegistry::ms_SubType[MAX_REG_WSTR_SIZE];
|
|
WCHAR CRegistry::ms_AdvertisingScope[MAX_REG_WSTR_SIZE];
|
|
WCHAR CRegistry::ms_IsEncrypted[MAX_REG_WSTR_SIZE];
|
|
|
|
REG_INFO g_ConfInstInfoArray[] =
|
|
{
|
|
{MA_PROTOCOL, CRegistry::ms_ProtocolId}
|
|
// {MA_ADVERTISING_SCOPE, CRegistry::ms_AdvertisingScope},
|
|
// {MA_ISENCRYPTED, CRegistry::ms_IsEncrypted}
|
|
};
|
|
|
|
DWORD g_ContInstInfoArraySize =
|
|
(sizeof g_ConfInstInfoArray) / (sizeof REG_INFO);
|
|
|
|
// re-read the registry entry for server name
|
|
BOOL
|
|
CRegistry::NotifyServerNameChange(
|
|
)
|
|
{
|
|
// read the server name under the rendezvous key
|
|
return ReadRegValue(
|
|
m_RendezvousKey,
|
|
REG_SERVER_NAME,
|
|
CRegistry::ms_ServerName
|
|
);
|
|
}
|
|
|
|
BOOL
|
|
CRegistry::ReadRegValue(
|
|
IN HKEY Key,
|
|
IN const WCHAR * pName,
|
|
IN WCHAR * pValue
|
|
)
|
|
{
|
|
DWORD ValueType = REG_SZ;
|
|
DWORD BufferSize = 0;
|
|
|
|
// determine the size of the buffer
|
|
ms_ErrorCode = RegQueryValueExW(
|
|
Key,
|
|
pName,
|
|
0,
|
|
&ValueType,
|
|
NULL,
|
|
&BufferSize
|
|
);
|
|
if ( ERROR_SUCCESS != ms_ErrorCode )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
// check if the reqd buffer is bigger than the pre-allocated buffer size
|
|
if ( (MAX_REG_WSTR_SIZE < BufferSize) )
|
|
{
|
|
ms_ErrorCode = ERROR_OUTOFMEMORY;
|
|
return FALSE;
|
|
}
|
|
|
|
// retrieve the value into the allocated buffer
|
|
ms_ErrorCode = RegQueryValueExW(
|
|
Key,
|
|
pName,
|
|
0,
|
|
&ValueType,
|
|
(BYTE *)pValue,
|
|
&BufferSize
|
|
);
|
|
|
|
return (ERROR_SUCCESS == ms_ErrorCode);
|
|
}
|
|
|
|
|
|
BOOL
|
|
CRegistry::ReadConfInstValues(
|
|
IN HKEY ConfInstKey
|
|
)
|
|
{
|
|
for ( DWORD i = 0; i < g_ContInstInfoArraySize; i ++)
|
|
{
|
|
if ( !ReadRegValue(
|
|
ConfInstKey,
|
|
CILSDirectory::RTConferenceAttributeName(
|
|
g_ConfInstInfoArray[i].Attribute
|
|
),
|
|
g_ConfInstInfoArray[i].wstrValue
|
|
))
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
CRegistry::CRegistry(
|
|
)
|
|
// : m_Event(FALSE, FALSE, NULL, NULL)
|
|
{
|
|
// open rendezvous key
|
|
ms_ErrorCode = RegOpenKeyExW(
|
|
HKEY_LOCAL_MACHINE,
|
|
gsz_RendezvousRoot,
|
|
0,
|
|
KEY_READ,
|
|
&m_RendezvousKey
|
|
);
|
|
if ( ERROR_SUCCESS != ms_ErrorCode )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// ZoltanS note: The key is closed in the destructor.
|
|
|
|
#ifdef SEARCH_REGISTRY_FOR_ILS_SERVER_NAME
|
|
// read the server info (only wstr values) under the rendezvous key
|
|
if ( !ReadRegValue(
|
|
m_RendezvousKey,
|
|
REG_SERVER_NAME,
|
|
CRegistry::ms_ServerName
|
|
))
|
|
{
|
|
DBGOUT((ERROR, _T("CRegistry::CRegistry : could not read servername from registry")));
|
|
}
|
|
#endif
|
|
|
|
// open conference instance key root
|
|
HKEY ConfInstKey;
|
|
ms_ErrorCode = RegOpenKeyExW(
|
|
m_RendezvousKey,
|
|
gsz_ConfInstRelRoot,
|
|
0,
|
|
KEY_READ,
|
|
&ConfInstKey
|
|
);
|
|
if ( ERROR_SUCCESS != ms_ErrorCode )
|
|
{
|
|
return;
|
|
}
|
|
|
|
KEY_WRAP ConfInstKeyWrap(ConfInstKey);
|
|
|
|
if ( !ReadConfInstValues(ConfInstKey) )
|
|
{
|
|
return;
|
|
}
|
|
/*
|
|
// register for a notification when the values under the rendezvous key change
|
|
// are added or deleted. since the server name value exists under the key,
|
|
// any change in its value will cause the event handle to be signaled, other changes
|
|
// will be harmless (other than deletion of the server name value)
|
|
ms_ErrorCode = RegNotifyChangeKeyValue(
|
|
m_RendezvousKey, // key to be registered for notification
|
|
FALSE, // only the key, no subkeys
|
|
REG_NOTIFY_CHANGE_LAST_SET, // only modifications, addition/deletion of values
|
|
(HANDLE)m_Event, // handle to be signaled
|
|
TRUE // async
|
|
);
|
|
if ( ERROR_SUCCESS != ms_ErrorCode )
|
|
{
|
|
return;
|
|
}
|
|
*/
|
|
// success
|
|
ms_ErrorCode = ERROR_SUCCESS;
|
|
return;
|
|
}
|
|
|