WindowsXP-SP1/admin/hmonitor/hmagent/wmihelper.cpp
2020-09-30 16:53:49 +02:00

947 lines
19 KiB
C++

//***************************************************************************
//
// WMIHELPER.CPP
//
// Module: HEALTHMON SERVER AGENT
//
// Purpose: Helper functions and wrappers around WMI
//
// Copyright (c)1999 Microsoft Corporation, All Rights Reserved
//
//***************************************************************************
#include "global.h"
#include "wmihelper.h"
extern HMODULE g_hWbemComnModule;
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////PROPERTY GETS///////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
HRESULT GetStrProperty(IWbemClassObject *pObj, LPTSTR pszProp, LPTSTR *pszString)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** GetStrProperty...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
if ((hRetRes = pObj->Get(pszPropIn, 0L, &v, NULL, NULL)) == S_OK)
{
if (V_VT(&v)==VT_NULL)
{
*pszString = new TCHAR[2];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
wcscpy(*pszString , L"");
}
}
else
{
MY_ASSERT(V_VT(&v)==VT_BSTR);
*pszString = new TCHAR[wcslen(V_BSTR(&v))+2];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
wcscpy(*pszString , V_BSTR(&v));
}
}
}
else
{
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** GetStrProperty...", 0);
return hRetRes;
}
HRESULT GetAsStrProperty(IWbemClassObject *pObj, LPTSTR pszProp, LPTSTR *pszString)
{
LPTSTR pszPropIn;
TCHAR szTemp[1024];
HRESULT hRetRes = S_OK;
VARIANT v;
BOOL bBool;
MY_OUTPUT(L"ENTER ***** GetAsStrProperty...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
if ((hRetRes = pObj->Get(pszPropIn, 0L, &v, NULL, NULL)) == S_OK)
{
if (V_VT(&v)==VT_NULL)
{
*pszString = new TCHAR[6];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
wcscpy(*pszString , L"NULL");
}
}
else if (V_VT(&v)==VT_I4)
{
_ultow(V_I4(&v), szTemp, 10);
*pszString = new TCHAR[wcslen(szTemp)+1];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
wcscpy(*pszString, szTemp);
}
}
else if (V_VT(&v)==VT_BSTR)
{
*pszString = new TCHAR[wcslen(V_BSTR(&v))+2];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
wcscpy(*pszString, V_BSTR(&v));
}
}
else if (V_VT(&v)==VT_R4)
{
swprintf(szTemp, L"%f.", V_R4(&v));
*pszString = new TCHAR[wcslen(szTemp)+1];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
wcscpy(*pszString, szTemp);
}
}
else if (V_VT(&v)==VT_BOOL)
{
bBool = V_BOOL(&v);
*pszString = new TCHAR[2];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
if (bBool != 0.0)
{
wcscpy(*pszString, L"1");
}
else
{
wcscpy(*pszString, L"2");
}
}
}
else if (V_VT(&v)==VT_R8)
{
swprintf(szTemp, L"%lf", V_R8(&v));
*pszString = new TCHAR[wcslen(szTemp)+1];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
wcscpy(*pszString, szTemp);
}
}
else if (V_VT(&v)==VT_I2)
{
swprintf(szTemp, L"%i", V_I2(&v));
*pszString = new TCHAR[wcslen(szTemp)+1];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
wcscpy(*pszString, szTemp);
}
}
else if (V_VT(&v)==VT_UI1)
{
swprintf(szTemp, L"%u", V_UI1(&v));
*pszString = new TCHAR[wcslen(szTemp)+1];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
wcscpy(*pszString, szTemp);
}
}
else
{
// If for example we had a VT_BSTR | VT_ARRAY would we end up here.
*pszString = new TCHAR[4];
MY_ASSERT(*pszString);
if (!*pszString)
{
hRetRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
wcscpy(*pszString, L"???");
}
}
}
else
{
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** GetAsStrProperty...", 0);
return hRetRes;
}
HRESULT GetReal32Property(IWbemClassObject *pObj, LPTSTR pszProp, float *pFloat)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** GetReal32Property...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
if ((hRetRes = pObj->Get(pszPropIn, 0L, &v, NULL, NULL)) == S_OK)
{
if (V_VT(&v)==VT_NULL)
{
MY_ASSERT(FALSE);
*pFloat = 0;
}
else
{
MY_ASSERT(V_VT(&v)==VT_R4);
*pFloat = V_R4(&v);
}
}
else
{
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** GetReal32Property...", 0);
return hRetRes;
}
HRESULT GetUint8Property(IWbemClassObject *pObj, LPTSTR pszProp, int *pInt)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** GetUint8Property...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
if ((hRetRes = pObj->Get(pszPropIn, 0L, &v, NULL, NULL)) == S_OK)
{
if (V_VT(&v)==VT_NULL)
{
MY_ASSERT(FALSE);
*pInt = 0;
}
else
{
MY_ASSERT(V_VT(&v)==VT_UI1);
*pInt = V_UI1(&v);
}
}
else
{
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** GetUint8Property...", 0);
return hRetRes;
}
HRESULT GetUint32Property(IWbemClassObject *pObj, LPTSTR pszProp, long *pLong)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** GetUint32Property...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
if ((hRetRes = pObj->Get(pszPropIn, 0L, &v, NULL, NULL)) == S_OK)
{
if (V_VT(&v)==VT_NULL)
{
MY_ASSERT(FALSE);
*pLong = 0;
}
else
{
MY_ASSERT(V_VT(&v)==VT_I4);
*pLong = V_I4(&v);
}
}
else
{
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** GetUint32Property...", 0);
return hRetRes;
}
HRESULT GetUint64Property(IWbemClassObject *pObj, LPTSTR pszProp, unsigned __int64 *pInt64)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** GetUint64Property...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
if ((hRetRes = pObj->Get(pszPropIn, 0L, &v, NULL, NULL)) == S_OK)
{
if (V_VT(&v)==VT_NULL)
{
MY_ASSERT(FALSE);
*pInt64 = 0;
}
else
{
MY_ASSERT(V_VT(&v)==VT_BSTR);
*pInt64 = 0;
ReadUI64(V_BSTR(&v), *pInt64);
}
}
else
{
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** GetUint64Property...", 0);
return hRetRes;
}
HRESULT GetBoolProperty(IWbemClassObject *pObj, LPTSTR pszProp, BOOL *pBool)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** GetBoolProperty...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
if ((hRetRes = pObj->Get(pszPropIn, 0L, &v, NULL, NULL)) == S_OK)
{
if (V_VT(&v)==VT_NULL)
{
MY_ASSERT(FALSE);
*pBool = (BOOL)0.0;
}
else
{
MY_ASSERT(V_VT(&v)==VT_BOOL);
*pBool = V_BOOL(&v);
if (*pBool != 0.0)
{
*pBool = (BOOL)1.0;
}
}
}
else
{
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** GetBoolProperty...", 0);
return hRetRes;
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////PROPERTY PUTS///////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
HRESULT PutSAProperty(IWbemClassObject *pClassObject, LPTSTR pszProp, SAFEARRAY* psa)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** PutSAProperty...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
V_VT(&v) = VT_UNKNOWN | VT_ARRAY;
V_ARRAY(&v) = psa;
if ((hRetRes = pClassObject->Put(pszPropIn, 0, &v, 0)) != S_OK)
{
MY_OUTPUT(L"Couldn't do an SA put", 4);
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** PutSAProperty...", 0);
return hRetRes;
}
HRESULT PutStrProperty(IWbemClassObject *pClassObject, LPTSTR pszProp, LPTSTR pszString)
{
BSTR bstrString;
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** PutSAProperty...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
//XXXWhat want to put a NULL??? Same question for all Put methods.
//On the other hand, if the default for the class property is NULL, then don't need it
if (!pszString)
{
return S_OK;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
V_VT(&v) = VT_BSTR;
if (pszString[0] == '\0')
{
bstrString = SysAllocString(L" ");
MY_ASSERT(bstrString); if (!bstrString) {return WBEM_E_OUT_OF_MEMORY;}
bstrString[0] = '\0';
}
else
{
bstrString = SysAllocString(pszString);
}
MY_ASSERT(bstrString); if (!bstrString) {return WBEM_E_OUT_OF_MEMORY;}
V_BSTR(&v) = bstrString;
if ((hRetRes = pClassObject->Put(pszPropIn, 0, &v, 0)) != S_OK)
{
MY_OUTPUT(L"Couldn't do a string put", 4);
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** PutStrProperty...", 0);
return hRetRes;
}
HRESULT PutUint32Property(IWbemClassObject *pClassObject, LPTSTR pszProp, long lValue)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** PutUint32Property...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
V_VT(&v) = VT_I4;
V_I4(&v) = lValue;
if ((hRetRes = pClassObject->Put(pszPropIn, 0, &v, 0)) != S_OK)
{
MY_OUTPUT(L"Couldn't do a uint32 put", 4);
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** PutUint32Property...", 0);
return hRetRes;
}
HRESULT PutUUint32Property(IWbemClassObject *pClassObject, LPTSTR pszProp, unsigned long ulValue)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** PutUint32Property...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
V_VT(&v) = VT_I4;
V_I4(&v) = ulValue;
if ((hRetRes = pClassObject->Put(pszPropIn, 0, &v, 0)) != S_OK)
{
MY_OUTPUT(L"Couldn't do a uint32 put", 4);
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** PutUint32Property...", 0);
return hRetRes;
}
HRESULT PutReal32Property(IWbemClassObject *pClassObject, LPTSTR pszProp, float fValue)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** PutReal32Property...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
V_VT(&v) = VT_R4;
V_R4(&v) = fValue;
if ((hRetRes = pClassObject->Put(pszPropIn, 0, &v, 0)) != S_OK)
{
MY_OUTPUT(L"Couldn't do a real32 put", 4);
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** PutReal32Property...", 0);
return hRetRes;
}
HRESULT PutBoolProperty(IWbemClassObject *pClassObject, LPTSTR pszProp, BOOL bValue)
{
LPTSTR pszPropIn;
VARIANT v;
HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** PutBoolProperty...", 0);
MY_ASSERT(pszProp);
if (!pszProp)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszProp[0] == '\0')
{
pszPropIn = L" ";
}
else
{
pszPropIn = pszProp;
}
VariantInit(&v);
V_VT(&v) = VT_BOOL;
V_BOOL(&v) = (short) bValue;
if ((hRetRes = pClassObject->Put(pszPropIn, 0, &v, 0)) != S_OK)
{
MY_OUTPUT(L"Couldn't do a bool put", 4);
MY_HRESASSERT(hRetRes);
}
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** PutBoolProperty...", 0);
return hRetRes;
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////QUALIFIER GETS//////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////MISC GETS///////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
HRESULT GetWbemObjectInst(IWbemServices** ppSvc, LPCTSTR pszName, IWbemContext *pContext, IWbemClassObject **pOutObj)
{
HRESULT hRetRes = S_OK;
BSTR bstrClassName = NULL;
*pOutObj = NULL;
MY_OUTPUT(L"ENTER ***** GetWbemObjectInst...", 0);
MY_ASSERT(pszName);
if (!pszName)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszName[0] == '\0')
{
bstrClassName = SysAllocString(L" ");
MY_ASSERT(bstrClassName); if (!bstrClassName) return WBEM_E_OUT_OF_MEMORY;
bstrClassName[0] = '\0';
}
else
{
bstrClassName = SysAllocString(pszName);
}
MY_ASSERT(bstrClassName); if (!bstrClassName) return WBEM_E_OUT_OF_MEMORY;
hRetRes = (*ppSvc)->GetObject(bstrClassName, 0L, pContext, pOutObj, NULL);
if (FAILED(hRetRes))
{
MY_OUTPUT(L"GetWbemObjectInst:Failed to get object instance", 0);
// MY_HRESASSERT(hRetRes);
}
SysFreeString(bstrClassName);
MY_OUTPUT(L"EXIT ***** GetWbemObjectInst...", 0);
return hRetRes;
}
HRESULT GetWbemObjectInstSemiSync(IWbemServices** ppSvc, LPCTSTR pszName, IWbemContext *pContext, IWbemCallResult **pOutObj)
{
HRESULT hRetRes = S_OK;
BSTR bstrPropName = NULL;
MY_OUTPUT(L"ENTER ***** GetWbemObjectInstSemiSync...", 0);
MY_ASSERT(pszName);
if (!pszName)
{
return WBEM_E_INVALID_PROPERTY;
}
if (pszName[0] == '\0')
{
bstrPropName = SysAllocString(L" ");
MY_ASSERT(bstrPropName); if (!bstrPropName) return WBEM_E_OUT_OF_MEMORY;
bstrPropName[0] = '\0';
}
else
{
bstrPropName = SysAllocString(pszName);
}
MY_ASSERT(bstrPropName); if (!bstrPropName) return WBEM_E_OUT_OF_MEMORY;
hRetRes = (*ppSvc)->GetObject(bstrPropName, WBEM_FLAG_RETURN_IMMEDIATELY, pContext, NULL, pOutObj);
if (FAILED(hRetRes))
{
MY_OUTPUT(L"GetWbemObjectInst:Failed to get object instance", 0);
MY_HRESASSERT(hRetRes);
}
SysFreeString(bstrPropName);
MY_OUTPUT(L"EXIT ***** GetWbemObjectInstSemiSync...", 0);
return hRetRes;
}
HRESULT SendEvents(IWbemObjectSink* pEventSink, IWbemClassObject** pInstances, int iSize)
{
HRESULT hRetRes = S_OK;
if (iSize == 0)
return S_FALSE;
// Send event to the sink if there's a listener
if (pEventSink)
{
hRetRes = pEventSink->Indicate(iSize, pInstances);
//WBEM_E_SERVER_TOO_BUSY is Ok. Wbem will deliver.
if (FAILED(hRetRes) && hRetRes != WBEM_E_SERVER_TOO_BUSY)
{
MY_OUTPUT(L"Failed on Indicate!", 4);
MY_HRESASSERT(hRetRes);
}
}
return hRetRes;
}
HRESULT GetWbemClassObject(IWbemClassObject** ppObj, VARIANT* v)
{
HRESULT hRetRes = S_OK;
IUnknown* pDispatch = (IUnknown*)V_UNKNOWN(v);
pDispatch->AddRef();
hRetRes = pDispatch->QueryInterface(IID_IWbemClassObject, (LPVOID*)ppObj);
MY_HRESASSERT(hRetRes);
pDispatch->Release();
return hRetRes;
}
// This is only filled in if the provider supplies it, and in most cases it does not.
// Try using IWbemStatusText, or some other interface
BOOL GetLatestWMIError(int code, HRESULT hResIn, LPTSTR pszString)
{
LPVOID lpMsgBuf;
VARIANT varString;
SCODE sc;
IWbemClassObject *pErrorObject = NULL;
IErrorInfo* pEI = NULL;
TCHAR szError[1024];
if(GetErrorInfo(0, &pEI) == S_OK)
{
pEI->QueryInterface(IID_IWbemClassObject, (void**)&pErrorObject);
pEI->Release();
}
if (pErrorObject != NULL)
{
VariantInit(&varString);
if (pErrorObject->InheritsFrom(L"__ExtendedStatus") == WBEM_NO_ERROR)
{
sc = pErrorObject->Get(L"Description", 0L, &varString, NULL, NULL);
if (sc != S_OK)
{
if (g_hResLib == NULL || !LoadString(g_hResLib, HMRES_MISSINGDESC, pszString, 1023))
{
wcscpy(pszString, L"Unknown string. (Can't locate resource DLL)");
}
else
{
swprintf(szError, L"0x%08x : ", sc);
wcsncat(pszString, szError, 1023-wcslen(pszString));
pszString[1023] = '\0';
}
}
else if (V_VT(&varString) == VT_BSTR)
{
if (g_hResLib == NULL || !LoadString(g_hResLib, HMRES_DESC, pszString, 1023))
{
wcscpy(pszString, L"Unknown string. (Can't locate resource DLL)");
}
else
{
swprintf(szError, L"%256wS.", V_BSTR(&varString));
wcscat(pszString, szError);
}
}
VariantClear(&varString);
}
else
{
if (g_hResLib == NULL || !LoadString(g_hResLib, HMRES_BADERROR, pszString, 1023))
{
wcscpy(pszString, L"Unknown string. (Can't locate resource DLL)");
}
}
pErrorObject->Release();
}
szError[0] = '\0';
GetLatestAgentError(code, szError);
wcsncat(pszString, szError, 1023-wcslen(pszString));
pszString[1023] = '\0';
wsprintf(szError, L" 0x%08x : ", hResIn);
wcsncat(pszString, szError, 1023-wcslen(pszString));
pszString[1023] = '\0';
if (g_hWbemComnModule)
{
FormatMessage(FORMAT_MESSAGE_MAX_WIDTH_MASK|FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_HMODULE,
g_hWbemComnModule, hResIn, 0, (LPTSTR) &lpMsgBuf, 0, NULL);
//MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //The user default language
if (lpMsgBuf)
{
wcsncat(pszString, (LPCTSTR)lpMsgBuf, 1023-wcslen(pszString));
pszString[1023] = '\0';
LocalFree(lpMsgBuf);
wcsncat(pszString, L". ", 1023-wcslen(pszString));
pszString[1023] = '\0';
}
}
return TRUE;
}
BOOL GetLatestAgentError(int code, LPTSTR pszString)
{
if (g_hResLib == NULL || !LoadString(g_hResLib, code, pszString, 1023))
{
wcscpy(pszString, L"Unknown state. (Can't locate resource DLL)");
}
return TRUE;
}