2025-11-28 00:35:46 +09:00

235 lines
7.0 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
#include "stdafx.h"
#include "ComSpyCtl.h"
#include "ComSpyAudit.h"
#include "SysLCESub.h" // Include our base class.
#include "CComSpy.h"
#include "evtstoresub.h"
//*********************************************
// Globals
CComBSTR g_bstrPROGID_EventSubscription(PROGID_EventSubscription);
CComBSTR g_bstrPROGID_EventClass(PROGID_EventClass);
STDMETHODIMP CEvtStoreSub::ChangedSubscription
(/* [in] */ EOC_ChangeType changeType,
/* [in] */ BSTR bstrSubscriptionID)
{
LONGLONG perfCount = 0;
::QueryPerformanceCounter( (LARGE_INTEGER *)&perfCount );
LPWSTR lpOperation = NULL;
switch (changeType)
{
case EOC_NewObject:
lpOperation = L"New Subscription";
break;
case EOC_ModifiedObject:
lpOperation = L"Modified Subscription";
break;
case EOC_DeletedObject:
lpOperation = L"Deleted Subscription";
break;
}
m_pSpy->AddEventToList(perfCount, lpOperation, L"COM+ Event Store");
m_pSpy->AddParamValueToList(L"Subscription ID", bstrSubscriptionID);
//TODO: Add Auditing code for subscription change
AddSubscriptionInfo( m_pSpy, bstrSubscriptionID );
return S_OK;
}
STDMETHODIMP CEvtStoreSub::ChangedEventClass
(/* [in] */ EOC_ChangeType changeType,
/* [in] */ BSTR bstrEventClassID)
{
LONGLONG perfCount = 0;
::QueryPerformanceCounter( (LARGE_INTEGER *)&perfCount );
LPWSTR lpOperation = NULL;
switch (changeType)
{
case EOC_NewObject:
lpOperation = L"New Event Class";
break;
case EOC_ModifiedObject:
lpOperation = L"Modified Event Class";
break;
case EOC_DeletedObject:
lpOperation = L"Deleted Event Class";
break;
}
m_pSpy->AddEventToList(perfCount, lpOperation, L"COM+ Event Store");
m_pSpy->AddParamValueToList(L"Event Class ID", bstrEventClassID);
//TODO: Add Auditing code for event class change
AddEventClassInfo( m_pSpy, bstrEventClassID );
return S_OK;
}
STDMETHODIMP CEvtStoreSub::ChangedPublisher
(/* [in] */ EOC_ChangeType changeType,
/* [in] */ BSTR bstrPublisherID)
{
return S_OK;
}
///////////
STDMETHODIMP CEvtStoreSub::AddSubscriptionInfo
//-----------------------------------------------------------------
// Function Description:
//
// Given a subscription ID, query the Event Store for information.
//
// Return Value:
//
// Arguments:
(/* [in] */ CComSpy* pSpy,
/* [in] */ BSTR bstrSubscriptionID)
//
//-----------------------------------------------------------------
{
HRESULT hr = S_OK;
// Variables initialized to NULL here to ensure error returns are valid.
CComPtr<IEventSystem> spIEventSystem = NULL;
hr = CoCreateInstance(CLSID_CEventSystem,
NULL,
CLSCTX_SERVER,
IID_PPV_ARGS(&spIEventSystem));
if (FAILED(hr))
{
ATLTRACE(L"Failed to create CEventSystem");
return hr;
}
// ----------------------------------------------
// Query for the subscription info
// ----------------------------------------------
int errorIndex;
CComBSTR bstrCriteria;
bstrCriteria = "SubscriptionID=";
bstrCriteria += bstrSubscriptionID;
CComPtr<IUnknown> pUnk = NULL;
hr = spIEventSystem->Query(g_bstrPROGID_EventSubscription, bstrCriteria, &errorIndex, &pUnk);
if (FAILED(hr))
{
ATLTRACE(L"Query for SubcriptionID failed");
return hr;
}
// Got something - now get the info and blast it to Spy.
CComPtr<IEventSubscription> spEventSubscription;
hr = pUnk->QueryInterface(IID_PPV_ARGS(&spEventSubscription));
_ASSERTE(SUCCEEDED(hr) && spEventSubscription);
if (!spEventSubscription)
{
ATLTRACE(L"QI for IEventSubscription failed");
return hr;
}
CComBSTR bstrSubscriptionName;
CComBSTR bstrEventClassID;
CComBSTR bstrDescription;
spEventSubscription->get_SubscriptionName( &bstrSubscriptionName );
spEventSubscription->get_EventClassID( &bstrEventClassID );
spEventSubscription->get_Description( &bstrDescription );
pSpy->AddParamValueToList(L"Subscription Name", bstrSubscriptionName);
pSpy->AddParamValueToList(L"Event Class ID", bstrEventClassID);
pSpy->AddParamValueToList(L"Description", bstrDescription);
//TODO: Add Auditing code for subscription change
return hr;
}
STDMETHODIMP CEvtStoreSub::AddEventClassInfo
//-----------------------------------------------------------------
// Function Description:
//
// Given an Event Class ID, query the Event Store for information.
//
// Return Value:
//
// Arguments:
(/* [in] */ CComSpy* pSpy,
/* [in] */ BSTR bstrEventClassID)
//
//-----------------------------------------------------------------
{
HRESULT hr = S_OK;
// Variables initialized to NULL here to ensure error returns are valid.
CComPtr<IEventSystem> spIEventSystem = NULL;
hr = CoCreateInstance(CLSID_CEventSystem,
NULL,
CLSCTX_SERVER,
IID_PPV_ARGS(&spIEventSystem));
if (FAILED(hr))
{
ATLTRACE(L"Failed to create CEventSystem");
return hr;
}
// ----------------------------------------------
// Query for the EventClass info
// ----------------------------------------------
int errorIndex;
CComBSTR bstrCriteria;
bstrCriteria = "EventClassID=";
bstrCriteria += bstrEventClassID;
CComPtr<IUnknown> pUnk = NULL;
hr = spIEventSystem->Query(g_bstrPROGID_EventClass, bstrCriteria, &errorIndex, &pUnk);
if (FAILED(hr))
{
ATLTRACE(L"Query for SubcriptionID failed");
return hr;
}
// Got something - now get the info and blast it to Spy.
CComPtr<IEventClass> spEventClass;
hr = pUnk->QueryInterface(IID_PPV_ARGS(&spEventClass));
_ASSERTE(SUCCEEDED(hr) && pUnk);
if (!spEventClass)
{
ATLTRACE(L"QI for IEventClass failed");
return hr;
}
CComBSTR bstrEventClassName;
CComBSTR bstrFiringInterfaceID;
CComBSTR bstrOwnerSID;
CComBSTR bstrDescription;
spEventClass->get_EventClassName( &bstrEventClassName );
spEventClass->get_FiringInterfaceID( &bstrFiringInterfaceID );
spEventClass->get_Description( &bstrDescription );
spEventClass->get_OwnerSID( &bstrOwnerSID );
pSpy->AddParamValueToList(L"EventClass Name", bstrEventClassName);
pSpy->AddParamValueToList(L"Firing Interface ID", bstrFiringInterfaceID);
pSpy->AddParamValueToList(L"Description", bstrDescription);
pSpy->AddParamValueToList(L"Owner SID", bstrOwnerSID);
//TODO: Add Auditing code for EventClass change
return hr;
}