/*++

Copyright (C) 1997-2001 Microsoft Corporation

Module Name:

Abstract:

History:

--*/


//***************************************************************************
//
//  NTPERF.H
//  
//  NT5 Perf Counter Provider
//
//  raymcc      02-Dec-97       
//
//***************************************************************************

#ifndef _NTPERF_H_
#define _NTPERF_H_

#define NUM_SAMPLE_INSTANCES   10

class CNt5PerfProvider;


class CNt5Refresher : public IWbemRefresher
{
    LONG m_lRef;

    IWbemObjectAccess *m_aInstances[NUM_SAMPLE_INSTANCES];

    LONG m_hName;
    LONG m_hCounter1;
    LONG m_hCounter2;
    LONG m_hCounter3;

public:
    CNt5Refresher();
   ~CNt5Refresher();

    void TransferPropHandles(CNt5PerfProvider *);

    BOOL AddObject(IWbemObjectAccess *pObj, LONG *plId);
    BOOL RemoveObject(LONG lId);

    // Interface members.
    // ==================

    ULONG STDMETHODCALLTYPE AddRef();
    ULONG STDMETHODCALLTYPE Release();
    STDMETHODIMP QueryInterface(REFIID riid, void** ppv);

    virtual HRESULT STDMETHODCALLTYPE Refresh(/* [in] */ long lFlags);
};


class CNt5PerfProvider : public IWbemHiPerfProvider, public IWbemProviderInit
{
    LONG m_lRef;
    IWbemClassObject  *m_pSampleClass;
    IWbemObjectAccess *m_aInstances[NUM_SAMPLE_INSTANCES];

    LONG m_hName;
    LONG m_hCounter1;
    LONG m_hCounter2;
    LONG m_hCounter3;

    friend class CNt5Refresher;
    
public:
    CNt5PerfProvider();
   ~CNt5PerfProvider();

    // Interface members.
    // ==================

        ULONG STDMETHODCALLTYPE AddRef();
        ULONG STDMETHODCALLTYPE Release();
        STDMETHODIMP QueryInterface(REFIID riid, void** ppv);


    // IWbemHiPerfProvider methods.
    // ============================
            
        virtual HRESULT STDMETHODCALLTYPE QueryInstances( 
            /* [in] */ IWbemServices __RPC_FAR *pNamespace,
            /* [string][in] */ WCHAR __RPC_FAR *wszClass,
            /* [in] */ long lFlags,
            /* [in] */ IWbemContext __RPC_FAR *pCtx,
            /* [in] */ IWbemObjectSink __RPC_FAR *pSink
            );
        
        virtual HRESULT STDMETHODCALLTYPE CreateRefresher( 
            /* [in] */ IWbemServices __RPC_FAR *pNamespace,
            /* [in] */ long lFlags,
            /* [out] */ IWbemRefresher __RPC_FAR *__RPC_FAR *ppRefresher
            );
        
        virtual HRESULT STDMETHODCALLTYPE CreateRefreshableObject( 
            /* [in] */ IWbemServices __RPC_FAR *pNamespace,
            /* [in] */ IWbemObjectAccess __RPC_FAR *pTemplate,
            /* [in] */ IWbemRefresher __RPC_FAR *pRefresher,
            /* [in] */ long lFlags,
            /* [in] */ IWbemContext __RPC_FAR *pContext,
            /* [out] */ IWbemObjectAccess __RPC_FAR *__RPC_FAR *ppRefreshable,
            /* [out] */ long __RPC_FAR *plId
            );
        
        virtual HRESULT STDMETHODCALLTYPE StopRefreshing( 
            /* [in] */ IWbemRefresher __RPC_FAR *pRefresher,
            /* [in] */ long lId,
            /* [in] */ long lFlags
            );

		virtual HRESULT STDMETHODCALLTYPE CreateRefreshableEnum(
			/* [in] */ IWbemServices* pNamespace,
			/* [in, string] */ LPCWSTR wszClass,
			/* [in] */ IWbemRefresher* pRefresher,
			/* [in] */ long lFlags,
			/* [in] */ IWbemContext* pContext,
			/* [in] */ IWbemHiPerfEnum* pHiPerfEnum,
			/* [out] */ long* plId
			);

		virtual HRESULT STDMETHODCALLTYPE GetObjects(
            /* [in] */ IWbemServices* pNamespace,
			/* [in] */ long lNumObjects,
			/* [in,size_is(lNumObjects)] */ IWbemObjectAccess** apObj,
            /* [in] */ long lFlags,
            /* [in] */ IWbemContext* pContext);
		
        // IWbemProviderInit method.
        // =========================
            
        virtual HRESULT STDMETHODCALLTYPE Initialize( 
            /* [unique][in] */ LPWSTR wszUser,
            /* [in] */ LONG lFlags,
            /* [in] */ LPWSTR wszNamespace,
            /* [unique][in] */ LPWSTR wszLocale,
            /* [in] */ IWbemServices __RPC_FAR *pNamespace,
            /* [in] */ IWbemContext __RPC_FAR *pCtx,
            /* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink
            );
  
};

void ObjectCreated();
void ObjectDestroyed();

#endif