2025-04-27 07:49:33 -04:00

156 lines
3.7 KiB
C++

//***************************************************************************
//
// Copyright (c) 1997-1999 Microsoft Corporation
//
// CONCACHE.CPP
//
// alanbos 13-Feb-98 Created.
//
// implementation of the CXMLConnectionCache class.
//
//***************************************************************************
#include "precomp.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CXMLConnectionCache::CXMLConnectionCache()
{
m_pLocator = NULL;
// Get OS info
OSVERSIONINFO osVersionInfo;
osVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx (&osVersionInfo);
m_dwCapabilities = EOAC_NONE;
if ((VER_PLATFORM_WIN32_NT == osVersionInfo.dwPlatformId) &&
(4 < osVersionInfo.dwMajorVersion))
m_dwCapabilities |= EOAC_STATIC_CLOAKING;
#if 0
m_pConnection = NULL;
InitializeCriticalSection (&m_cs);
#endif
}
CXMLConnectionCache::~CXMLConnectionCache()
{
if (m_pLocator)
m_pLocator->Release ();
#if 0
EnterCriticalSection (&m_cs);
// Clean up the connection cache
for (CXMLConnection *pConnection = m_pConnection; pConnection != NULL;)
{
CXMLConnection *pTemp = pConnection;
pConnection = pTemp->Next;
delete pTemp;
}
LeaveCriticalSection (&m_cs);
DeleteCriticalSection (&m_cs);
#endif
}
HRESULT CXMLConnectionCache::GetConnectionByPath (BSTR pszNamespace, IWbemServices **ppService)
{
HRESULT hr = WBEM_E_FAILED;
*ppService = NULL;
// If we don't have a locator yet, create one
if (NULL == m_pLocator)
{
if (S_OK != CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &m_pLocator))
return WBEM_E_FAILED;
}
// Leave out caching for now as DCOM may timeout idle IWbemServices pointers
// for us (yuck)
#if 0
// Is our connection already in the cache?
EnterCriticalSection (&m_cs);
for (CXMLConnection *pConnection = m_pConnection; pConnection != NULL;
pConnection = pConnection->Next)
{
if (pConnection->MatchesNamespace (pszNamespace))
{
// Found it - just AddRef and return
*ppService = pConnection->GetService ();
(*ppService)->AddRef ();
LeaveCriticalSection (&m_cs);
return WBEM_S_NO_ERROR;
}
}
// If we get here we didn't find an existing service
if (WBEM_S_NO_ERROR == (hr = m_pLocator->ConnectServer
(pszNamespace, NULL, NULL, NULL, 0, NULL, NULL, ppService)))
{
// Success - add it into our cache
(*ppService)->AddRef ();
CXMLConnection *pConnection = new CXMLConnection (*ppService, pszNamespace);
// Chain in at the front of the connection list
if (m_pConnection)
{
pConnection->Next = m_pConnection->Next;
m_pConnection->Prev = pConnection;
}
else
pConnection->Next = NULL;
m_pConnection = pConnection;
}
LeaveCriticalSection (&m_cs);
#else
if (SUCCEEDED (hr = m_pLocator->ConnectServer (pszNamespace, NULL, NULL, NULL, 0, NULL, NULL, ppService)))
SecureWmiProxy (*ppService);
#endif
return hr;
}
void CXMLConnectionCache::SecureWmiProxy (IUnknown *pProxy)
{
if (pProxy)
{
// Ensure we have impersonation enabled
DWORD dwAuthnLevel, dwImpLevel;
GetAuthImp (pProxy, &dwAuthnLevel, &dwImpLevel);
SetInterfaceSecurity (pProxy, NULL, NULL, NULL, dwAuthnLevel, RPC_C_IMP_LEVEL_IMPERSONATE,
m_dwCapabilities);
}
}
#if 0
void NormalizeNamespacePath (BSTR pszNamespace)
{
if (pszNamespace)
{
wchar_t *pStr = pszNamespace;
int len = wcslen (pStr);
for (int i = 0 ; i < len; i++)
{
if (iswupper (pStr [i]))
pStr [i] = towlower (pStr [i]);
else if (L'\\' == pStr [i])
pStr [i] = L'/';
}
}
}
#endif