You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
381 lines
15 KiB
381 lines
15 KiB
//*****************************************************************************
|
|
//
|
|
// Copyright (c) 1996-1999, Microsoft Corporation, All rights reserved
|
|
//
|
|
// EVENTREP.H
|
|
//
|
|
// This file contains basic definitions and classes for event representation.
|
|
//
|
|
// Classes defined:
|
|
//
|
|
// CEventRepresentation
|
|
//
|
|
// History:
|
|
//
|
|
// 11/27/96 a-levn Compiles.
|
|
//
|
|
//*****************************************************************************
|
|
|
|
#ifndef __EVENT_REP__H_
|
|
#define __EVENT_REP__H_
|
|
|
|
#include <wbemidl.h>
|
|
#include <wbemint.h>
|
|
#include "parmdefs.h"
|
|
#include <wbemcomn.h>
|
|
#include <TimeKeeper.h>
|
|
|
|
|
|
// Class and property names of the schema objects related to event subsystem
|
|
// =========================================================================
|
|
|
|
#define SECURITY_DESCRIPTOR_PROPNAME L"SECURITY_DESCRIPTOR"
|
|
|
|
#define EVENT_PROVIDER_REGISTRATION_CLASS L"__EventProviderRegistration"
|
|
#define PROVIDER_CLASS L"__Provider"
|
|
#define EVENT_FILTER_CLASS L"__EventFilter"
|
|
#define BASE_STANDARD_FILTER_CLASS L"__BaseStandardEventFilter"
|
|
#define CONSUMER_CLASS L"__EventConsumer"
|
|
#define BINDING_CLASS L"__FilterToConsumerBinding"
|
|
#define GENERATOR_CLASS L"__EventGenerator"
|
|
#define GENERATOR_BINDING_CLASS L"__GeneratorToConsumerBinding"
|
|
#define TIMER_BASE_CLASS L"__TimerInstruction"
|
|
#define TIMER_ABSOLUTE_CLASS L"__AbsoluteTimerInstruction"
|
|
#define TIMER_INTERVAL_CLASS L"__IntervalTimerInstruction"
|
|
#define WIN32_PROVIDER_CLASS L"__Win32Provider"
|
|
#define CONSUMER_PROVIDER_REGISTRATION_CLASS \
|
|
L"__EventConsumerProviderRegistration"
|
|
#define EVENT_DROP_CLASS L"__EventDroppedEvent"
|
|
#define QUEUE_OVERFLOW_CLASS L"__EventQueueOverflowEvent"
|
|
#define CONSUMER_FAILURE_CLASS L"__ConsumerFailureEvent"
|
|
#define QOS_FAILURE_CLASS L"__QoSFailureEvent"
|
|
|
|
#define OWNER_SID_PROPNAME L"CreatorSID"
|
|
|
|
#define FILTER_ROLE_NAME L"Filter"
|
|
#define CONSUMER_ROLE_NAME L"Consumer"
|
|
#define BINDING_QOS_PROPNAME L"DeliveryQoS"
|
|
#define BINDING_SYNCHRONICITY_PROPNAME L"DeliverSynchronously"
|
|
#define BINDING_SECURE_PROPNAME L"MaintainSecurityContext"
|
|
#define BINDING_SLOWDOWN_PROPNAME L"SlowDownProviders"
|
|
#define TIMER_ID_PROPNAME L"TimerID"
|
|
#define FILTER_KEY_PROPNAME L"Name"
|
|
#define FILTER_QUERY_PROPNAME L"Query"
|
|
#define FILTER_LANGUAGE_PROPNAME L"QueryLanguage"
|
|
#define FILTER_EVENTNAMESPACE_PROPNAME L"EventNamespace"
|
|
#define FILTER_EVENTACCESS_PROPNAME L"EventAccess"
|
|
#define FILTER_GUARDNAMESPACE_PROPNAME L"ConditionNamespace"
|
|
#define FILTER_GUARD_PROPNAME L"Condition"
|
|
#define FILTER_GUARDLANG_PROPNAME L"ConditionLanguage"
|
|
#define CONSUMER_MACHINE_NAME_PROPNAME L"MachineName"
|
|
#define CONSUMER_MAXQUEUESIZE_PROPNAME L"MaximumQueueSize"
|
|
#define PROVIDER_CLSID_PROPNAME L"Clsid"
|
|
#define PROVIDER_NAME_PROPNAME L"Name"
|
|
#define EVPROVREG_PROVIDER_REF_PROPNAME L"Provider"
|
|
#define EVPROVREG_QUERY_LIST_PROPNAME L"EventQueryList"
|
|
#define CONSPROV_PROVIDER_REF_PROPNAME L"Provider"
|
|
#define CONSPROV_CLSID_PROPNAME L"CLSID"
|
|
|
|
#define TARGET_NAMESPACE_PROPNAME L"TargetNamespace"
|
|
#define PREVIOUS_NAMESPACE_PROPNAME L"PreviousNamespace"
|
|
#define TARGET_CLASS_PROPNAME L"TargetClass"
|
|
#define PREVIOUS_CLASS_PROPNAME L"PreviousCLass"
|
|
#define TARGET_INSTANCE_PROPNAME L"TargetInstance"
|
|
#define PREVIOUS_INSTANCE_PROPNAME L"PreviousInstance"
|
|
#define EVENT_DROP_EVENT_PROPNAME L"Event"
|
|
#define EVENT_DROP_CONSUMER_PROPNAME L"IntendedConsumer"
|
|
#define CONSUMER_FAILURE_ERROR_PROPNAME L"ErrorCode"
|
|
#define CONSUMER_FAILURE_ERROROBJ_PROPNAME L"ErrorObject"
|
|
#define QOS_FAILURE_ERROR_PROPNAME L"ErrorCode"
|
|
#define QUEUE_OVERFLOW_SIZE_PROPNAME L"CurrentQueueSize"
|
|
|
|
#define MONITOR_BASE_EVENT_CLASS L"__MonitorEvent"
|
|
#define MONITOR_DATA_EVENT_CLASS L"__MonitorDataEvent"
|
|
#define ASSERT_EVENT_CLASS L"__MonitorAssertEvent"
|
|
#define RETRACT_EVENT_CLASS L"__MonitorRetractEvent"
|
|
#define GOINGUP_EVENT_CLASS L"__MonitorUpEvent"
|
|
#define GOINGDOWN_EVENT_CLASS L"__MonitorDownEvent"
|
|
#define MONITORERROR_EVENT_CLASS L"__MonitorErrorEvent"
|
|
#define MONITOR_CLASS L"__MonitorInstruction"
|
|
|
|
#define MONITORNAME_EVENT_PROPNAME L"MonitorName"
|
|
#define MONITOROBJECT_EVENT_PROPNAME L"RowObject"
|
|
#define MONITORCOUNT_EVENT_PROPNAME L"TotalObjects"
|
|
#define MONITORNEW_EVENT_PROPNAME L"GuaranteedNew"
|
|
|
|
#define MONITOR_NAME_PROPNAME L"Name"
|
|
#define MONITOR_QUERY_PROPNAME L"Query"
|
|
#define MONITOR_QUERYLANG_PROPNAME L"QueryLanguage"
|
|
#define MONITOR_NAMESPACE_PROPNAME L"TargetNamespace"
|
|
|
|
#define E_NOTFOUND WBEM_E_NOT_FOUND
|
|
|
|
typedef IWbemClassObject IWbemEvent;
|
|
|
|
// Helper functions
|
|
// ================
|
|
|
|
inline DELETE_ME LPWSTR CloneWstr(READ_ONLY LPCWSTR wsz)
|
|
{
|
|
LPWSTR wszNew = new WCHAR[wcslen(wsz)+1];
|
|
if(wszNew == NULL)
|
|
return NULL;
|
|
StringCchCopyW( wszNew, wcslen(wsz)+1, wsz );
|
|
return wszNew;
|
|
}
|
|
|
|
// Event types. These are used in IndicateEx calls, as well as internally.
|
|
// =======================================================================
|
|
|
|
typedef enum{
|
|
e_EventTypeInvalid = WBEM_EVENTTYPE_Invalid,
|
|
e_EventTypeExtrinsic = WBEM_EVENTTYPE_Extrinsic,
|
|
e_EventTypeTimer = WBEM_EVENTTYPE_Timer,
|
|
e_EventTypeNamespaceCreation = WBEM_EVENTTYPE_NamespaceCreation,
|
|
e_EventTypeNamespaceDeletion = WBEM_EVENTTYPE_NamespaceDeletion,
|
|
e_EventTypeNamespaceModification = WBEM_EVENTTYPE_NamespaceModification,
|
|
e_EventTypeClassCreation = WBEM_EVENTTYPE_ClassCreation,
|
|
e_EventTypeClassDeletion = WBEM_EVENTTYPE_ClassDeletion,
|
|
e_EventTypeClassModification = WBEM_EVENTTYPE_ClassModification,
|
|
e_EventTypeInstanceCreation = WBEM_EVENTTYPE_InstanceCreation,
|
|
e_EventTypeInstanceDeletion = WBEM_EVENTTYPE_InstanceDeletion,
|
|
e_EventTypeInstanceModification = WBEM_EVENTTYPE_InstanceModification,
|
|
e_EventTypeSystem = WBEM_EVENTTYPE_System
|
|
} EEventType;
|
|
|
|
#define INTRINSIC_EVENTS_MASK (~(1<<e_EventTypeExtrinsic))
|
|
|
|
#define INSTANCE_EVENTS_MASK ( \
|
|
(1<<e_EventTypeInstanceCreation) | \
|
|
(1<<e_EventTypeInstanceDeletion) | \
|
|
(1<<e_EventTypeInstanceModification))
|
|
|
|
#define CLASS_EVENTS_MASK ( \
|
|
(1<<e_EventTypeClassCreation) | \
|
|
(1<<e_EventTypeClassDeletion) | \
|
|
(1<<e_EventTypeClassModification))
|
|
|
|
#define NAMESPACE_EVENTS_MASK ( \
|
|
(1<<e_EventTypeNamespaceCreation) | \
|
|
(1<<e_EventTypeNamespaceDeletion) | \
|
|
(1<<e_EventTypeNamespaceModification))
|
|
|
|
#define DATA_EVENTS_MASK \
|
|
(INSTANCE_EVENTS_MASK | CLASS_EVENTS_MASK | NAMESPACE_EVENTS_MASK)
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// class CEventRepresentation
|
|
//
|
|
// This class represents an event that ESS receives. It has public datafields
|
|
// corresponding to the parameters of the IndicateEx call and that is
|
|
// precisely what is stored in it.
|
|
//
|
|
// This class has two types of existence: allocated and not allocated. Non
|
|
// allocated state is the default. In it, CEventRepresentation string fields
|
|
// contain pointers to data that does not 'belong' to this class, and is not
|
|
// deleted in the destructor.
|
|
//
|
|
// The other, allocated, state is entered when a new copy of this object is
|
|
// created using MakePermanentCopy(). In this state, all string fields contain
|
|
// allocated data which is deleted on destruct.
|
|
//
|
|
// CEventRepresentation also contains a table mapping event types into event
|
|
// class names and event filter class names.
|
|
//
|
|
// Finally, CEventRepresentation is derived from CPropertySource and provides
|
|
// property values (taken from the first included IWbemClassObject) to the
|
|
// SQL1 query evaluator.
|
|
//
|
|
//*****************************************************************************
|
|
//
|
|
// MakePermanentCopy
|
|
//
|
|
// This function produces a new copy of the event, which can survive complete
|
|
// destruction of the original object. All strings are reallocated and all
|
|
// IWbemClassObjects are Clone'ed. The reason for that is that WinMgmt core may
|
|
// call ESS with temporary (non-OLE) objects, and if ESS needs to keep them
|
|
// after it returns from the call, it needs to make a complete copy.
|
|
//
|
|
// Returns:
|
|
//
|
|
// CEventRepresentation* pointing to the new object, Must be deleted
|
|
// by the called.
|
|
//
|
|
//*****************************************************************************
|
|
//
|
|
// MakeWbemObject
|
|
//
|
|
// This function creates an IWbemClassObject representation of the event for
|
|
// clients that do not accept NotifyEx calls. The object will be of the class
|
|
// determined by the type of the event and will contain all the properties
|
|
// appropriate for that class (with values taken from CEventRepresentation
|
|
// properties).
|
|
//
|
|
// Parameters:
|
|
//
|
|
// IWbemClassObject** ppEventObject Destination for the newely created
|
|
// object. Caller must Release it when
|
|
// done.
|
|
// Returns:
|
|
//
|
|
// S_OK on success
|
|
// S_FALSE if event is extrinsic. When extrinsic events are specified
|
|
// in IndicateEx, the first object IS the class object for
|
|
// the event, and so no additional object creation is
|
|
// necessary for Indicate.
|
|
//
|
|
// Any CoCreateInstance error.
|
|
// Any IWbemClassObject::Put error.
|
|
//
|
|
//*****************************************************************************
|
|
//
|
|
// static GetEventName
|
|
//
|
|
// Retreives the name of the event class corresponding to a given
|
|
// event type.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// EEventType type
|
|
//
|
|
// Returns:
|
|
//
|
|
// LPCWSTR containing the event class name. This pointer is internal and
|
|
// may NOT be modified or deleted.
|
|
//
|
|
//*****************************************************************************
|
|
//
|
|
// static GetTypeFromName
|
|
//
|
|
// Retreives the type of the event given the name of the event class.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// LPCWSTR wszEventName The name of the event class.
|
|
//
|
|
// Returns:
|
|
//
|
|
// EEventType
|
|
//
|
|
//*****************************************************************************
|
|
//
|
|
// Get
|
|
//
|
|
// Retrives the value of a property, as required by CPropertySource class.
|
|
// This implementation uses the first included object (apObjects[0]) to
|
|
// get the values. Access to other objects is not available.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// LPCWSTR wszPropName The same name as in IWbemClassObject
|
|
// VARIANT* pValue Destination for the value. The caller must
|
|
// initialize and clear this value.
|
|
// Returns:
|
|
//
|
|
// S_OK on success
|
|
// Any IWbemClassObject::Get error code
|
|
//
|
|
//*****************************************************************************
|
|
|
|
|
|
class CEssNamespace;
|
|
class CEss;
|
|
class CEventRepresentation
|
|
{
|
|
private:
|
|
static CTimeKeeper mstatic_TimeKeeper;
|
|
|
|
protected:
|
|
BOOL m_bAllocated;
|
|
IWbemClassObject* m_pCachedObject;
|
|
public:
|
|
long type;
|
|
DWORD dw1;
|
|
DWORD dw2;
|
|
LPWSTR wsz1;
|
|
LPWSTR wsz2;
|
|
LPWSTR wsz3;
|
|
int nObjects;
|
|
IWbemClassObject** apObjects;
|
|
|
|
public:
|
|
CEventRepresentation()
|
|
: m_bAllocated(FALSE),
|
|
m_pCachedObject(NULL),
|
|
wsz1( NULL ),
|
|
wsz2( NULL ),
|
|
wsz3( NULL ),
|
|
apObjects( NULL )
|
|
{
|
|
// uninitialized for speed
|
|
}
|
|
|
|
~CEventRepresentation();
|
|
|
|
STDMETHOD_(ULONG, AddRef)() {return 1;}
|
|
STDMETHOD_(ULONG, Release)() {return 1;}
|
|
STDMETHOD(QueryInterface)(REFIID riid, void** ppv)
|
|
{*ppv = this; return S_OK;}
|
|
|
|
STDMETHOD(InheritsFrom)(WBEM_WSTR wszName);
|
|
|
|
|
|
inline EEventType GetEventType() {return (EEventType)type;}
|
|
|
|
DELETE_ME CEventRepresentation* MakePermanentCopy();
|
|
HRESULT MakeWbemObject(CEssNamespace* pNamespace,
|
|
RELEASE_ME IWbemClassObject** ppEventObj);
|
|
HRESULT CreateFromObject(IWbemClassObject* pEvent, LPWSTR wszNamespace);
|
|
|
|
inline BOOL IsInstanceEvent();
|
|
inline BOOL IsClassEvent();
|
|
|
|
static HRESULT Initialize(IWbemServices* pNamespace,
|
|
IWbemDecorator* pDecorator);
|
|
static HRESULT Shutdown();
|
|
|
|
static INTERNAL LPCWSTR GetEventName(EEventType type);
|
|
static DWORD GetTypeMaskFromName(READ_ONLY LPCWSTR wszEventName);
|
|
static EEventType GetTypeFromName(READ_ONLY LPCWSTR wszEventName);
|
|
static INTERNAL IWbemClassObject* GetEventClass(CEssNamespace* pNamespace,
|
|
EEventType type);
|
|
static INTERNAL IWbemClassObject* GetEventClass(CEss* pNamespace,
|
|
EEventType type);
|
|
|
|
protected:
|
|
|
|
struct CEventTypeData
|
|
{
|
|
EEventType type;
|
|
LPWSTR wszEventName;
|
|
IWbemClassObject* pEventClass;
|
|
};
|
|
|
|
static CEventTypeData staticTypes[];
|
|
static int NumEventTypes();
|
|
static IWbemDecorator* mstatic_pDecorator;
|
|
|
|
friend class CEss;
|
|
};
|
|
|
|
#define CLASS_OF(EVENT) (EVENT.wsz2)
|
|
#define NAMESPACE_OF(EVENT) (EVENT.wsz1)
|
|
#define OBJECT_OF(EVENT) (EVENT.apObjects[0])
|
|
#define OTHER_OBJECT_OF(EVENT) (EVENT.apObjects[1])
|
|
|
|
inline BOOL CEventRepresentation::IsInstanceEvent()
|
|
{
|
|
return (type == e_EventTypeInstanceCreation ||
|
|
type == e_EventTypeInstanceModification ||
|
|
type == e_EventTypeInstanceDeletion);
|
|
}
|
|
|
|
inline BOOL CEventRepresentation::IsClassEvent()
|
|
{
|
|
return (type == e_EventTypeClassCreation ||
|
|
type == e_EventTypeClassModification ||
|
|
type == e_EventTypeClassDeletion);
|
|
}
|
|
|
|
#endif
|