windows-nt/Source/XPSP1/NT/admin/pchealth/client/datacoll/atprov/util.cpp
2020-09-26 16:20:57 +08:00

308 lines
8.4 KiB
C++

/********************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
util.CPP
Abstract:
File containing utility classes
Revision History:
Ghim-Sim Chua (gschua) 04/27/99
- Created
Jim Martin (a-jammar) 04/30/99
- Changed to use global IWbemServices pointer, and added
GetWbemServices, CopyProperty, and GetCIMDataFile
Ghim-Sim Chua (gschua) 05/01/99
- Modified GetWbemServices, GetCIMDataFile
Kalyani Narlanka (kalyanin) 05/11/99
- Added the function GetCompletePath
********************************************************************/
#include "pchealth.h"
/////////////////////////////////////////////////////////////////////////////
// tracing stuff
#ifdef THIS_FILE
#undef THIS_FILE
#endif
static char __szTraceSourceFile[] = __FILE__;
#define THIS_FILE __szTraceSourceFile
#define TRACE_ID DCID_UTIL
/////////////////////////////////////////////////////////////////////////////
// utility functions
// ****************************************************************************
HRESULT GetWbemServices(IWbemServices **ppServices)
{
TraceFunctEnter("GetWbemServices");
IWbemLocator *pWbemLocator = NULL;
HRESULT hr = NOERROR;
// If global variable already initialized, use it
if (g_pWbemServices)
{
*ppServices = g_pWbemServices;
(*ppServices)->AddRef();
goto done;
}
// First we have the get the IWbemLocator object with a CoCreateInstance.
hr = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
IID_IUnknown, (void **)&pWbemLocator);
if (FAILED(hr))
{
ErrorTrace(TRACE_ID, "CoCreateInstance failed to create IWbemAdministrativeLocator.");
goto done;
}
// Then we connect to the WMI server for the local CIMV2 namespace.
hr = pWbemLocator->ConnectServer(CComBSTR(CIM_NAMESPACE), NULL, NULL, NULL, 0, NULL, NULL, ppServices);
if (FAILED(hr))
{
ErrorTrace(TRACE_ID, "ConnectServer failed to connect to cimv2 namespace.");
goto done;
}
// Store it in the global variable
g_pWbemServices = *ppServices;
// BUGBUG: check out why this stops fault on NET STOP WINMGMT
(*ppServices)->AddRef();
done:
if (pWbemLocator != NULL)
pWbemLocator->Release();
TraceFunctLeave();
return hr;
}
// ****************************************************************************
HRESULT ExecWQLQuery(IEnumWbemClassObject **ppEnumInst, BSTR bstrQuery)
{
TraceFunctEnter("ExecWQLQuery");
IWbemServices *pWbemServices = NULL;
HRESULT hr = NOERROR;
// Get pointer to WbemServices
hr = GetWbemServices(&pWbemServices);
if (FAILED(hr))
goto done;
// execute the query
hr = pWbemServices->ExecQuery(CComBSTR("WQL"), bstrQuery,
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY,
NULL, ppEnumInst);
if (FAILED(hr))
{
ErrorTrace(TRACE_ID, "ExecQuery failed: 0x%08x", hr);
goto done;
}
done:
if (pWbemServices != NULL)
pWbemServices->Release();
TraceFunctLeave();
return hr;
}
// ****************************************************************************
HRESULT CopyProperty(IWbemClassObject *pFrom, LPCWSTR szFrom, CInstance *pTo,
LPCWSTR szTo)
{
TraceFunctEnter("CopyProperty");
_ASSERT(pFrom && szFrom && pTo && szTo);
CComVariant varValue;
CComBSTR bstrFrom;
HRESULT hr = NOERROR;
// First, get the property (as a variant) from the source class object.
bstrFrom = szFrom;
hr = pFrom->Get(bstrFrom, 0, &varValue, NULL, NULL);
if (FAILED(hr))
{
ErrorTrace(TRACE_ID, "GetVariant on %s field failed.", szFrom);
}
else
{
// Then set the variant for the target CInstance object.
if (pTo->SetVariant(szTo, varValue) == FALSE)
{
ErrorTrace(TRACE_ID, "SetVariant on %s field failed.", szTo);
hr = WBEM_E_FAILED;
}
}
TraceFunctLeave();
return hr;
}
// ****************************************************************************
HRESULT GetCIMDataFile(BSTR bstrFile, IWbemClassObject **ppFileObject,
BOOL fHasDoubleSlashes)
{
TraceFunctEnter("GetCIMDataFile");
IWbemServices *pWbemServices = NULL;
HRESULT hr = NOERROR;
CComBSTR bstrObjectPath;
wchar_t *pwch;
UINT uLen;
if (bstrFile == NULL || ppFileObject == NULL)
{
ErrorTrace(TRACE_ID, "Parameter pointer is null.");
hr = WBEM_E_INVALID_PARAMETER;
goto done;
}
hr = GetWbemServices(&pWbemServices);
if (FAILED(hr))
goto done;
// Construct the path for the file we are trying to get. Note, the path needs
// the have double backslashes for the GetObject call to work. We scan through
// the string and do this manually here.
bstrObjectPath = "\\\\.\\root\\cimv2:CIM_DataFile.Name=\"";
pwch = bstrFile;
if (fHasDoubleSlashes)
{
bstrObjectPath.Append(pwch, SysStringLen(bstrFile));
}
else
{
for (uLen = SysStringLen(bstrFile); uLen > 0; uLen--)
{
if (*pwch == L'\\')
bstrObjectPath.Append("\\");
bstrObjectPath.Append(pwch, 1);
pwch++;
}
}
bstrObjectPath.Append("\"");
// Make the call to get the CIM_DataFile object.
hr = pWbemServices->GetObject(bstrObjectPath, 0, NULL, ppFileObject, NULL);
if (FAILED(hr))
ErrorTrace(TRACE_ID, "GetObject on CIM_DataFile failed.");
done:
if (pWbemServices != NULL)
pWbemServices->Release();
TraceFunctLeave();
return hr;
}
// ****************************************************************************
HRESULT GetCIMObj(BSTR bstrPath, IWbemClassObject **ppObj, long lFlags)
{
TraceFunctEnter("GetCIMObj");
IWbemServices *pWbemServices = NULL;
HRESULT hr = NOERROR;
if (bstrPath == NULL || ppObj == NULL)
{
ErrorTrace(TRACE_ID, "bad parameters");
hr = WBEM_E_INVALID_PARAMETER;
goto done;
}
// make sure we have a services object
hr = GetWbemServices(&pWbemServices);
if (FAILED(hr))
goto done;
// Make the call to get the CIM_DataFile object.
hr = pWbemServices->GetObject(bstrPath, lFlags, NULL, ppObj, NULL);
if (FAILED(hr))
ErrorTrace(TRACE_ID, "GetObject failed: 0x%08x", hr);
done:
if (pWbemServices != NULL)
pWbemServices->Release();
TraceFunctLeave();
return hr;
}
// ****************************************************************************
BOOL getCompletePath(CComBSTR bstrFileName, CComBSTR &bstrFileWithPathName)
{
// Return
BOOL bFoundFile = FALSE;
ULONG uiReturn;
TCHAR szDirectory[MAX_PATH];
TCHAR temp[MAX_PATH];
TCHAR lpstrTemp[MAX_PATH];
struct _stat filestat;
CComVariant varValue = NULL;
CComBSTR bstrDirectory;
// Check for the File in the System Directory
uiReturn = GetSystemDirectory(szDirectory, MAX_PATH);
if (uiReturn != 0 && uiReturn < MAX_PATH)
{
bstrDirectory = szDirectory;
bstrDirectory.Append("\\");
bstrDirectory.Append(bstrFileName);
USES_CONVERSION;
int Result = _tstat(W2T(bstrDirectory), &filestat) ;
if (Result == 0)
{
bstrFileWithPathName = bstrDirectory;
bFoundFile = TRUE;
}
}
// If not there, then check in the windows directory.
if (!bFoundFile)
{
uiReturn = GetWindowsDirectory(szDirectory, MAX_PATH);
if (uiReturn != 0 && uiReturn < MAX_PATH)
{
bstrDirectory = szDirectory;
bstrDirectory.Append("\\");
bstrDirectory.Append(bstrFileName);
USES_CONVERSION;
int Result = _tstat(W2T(bstrDirectory), &filestat) ;
if (Result == 0)
{
bstrFileWithPathName = bstrDirectory;
bFoundFile = TRUE;
}
}
}
return(bFoundFile);
}