Beispiel #1
0
IWbemClassObject* CConsumer::GetEventCategoryClass(BSTR bstrclassGuid, int Version)
{
	HRESULT hr = S_OK;
	HRESULT hrQualifier = S_OK;
	IEnumWbemClassObject* pClasses = NULL;
	IWbemClassObject* pClass = NULL;
	IWbemQualifierSet* pQualifiers = NULL;
	ULONG cnt = 0;
	VARIANT varGuid;
	VARIANT varVersion;

	hr = g_pServices->CreateClassEnum(_bstr_t(L"EventTrace"),
		WBEM_FLAG_DEEP | WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_USE_AMENDED_QUALIFIERS,
		NULL, &pClasses);

	if(FAILED(hr))
	{
		wprintf(L"CreateClassEnum failed with 0x%x\r\n", hr);
		goto cleanup;
	}
	while(S_OK == hr)
	{
		hr = pClasses->Next(WBEM_INFINITE, 1, &pClass, &cnt);
		if(FAILED(hr))
		{
			wprintf(L"pClasses->Next Failed with 0x%x\r\n", hr);
			goto cleanup;
		}
		hrQualifier = pClass->GetQualifierSet(&pQualifiers);
		if(pQualifiers)
		{
			hrQualifier = pQualifiers->Get(L"Guid", 0, &varGuid, NULL);
			if(SUCCEEDED(hrQualifier) && 0 == _wcsicmp(varGuid.bstrVal, bstrclassGuid))
			{
				hrQualifier = pQualifiers->Get(L"EventVersion", 0, &varVersion, NULL);
				if(SUCCEEDED(hrQualifier))
				{
					if(Version == varVersion.intVal)
					{
						break;
					}
					VariantClear(&varVersion);
				}
				else if(WBEM_E_NOT_FOUND == hrQualifier)
				{
					break;
				}
				VariantClear(&varGuid);
			}
			pQualifiers->Release();
			pQualifiers = NULL;
		}
		pClass->Release();
		pClass = NULL;
	}
cleanup:
	if(pClasses)
	{
		pClasses->Release();
		pClasses = NULL;
	}
	if(pQualifiers)
	{
		pQualifiers->Release();
		pQualifiers = NULL;
	}
	VariantClear(&varGuid);
	VariantClear(&varVersion);
	return pClass;
}
Beispiel #2
0
IWbemClassObject* CConsumer::GetEventClass(IWbemClassObject* pEventCategoryClass, int EventType)
{
	HRESULT hr = S_OK;
	HRESULT hrQualifier = S_OK;
	IEnumWbemClassObject *pClasses = NULL;
	IWbemClassObject *pClass = NULL;
	IWbemQualifierSet *pQualifiers = NULL;
	VARIANT varClassName;
	VARIANT varEventType;
	ULONG cnt = 0;
	BOOL FoundEventClass = FALSE;

	hr = pEventCategoryClass->Get(L"__RELPATH", 0, &varClassName,NULL,NULL);
	if(FAILED(hr))
	{ 
		wprintf(L"pEventCategory->Get failed with 0x%x\r\n", hr);
		goto cleanup;
	}
	hr = g_pServices->CreateClassEnum(varClassName.bstrVal,
		WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_USE_AMENDED_QUALIFIERS,
		NULL, &pClasses);

	if(FAILED(hr))
	{
		wprintf(L"g_pServices->CreateClassEnum failed with 0x%x\r\n", hr);
		goto cleanup;
	}

	while(S_OK == hr)
	{
		hr = pClasses->Next(WBEM_INFINITE,1, &pClass, &cnt);
		if(FAILED(hr))
		{
			wprintf(L"pClass->Next Failed with 0x%x\r\n", hr);
			goto cleanup;
		}
		if(!pClass)
			continue;
		hrQualifier = pClass->GetQualifierSet(&pQualifiers);
		if(FAILED(hrQualifier))
		{
			wprintf(L"pClass->GetQualifierSet Failed with 0x%x\r\n", hrQualifier);
			pClass->Release();
			pClass = NULL;
			goto cleanup;
		}

		hrQualifier = pQualifiers->Get(L"EventType", 0, &varEventType, NULL);
		if(FAILED(hrQualifier))
		{
			wprintf(L"pQualifiers->Get Failed with 0x%x\r\n", hrQualifier);
			pQualifiers->Release();
			pQualifiers = NULL;
			pClass->Release();
			pClass = NULL;
			goto cleanup;
		}

		// If multiple events provide the same data, the EventType qualifier
		// will contain an array of types. Loop through the array and find a match.

		if (varEventType.vt & VT_ARRAY)
		{
			HRESULT hrSafe = S_OK;
			int ClassEventType;
			SAFEARRAY* pEventTypes = varEventType.parray;

			for (LONG i=0; (ULONG)i < pEventTypes->rgsabound->cElements; i++)
			{
				hrSafe = SafeArrayGetElement(pEventTypes, &i, &ClassEventType);

				if (ClassEventType == EventType)
				{
					FoundEventClass = TRUE;
					break;  //for loop
				}
			}
		}
		else
		{
			if (varEventType.intVal == EventType)
			{
				FoundEventClass = TRUE;
			}
		}

		VariantClear(&varEventType);

		if (TRUE == FoundEventClass)
		{
			break;  //while loop
		}

		pClass->Release();
		pClass = NULL;

	}
cleanup:
	if (pClasses)
	{
		pClasses->Release();
		pClasses = NULL;
	}

	if (pQualifiers)
	{
		pQualifiers->Release();
		pQualifiers = NULL;
	}

	VariantClear(&varClassName);
	VariantClear(&varEventType);

	return pClass;
}