Sample Code

Windows Driver Samples/ WPD service sample driver/ C++/ WpdServiceMethods.h/

#pragma once

class CMethodTask;

// This class is used to store the context for a specific method invocation
class ServiceMethodContext : public IUnknown
{
public:
    ServiceMethodContext();
    ~ServiceMethodContext();

    HRESULT Initialize(
        _In_ WpdServiceMethods*     pServiceMethods,
        _In_ IPortableDeviceValues* pStartParams,
        _In_ LPCWSTR                pwszContext);

    VOID InvokeMethod();

public: // IUnknown
    ULONG __stdcall AddRef()
    {
        InterlockedIncrement((long*) &m_cRef);
        return m_cRef;
    }

    _At_(this, __drv_freesMem(Mem)) 
    ULONG __stdcall Release()
    {
        ULONG ulRefCount = m_cRef - 1;

        if (InterlockedDecrement((long*) &m_cRef) == 0)
        {
            delete this;
            return 0;
        }
        return ulRefCount;
    }

    HRESULT __stdcall QueryInterface(
        REFIID riid,
        void** ppv)
    {
        HRESULT hr = S_OK;

        if(riid == IID_IUnknown)
        {
            *ppv = static_cast<IUnknown*>(this);
            AddRef();
        }
        else
        {
            *ppv = NULL;
            hr = E_NOINTERFACE;
        }

        return hr;
    }

public:
    HRESULT                        m_hrStatus;
    CComPtr<IPortableDeviceValues> m_pResults;

private:
    DWORD                          m_cRef;
    CAtlStringW                    m_strContext;
    CMethodTask*                   m_pTask;
    CComPtr<IPortableDeviceValues> m_pStartParameters;
    WpdServiceMethods*             m_pServiceMethods;
};


class CMethodTask
{
public:
    CMethodTask(_In_ ServiceMethodContext* pContext);

    ~CMethodTask();

    HRESULT Run();

    static DWORD ThreadProc(LPVOID pData)
    {
        // Initialize COM
        if (SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
        {
            ServiceMethodContext* pContext = (ServiceMethodContext*) pData;
            if (pContext != NULL)
            {
                pContext->AddRef();
                pContext->InvokeMethod();
                pContext->Release();
            }

            // Uninitialize COM
            CoUninitialize();
        }
        return 0;
    }
private:
    HANDLE                m_hThread;
    ServiceMethodContext* m_pContext;
};

class WpdServiceMethods
{
public:
    WpdServiceMethods();
    virtual ~WpdServiceMethods();

    HRESULT Initialize(
        _In_    FakeContactsService*    pContactsService);

    // Handler for WPD_COMMAND_SERVICE_METHODS_START_INVOKE
    HRESULT OnStartInvoke(
        _In_    IPortableDeviceValues*  pParams,
        _In_    IPortableDeviceValues*  pResults);

    // Handler for WPD_COMMAND_SERVICE_METHODS_END_INVOKE
    HRESULT OnEndInvoke(
        _In_    IPortableDeviceValues*  pParams,
        _In_    IPortableDeviceValues*  pResults);

    // Handler for WPD_COMMAND_SERVICE_METHODS_CANCEL_INVOKE
    HRESULT OnCancelInvoke(
        _In_    IPortableDeviceValues*  pParams,
        _In_    IPortableDeviceValues*  pResults);

    HRESULT DispatchMethod(
        _In_         LPCWSTR                 pwszContext,
        _In_         IPortableDeviceValues*  pStartParams,
        _COM_Outptr_ IPortableDeviceValues** ppResults);

private:
    HRESULT StartMethod(
        _In_                            IPortableDeviceValues*  pCommandParams,
        _Outptr_result_nullonfailure_   LPWSTR*                 ppwszMethodContext);

    HRESULT EndMethod(
        _In_                            ContextMap*             pContextMap, 
        _In_                            LPCWSTR                 pwszMethodContext,
        _COM_Outptr_result_maybenull_   IPortableDeviceValues** ppResults,
        _Out_                           HRESULT*                phrStatus);

    HRESULT CancelMethod(
        _In_    ContextMap*             pContextMap, 
        _In_    LPCWSTR                 pwszMethodContext);

private:
    FakeContactsService* m_pContactsService;
};

Our Services

  • What our customers say about us?

© 2011-2024 All Rights Reserved. Joya Systems. 4425 South Mopac Building II Suite 101 Austin, TX 78735 Tel: 800-DEV-KERNEL

Privacy Policy. Terms of use. Valid XHTML & CSS