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

231 lines
6.4 KiB
C++

//////////////////////////////////////////////////////////////////////////////
/*++
Copyright (C) Microsoft Corporation, 1997 - 1999
Module Name:
rtradvise.h
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
--*/
//////////////////////////////////////////////////////////////////////////////
#if !defined(_IAS_MMC_RTRADVISE_H_)
#define _IAS_MMC_RTRADVISE_H_
#include <rrasui.h>
#include <winreg.h>
#define RegKeyRouterAccountingProviders _T("System\\CurrentControlSet\\Services\\RemoteAccess\\Accounting\\Providers")
#define RegKeyRouterAuthenticationProviders _T("System\\CurrentControlSet\\Services\\RemoteAccess\\Authentication\\Providers")
#define RegRemoteAccessKey _T("System\\CurrentControlSet\\Services\\RemoteAccess")
#define RegRtrConfigured _T("ConfigurationFlags")
#define NTRouterAccountingProvider _T("{1AA7F846-C7F5-11D0-A376-00C04FC9DA04}")
#define NTRouterAuthenticationProvider _T("{1AA7F841-C7F5-11D0-A376-00C04FC9DA04}")
#define RegValueName_RouterActiveAuthenticationProvider _T("ActiveProvider")
#define RegValueName_RouterActiveAccountingProvider _T("ActiveProvider")
void WriteTrace(char* info, HRESULT hr);
//----------------------------------------------------------------------------
// Function: ConnectRegistry
//
// Connects to the registry on the specified machine
//----------------------------------------------------------------------------
DWORD ConnectRegistry(
IN LPCTSTR pszMachine, // NULL if local
OUT HKEY* phkeyMachine
);
//----------------------------------------------------------------------------
// Function: DisconnectRegistry
//
// Disconnects the specified config-handle. The handle is assumed to have been
// acquired by calling 'ConnectRegistry'.
//----------------------------------------------------------------------------
VOID DisconnectRegistry( IN HKEY hkeyMachine );
DWORD ReadRegistryStringValue(LPCTSTR pszMachine, LPCTSTR pszKeyUnderLocalMachine, LPCTSTR pszName, ::CString& strValue);
DWORD ReadRegistryDWORDValue(LPCTSTR pszMachine, LPCTSTR pszKeyUnderLocalMachine, LPCTSTR pszName, DWORD* pdwValue);
BOOL IsRRASConfigured(LPCTSTR pszMachine); // when NULL: local machine
//----------------------------------------------------------------------------
//
// helper functions to check if RRAS is using NT Authentication
//
//----------------------------------------------------------------------------
BOOL IsRRASUsingNTAuthentication(LPCTSTR pszMachine); // when NULL: local machine
//----------------------------------------------------------------------------
//
// helper function to check if RRAS is using NT accounting for logging
//
//----------------------------------------------------------------------------
BOOL IsRRASUsingNTAccounting(LPCTSTR pszMachine); // when NULL, local machine
/////////////////////////////////////////////////////////////////////////////
// CRtrAdviseSinkForIAS
template <class TSnapinNode>
class ATL_NO_VTABLE CRtrAdviseSinkForIAS :
public CComObjectRoot,
public IRtrAdviseSink
{
BEGIN_COM_MAP(CRtrAdviseSinkForIAS)
COM_INTERFACE_ENTRY(IRtrAdviseSink)
END_COM_MAP()
public:
CRtrAdviseSinkForIAS() : m_pSnapinNode(NULL){};
~CRtrAdviseSinkForIAS()
{
ReleaseSink();
};
// Need to call ReleaseSink when the snapin node is removed,
void ReleaseSink()
{
if(m_pSnapinNode)
{
WriteTrace("UnadviseRefresh, snapinnode: ", (DWORD_PTR)m_pSnapinNode);
ASSERT(m_spRouterRefresh != NULL);
m_spRouterRefresh->UnadviseRefresh(m_ulConnection);
m_spRouterRefresh.Release();
m_pSnapinNode = NULL;
};
};
public:
STDMETHOD(OnChange)(
/* [in] */ LONG_PTR ulConnection,
/* [in] */ DWORD dwChangeType,
/* [in] */ DWORD dwObjectType,
/* [in] */ LPARAM lUserParam,
/* [in] */ LPARAM lParam)
{
if(m_pSnapinNode)
return m_pSnapinNode->OnRRASChange(ulConnection, dwChangeType, dwObjectType, lUserParam, lParam);
else
return S_OK;
};
// the object is created within the static function, and
static CRtrAdviseSinkForIAS<TSnapinNode>* SetAdvise(TSnapinNode* pSnapinNode, IDataObject* pRRASDataObject)
{
if(pSnapinNode == NULL || pRRASDataObject == NULL)
return NULL;
// RRAS refresh advise setup F bug 213623:
CComPtr<IRouterRefreshAccess> spRefreshAccess;
CComPtr<IRouterRefresh> spRouterRefresh;
CComObject< CRtrAdviseSinkForIAS<TSnapinNode> >* pSink = NULL;
pRRASDataObject->QueryInterface(IID_IRouterRefreshAccess, (void**)&spRefreshAccess);
if(spRefreshAccess != NULL)
spRefreshAccess->GetRefreshObject(&spRouterRefresh);
if(spRouterRefresh != NULL)
{
if(S_OK == CComObject< CRtrAdviseSinkForIAS<TSnapinNode> >::CreateInstance(&pSink))
{
ASSERT(pSink);
pSink->AddRef();
LONG_PTR ulConnection;
WriteTrace("AdviseRefresh, snapinnode: ", (DWORD_PTR)pSnapinNode);
spRouterRefresh->AdviseRefresh(pSink, &ulConnection, (LONG_PTR)pSnapinNode);
pSink->m_ulConnection = ulConnection;
pSink->m_pSnapinNode = pSnapinNode;
pSink->m_spRouterRefresh = spRouterRefresh;
}
}
// ~RRAS
return pSink;
};
public:
LONG_PTR m_ulConnection;
TSnapinNode* m_pSnapinNode;
CComPtr<IRouterRefresh> m_spRouterRefresh;
};
BOOL ExtractComputerAddedAsLocal(LPDATAOBJECT lpDataObject);
//
// Extracts a data type from a data object
//
template <class TYPE>
TYPE* Extract(LPDATAOBJECT lpDataObject, CLIPFORMAT cf, int nSize)
{
ASSERT(lpDataObject != NULL);
TYPE* p = NULL;
STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL };
FORMATETC formatetc = { cf, NULL,
DVASPECT_CONTENT, -1, TYMED_HGLOBAL
};
int len;
// Allocate memory for the stream
if (nSize == -1)
{
len = sizeof(TYPE);
}
else
{
//int len = (cf == CDataObject::m_cfWorkstation) ?
// ((MAX_COMPUTERNAME_LENGTH+1) * sizeof(TYPE)) : sizeof(TYPE);
len = nSize;
}
stgmedium.hGlobal = GlobalAlloc(GMEM_SHARE, len);
// Get the workstation name from the data object
do
{
if (stgmedium.hGlobal == NULL)
break;
if (FAILED(lpDataObject->GetDataHere(&formatetc, &stgmedium)))
break;
p = reinterpret_cast<TYPE*>(stgmedium.hGlobal);
if (p == NULL)
break;
} while (FALSE);
return p;
}
#endif // _IAS_MMC_RTRADVISE_H_