windows-nt/Source/XPSP1/NT/net/ias/mmc/nap/rtradvise.cpp
2020-09-26 16:20:57 +08:00

257 lines
5.8 KiB
C++

//////////////////////////////////////////////////////////////////////////////
/*++
Copyright (C) Microsoft Corporation, 1997 - 1999
Module Name:
rtradvise.cpp
Abstract:
this class implement IRtrAdviseSink interface to redirect notification of changes
to the snapin node
Author:
Wei Jiang 1/7/99
Revision History:
weijiang 1/7/99 - created
--*/
//////////////////////////////////////////////////////////////////////////////
#include "Precompiled.h"
#include "rtradvise.h"
const IID IID_IRtrAdviseSink = {0x66A2DB14,0xD706,0x11d0,{0xA3,0x7B,0x00,0xC0,0x4F,0xC9,0xDA,0x04}};
const IID IID_IRouterRefresh = {0x66a2db15,0xd706,0x11d0,{0xa3,0x7b,0x00,0xc0,0x4f,0xc9,0xda,0x04}};
const IID IID_IRouterRefreshAccess = {0x66a2db1c,0xd706,0x11d0,{0xa3,0x7b,0x00,0xc0,0x4f,0xc9,0xda,0x04}};
//----------------------------------------------------------------------------
// Function: ConnectRegistry
//
// Connects to the registry on the specified machine
//----------------------------------------------------------------------------
DWORD ConnectRegistry(
IN LPCTSTR pszMachine, // NULL if local
OUT HKEY* phkeyMachine
) {
//
// if no machine name was specified, connect to the local machine.
// otherwise, connect to the specified machine
//
DWORD dwErr = NO_ERROR;
if (NULL == pszMachine)
{
*phkeyMachine = HKEY_LOCAL_MACHINE;
}
else
{
//
// Make the connection
//
dwErr = ::RegConnectRegistry(
(LPTSTR)pszMachine, HKEY_LOCAL_MACHINE, phkeyMachine
);
}
return dwErr;
}
//----------------------------------------------------------------------------
// Function: DisconnectRegistry
//
// Disconnects the specified config-handle. The handle is assumed to have been
// acquired by calling 'ConnectRegistry'.
//----------------------------------------------------------------------------
VOID DisconnectRegistry(
IN HKEY hkeyMachine
) {
if (hkeyMachine != HKEY_LOCAL_MACHINE)
{
::RegCloseKey(hkeyMachine);
}
}
DWORD ReadRegistryStringValue(LPCTSTR pszMachine, LPCTSTR pszKeyUnderLocalMachine, LPCTSTR pszName, ::CString& strValue)
{
HKEY rootk = NULL;
HKEY k = NULL;
DWORD ret = NO_ERROR;
if((ret = ConnectRegistry(pszMachine, &rootk)) != NO_ERROR)
goto Error;
// Cool, we have a machine registry entry, now get the
// path down to the routertype key
ret = RegOpenKeyEx(rootk, pszKeyUnderLocalMachine, 0, KEY_READ, &k);
if (ret != NO_ERROR)
goto Error;
// Ok, at this point we just need to get the RouterType value from
// the key
{
DWORD type = REG_SZ;
TCHAR value[MAX_PATH];
DWORD len = MAX_PATH;
ret = ::RegQueryValueEx(k, pszName, 0, &type, (LPBYTE )value, &len);
if(ret == ERROR_SUCCESS)
strValue = value;
}
Error:
if(rootk)
DisconnectRegistry(rootk);
if(k)
RegCloseKey(k);
return ret;
}
DWORD ReadRegistryDWORDValue(LPCTSTR pszMachine, LPCTSTR pszKeyUnderLocalMachine, LPCTSTR pszName, DWORD* pdwValue)
{
HKEY rootk = NULL;
HKEY k = NULL;
DWORD ret = NO_ERROR;
if((ret = ConnectRegistry(pszMachine, &rootk)) != NO_ERROR)
goto Error;
// Cool, we have a machine registry entry, now get the
// path down to the routertype key
ret = RegOpenKeyEx(rootk, pszKeyUnderLocalMachine, 0, KEY_READ, &k);
if (ret != NO_ERROR)
goto Error;
{
// Ok, at this point we just need to get the RouterType value from
// the key
DWORD type = REG_DWORD;
DWORD len = sizeof(DWORD);
ret = ::RegQueryValueEx(k, pszName, 0, &type, (LPBYTE )pdwValue, &len);
}
Error:
if(rootk)
DisconnectRegistry(rootk);
if(k)
RegCloseKey(k);
return ret;
}
//----------------------------------------------------------------------------
//
// helper functions to check if RRAS is using NT Authentication
//
//----------------------------------------------------------------------------
BOOL IsRRASUsingNTAuthentication(LPCTSTR pszMachine) // when NULL: local machine
{
::CString str;
BOOL ret = FALSE;
if(ERROR_SUCCESS == ReadRegistryStringValue(pszMachine,
RegKeyRouterAuthenticationProviders,
RegValueName_RouterActiveAuthenticationProvider,
str))
{
ret = (str.CompareNoCase(NTRouterAuthenticationProvider) == 0);
}
return ret;
}
//----------------------------------------------------------------------------
//
// helper functions to check if RRAS is configured
//
//----------------------------------------------------------------------------
BOOL IsRRASConfigured(LPCTSTR pszMachine) // when NULL: local machine
{
DWORD dwConfig= 0;
ReadRegistryDWORDValue(pszMachine,
RegRemoteAccessKey,
RegRtrConfigured,
&dwConfig);
return (dwConfig != 0);
}
//----------------------------------------------------------------------------
//
// helper function to check if RRAS is using NT accounting for logging
//
//----------------------------------------------------------------------------
BOOL IsRRASUsingNTAccounting(LPCTSTR pszMachine) // when NULL, local machine
{
::CString str;
BOOL ret = FALSE;
if(ERROR_SUCCESS == ReadRegistryStringValue(pszMachine,
RegKeyRouterAccountingProviders,
RegValueName_RouterActiveAccountingProvider,
str))
{
ret = (str.CompareNoCase(NTRouterAccountingProvider) == 0);
}
return ret;
};
void WriteTrace(char* info, HRESULT hr)
{
::CString str = info;
::CString str1;
str1.Format(str, hr);
TracePrintf(g_dwTraceHandle, str1);
};
static unsigned int s_cfComputerAddedAsLocal = RegisterClipboardFormat(L"MMC_MPRSNAP_COMPUTERADDEDASLOCAL");
BOOL ExtractComputerAddedAsLocal(LPDATAOBJECT lpDataObject)
{
BOOL fReturn = FALSE;
BOOL * pReturn;
pReturn = Extract<BOOL>(lpDataObject, (CLIPFORMAT) s_cfComputerAddedAsLocal, -1);
if (pReturn)
{
fReturn = *pReturn;
GlobalFree(pReturn);
}
return fReturn;
}