308 lines
8.4 KiB
C++
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);
|
||
|
}
|
||
|
|