summaryrefslogtreecommitdiff
path: root/wpd/WpdServiceSampleDriver/WpdObjectPropertiesBulk.h
blob: 52ec7ed12cf223d60289a7a568809450c1d77f4c (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#pragma once

// This class is used to store the context for a specific enumeration.
// Currently, this is done by storing the object index.
class BulkPropertiesContext : public IUnknown
{
public:
    BulkPropertiesContext() :
        Scope(FULL_DEVICE_ACCESS),
        NextObject(0),
        m_cRef(1)
    {

    }

    ~BulkPropertiesContext()
    {

    }

    ACCESS_SCOPE                                  Scope;
    CComPtr<IPortableDevicePropVariantCollection> ObjectIDs;
    DWORD                                         NextObject;
    CComPtr<IPortableDeviceKeyCollection>         Properties;
    CComPtr<IPortableDeviceValuesCollection>      ValuesCollection;

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;
    }

private:
    DWORD m_cRef;
};

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

    HRESULT Initialize(_In_ FakeDevice *pDevice);

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

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

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

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

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

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

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

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

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

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

private:
    HRESULT CreateBulkPropertiesContext(
        _In_        ACCESS_SCOPE                          Scope,
        _In_        ContextMap*                           pContextMap,
        _In_        IPortableDevicePropVariantCollection* pObjectIDs,
        _In_        IPortableDeviceKeyCollection*         pProperties,
        _Outptr_result_nullonfailure_    LPWSTR*          ppszBulkPropertiesContext);

    HRESULT CreateBulkPropertiesContext(
        _In_        ACCESS_SCOPE                          Scope,
        _In_        ContextMap*                           pContextMap,
        _In_        REFGUID                               guidObjectFormat,
        _In_        LPCWSTR                               pszParentObjectID,
        _In_        DWORD                                 dwDepth,
        _In_        IPortableDeviceKeyCollection*         pProperties,
        _Outptr_result_nullonfailure_    LPWSTR*          ppszBulkPropertiesContext);

    HRESULT CreateBulkPropertiesContext(
        _In_        ACCESS_SCOPE                          Scope,
        _In_        ContextMap*                           pContextMap,
        _In_        IPortableDeviceValuesCollection*      pValuesCollection,
        _Outptr_result_nullonfailure_    LPWSTR*          ppszBulkPropertiesContext);

    HRESULT DestroyBulkPropertiesContext(
        _In_        ContextMap*                           pContextMap, 
        _In_        LPCWSTR                               pszBulkPropertiesContext);

    FakeDevice* m_pDevice;
};