summaryrefslogtreecommitdiff
path: root/wpd/WpdWudfSampleDriver/WpdObjectManagement.h
blob: 7fe3a0972e35e15bd0bac91a14a16012d1695794 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#pragma once

// This class is used to store the context for a specific enumeration.
// Currently, this is done by storing the object index.
class ObjectManagementContext  : public IUnknown
{
public:
    ObjectManagementContext() :
        m_cRef(1),
        UpdateRequest(FALSE)
    {

    }

    ~ObjectManagementContext()
    {

    }

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:
    CAtlStringW                     Name;
    CComPtr<IPortableDeviceValues>  ObjectProperties;
    BOOL                            UpdateRequest;
private:
    DWORD                           m_cRef;
};

class WpdObjectManagement
{
public:
    WpdObjectManagement();
    ~WpdObjectManagement();

    HRESULT Initialize(_In_ FakeDevice *pFakeDevice);

    HRESULT DispatchWpdMessage(_In_ REFPROPERTYKEY          Command,
                               _In_ IPortableDeviceValues*  pParams,
                               _In_ IPortableDeviceValues*  pResults);

    HRESULT OnDelete(_In_ IPortableDeviceValues*  pParams,
                     _In_ IPortableDeviceValues*  pResults);

    HRESULT OnCreateObjectWithPropertiesOnly(_In_ IPortableDeviceValues*  pParams,
                                             _In_ IPortableDeviceValues*  pResults);

    HRESULT OnCreateObjectWithPropertiesAndData(_In_ IPortableDeviceValues*  pParams,
                                                _In_ IPortableDeviceValues*  pResults);

    HRESULT OnWriteObjectData(_In_ IPortableDeviceValues*  pParams,
                              _In_ IPortableDeviceValues*  pResults);

    HRESULT OnRevert(_In_ IPortableDeviceValues*  pParams,
                     _In_ IPortableDeviceValues*  pResults);

    HRESULT OnCommit(_In_ IPortableDeviceValues*  pParams,
                     _In_ IPortableDeviceValues*  pResults);

    HRESULT OnMove(_In_ IPortableDeviceValues*  pParams,
                   _In_ IPortableDeviceValues*  pResults);

    HRESULT OnCopy(_In_ IPortableDeviceValues*  pParams,
                   _In_ IPortableDeviceValues*  pResults);

    HRESULT OnUpdateObjectWithPropertiesAndData(_In_ IPortableDeviceValues*  pParams,
                                                _In_ IPortableDeviceValues*  pResults);

private:
    HRESULT CreateObjectManagementContext(
        _In_    ContextMap*                     pContextMap,
        _In_    LPCWSTR                         pszObjectName,
        _In_    IPortableDeviceValues*          pObjectProperties,
        _In_    BOOL                            bUpdateRequest,
        _Outptr_result_nullonfailure_   LPWSTR* ppszObjectManagementContext);

    HRESULT DestroyObjectManagementContext(
        _In_    ContextMap*                 pContextMap,
        _In_    LPCWSTR                     pszObjectManagementContext);

    HRESULT CommitNewObject(
        _In_    ObjectManagementContext*    pContext,
        _In_    LPCWSTR                     pszContext,
        _In_    IPortableDeviceValues*      pParams,
        _In_    IPortableDeviceValues*      pResults);

    HRESULT UpdateObject(
        _In_    ObjectManagementContext*    pContext,
        _In_    IPortableDeviceValues*      pParams,
        _In_    IPortableDeviceValues*      pResults);

    FakeDevice* m_pFakeDevice;
};