|
|
/********************************************************************
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); }
|