summaryrefslogtreecommitdiff
path: root/wpd/WpdWudfSampleDriver/WpdObjectPropertiesBulk.h
blob: dc5cafc6e86ab9d7b0c927f616f0d08d118fd752 (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
#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() :
        NextObject(0),
        m_cRef(1)
    {

    }

    ~BulkPropertiesContext()
    {

    }

    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 *pFakeDevice);

    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_    ContextMap*                             pContextMap,
        _In_    IPortableDevicePropVariantCollection*   pObjectIDs,
        _In_    IPortableDeviceKeyCollection*           pProperties,
        _Outptr_result_nullonfailure_    LPWSTR*        ppszBulkPropertiesContext);

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

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

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

    FakeDevice* m_pFakeDevice;
};