Leaked source code of windows server 2003
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.
 
 
 
 
 
 

229 lines
5.5 KiB

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
MCAObjectSink.cpp
Abstract:
This class is used to register as a temporary consumer to WMI for CMC and CPE
event notifications. It functions as a IWbemObjectSink to retrieve the
instances in the result of the query (WMI event notification). When a registered
event occurs, WMI calls the Indicate function to notify about the event.
For more information look at MSDN for: IWbemObjectSink.
Author:
Abdullah Ustuner (AUstuner) 28-August-2002
--*/
#include "MCAObjectSink.h"
extern HANDLE gErrorProcessedEvent;
MCAObjectSink::MCAObjectSink()
/*++
Routine Description:
This function is the constructor of the class. It is responsible for initializing
the member variables.
Arguments:
none
Return Value:
none
--*/
{
referenceCount = 0;
}
ULONG
MCAObjectSink::AddRef()
/*++
Routine Description:
This function increases the object's reference count by one. The function prevents
more than one thread to increase the value simultaneously.
Arguments:
none
Return Value:
Reference count to this object (after increment operation).
--*/
{
return InterlockedIncrement(&referenceCount);
}
ULONG
MCAObjectSink::Release()
/*++
Routine Description:
This function decreases the object's reference count by one. The function prevents
more than one thread to decrease the value simultaneously. If no other reference
is left, the object is deallocated.
Arguments:
none
Return Value:
lRef - Reference count to this object (after decrement operation).
--*/
{
LONG lRef = InterlockedDecrement(&referenceCount);
if (lRef == 0) {
delete this;
}
return lRef;
}
HRESULT
MCAObjectSink::QueryInterface(IN REFIID riid,
OUT VOID** ppv
)
/*++
Routine Description:
This function determines if the object supports a particular COM interface.
If it does, the system increases the object's reference count, and the
application can use that interface immediately.
Arguments:
riid - The COM interface identifier of the requested interface.
ppv - Address of a pointer that will be filled with the interface pointer if
the query succeeds.
Return Value:
S_OK - Successful
E_NOINTERFACE - Unsuccessful. Requested interface is not supported.
--*/
{
if (riid == IID_IUnknown || riid == IID_IWbemObjectSink) {
*ppv = (IWbemObjectSink *) this;
AddRef();
return S_OK;
}
else return E_NOINTERFACE;
}
HRESULT
MCAObjectSink::Indicate(IN LONG lObjCount,
IN IWbemClassObject **pArray
)
/*++
Routine Description:
This function receives the notifications from the WMI provider.
Arguments:
lObjCount - The number of objects in the following array of pointers.
pArray - An array of pointers to IWbemClassObject interfaces, that is the event objects.
The array memory itself is read-only, and is owned by the caller of the method.
Since this is an in-parameter, the interface called has the option of calling
IWbemServices::AddRef on any object pointer in the array and holding it before
returning. The interface called is only required to copy and then call
IWbemServices::AddRef on the pointers if the pointers will be used after the
call returns, according to COM rules. The interface called should not call
Release on the objects without corresponding calls to AddRef. For more
information on the IUnknown Interface methods, see the Microsoft Platform SDK.
Return Value:
WBEM_S_NO_ERROR - Indicating successful processing of the notification.
--*/
{
LONG objectIndex = 0;
//
// Extract all of the event objects from the array and inform the test engine.
//
for (objectIndex = 0; objectIndex < lObjCount; objectIndex++) {
//
// Inform the corrected engine about the event retrieval.
//
MCAErrorReceived(pArray[objectIndex]);
SetEvent(gErrorProcessedEvent);
}
return WBEM_S_NO_ERROR;
}
HRESULT
MCAObjectSink::SetStatus(IN LONG lFlags,
IN HRESULT hResult,
IN BSTR strParam,
IN IWbemClassObject __RPC_FAR *pObjParam
)
/*++
Routine Description:
This function is called by sources to indicate the end of a notification sequence
or the end of a result code of an asynchronous method of IWbemServices.
Arguments:
lFlags - Reserved. It must be zero.
hResult - Set to the HRESULT of the asynchronous operation or notification.
strParam - Receives a pointer to a read-only BSTR, if the original asynchronous operation
returns a string.
pObjParam - In cases where a complex error or status object is returned, this contains
a pointer to the object. If the object is required after the call returns,
the called object must AddRef the pointer before returning.
Return Value:
WBEM_S_NO_ERROR
--*/
{
return WBEM_S_NO_ERROR;
}