Sample Code

Windows Driver Samples/ Toaster Sample Driver/ C++/ umdf/ func/ Queue.cpp/

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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
/*++
 
  Copyright (c) Microsoft Corporation, All Rights Reserved
 
  Module Name:
 
    Queue.cpp
 
  Abstract:
 
    This file contains the queue callback object implementation.
 
  Environment:
 
    Windows User-Mode Driver Framework (WUDF)
 
--*/
 
#include "stdafx.h"
#include "Queue.h"
#include <devioctl.h>
#include <public.h>
 
 
#include "internal.h"
#include "queue.tmh"
 
HRESULT
CQueue::QueryInterface(
    _In_ REFIID riid,
    _Out_ LPVOID* ppvObject
    )
/*++
 
Routine Description:
 
    The framework calls this function to determine which callback
    interfaces we support.
 
Arguments:
 
    riid        - GUID for a given callback interface.
    ppvObject   - We set this pointer to our object if we support the
                  interface indicated by riid.
 
Return Value:
 
   HRESULT S_OK - Interface is supported.
 
--*/
{
    if (ppvObject == NULL)
    {
        return E_INVALIDARG;
    }
    *ppvObject = NULL;
 
    if ( riid == _uuidof(IUnknown) )
    {
        *ppvObject = static_cast<IQueueCallbackDeviceIoControl *> (this);
    }   
    else if ( riid == _uuidof(IQueueCallbackDeviceIoControl) )
    {
        *ppvObject = static_cast<IQueueCallbackDeviceIoControl *>(this);
    }
    else if ( riid == _uuidof(IQueueCallbackRead) )
    {
        *ppvObject = static_cast<IQueueCallbackRead *>(this);
    }
    else if ( riid == _uuidof(IQueueCallbackWrite) )
    {
        *ppvObject = static_cast<IQueueCallbackWrite *>(this);
    }
    else
    {
        return E_NOINTERFACE;
    }
 
    this->AddRef();
 
    return S_OK;
}
 
 
 
ULONG CQueue::AddRef()
/*++
 
Routine Description:
 
    Increments the ref count on this object.
 
Arguments:
 
    None.
 
Return Value:
 
    ULONG - new ref count.
 
--*/
{
    LONG cRefs = InterlockedIncrement( &m_cRefs );
    return cRefs;
}
 
_At_(this, __drv_freesMem(object))
ULONG CQueue::Release()
/*++
 
Routine Description:
 
    Decrements the ref count on this object.
 
Arguments:
 
    None.
 
Return Value:
 
    ULONG - new ref count.
 
--*/
{
    LONG cRefs;
 
    cRefs = InterlockedDecrement( &m_cRefs );
 
    if( 0 == cRefs )
    {
        delete this;
    }
 
    return cRefs;
}
 
 
void
CQueue::OnDeviceIoControl(
    _In_ IWDFIoQueue*    pQueue,
    _In_ IWDFIoRequest*  pRequest,
    _In_ ULONG           ControlCode,  
    _In_ SIZE_T         /*InputBufferSizeInBytes*/,
    _In_ SIZE_T         /*OutputBufferSizeInBytes*/       
    )
/*++
 
Routine Description:
 
    The framework calls this function when somone has called
    DeviceIoControl on the device.
 
Arguments:
 
Return Value:
    None
 
--*/
{
    HRESULT     hr = S_OK;
    IWDFDevice  *pDevice = NULL;
 
    Trace(TRACE_LEVEL_INFORMATION,"%!FUNC!");
 
    //
    // Retrieve the queue's parent device object
    //
    pQueue->GetDevice(&pDevice);
     
    WUDF_TEST_DRIVER_ASSERT(pDevice);
     
    switch (ControlCode)
    {
       case IOCTL_TOASTER_DONT_DISPLAY_IN_UI_DEVICE:
    
           //
           // This is just an example on how to hide your device in the
           // device manager. Please remove your code when you adapt this
           // sample for your hardware.
           //
             pDevice->SetPnpState(WdfPnpStateDontDisplayInUI, WdfTrue);
             pDevice->CommitPnpState();
              
             break;
    
       default:
            hr = E_FAIL; //invalid request
 
            Trace(TRACE_LEVEL_ERROR,"%!FUNC! Invalid IOCTL %!hresult!",hr);
    }
    pRequest->Complete(hr);
     
    return;
}
 
void
CQueue::OnRead(
    _In_ IWDFIoQueue* /* pQueue */,
    _In_ IWDFIoRequest* pRequest,
    _In_ SIZE_T SizeInBytes
    )
/*++
 
Routine Description:
 
 
    Read dispatch routine
    IQueueCallbackRead
 
Arguments:
     
    pQueue - Framework Queue instance
    pRequest - Framework Request  instance
    SizeInBytes - Length of bytes in the read buffer
 
    Copy available data into the read buffer
 
Return Value:
    None.
 
--*/
{     
    Trace(TRACE_LEVEL_INFORMATION,"%!FUNC!");
 
    //
    // No need to check for zero-length reads.
    //
    // The framework queue is created with the flag bAllowZeroLengthRequests = FALSE.
    // FALSE indicates that the framework completes zero-length I/O requests instead
    // of putting them in the I/O queue.
    //
 
    //
    // TODO: Put your Read request processing here
    //
 
    pRequest->CompleteWithInformation(S_OK, SizeInBytes);
 
    return;
 
}
 
void
CQueue::OnWrite(
    _In_ IWDFIoQueue * /* pQueue */,
    _In_ IWDFIoRequest * pRequest,
    _In_ SIZE_T BytesToWrite
    )
/*++
 
Routine Description:
 
    Write dispatch routine
    IQueueCallbackWrite
 
Arguments:
     
    pQueue - Framework Queue instance
    pRequest - Framework Request  instance
    BytesToWrite - Length of bytes in the write buffer
 
    Allocate and copy data to local buffer
 
Return Value:
    None.   
 
--*/
    Trace(TRACE_LEVEL_INFORMATION,"%!FUNC!");
 
    //
    // No need to check for zero-length writes.
    //  
     
    //
    // TODO: Put your Write request processing here
    //
 
    pRequest->CompleteWithInformation(S_OK, BytesToWrite);
 
    return;
}

Our Services

  • What our customers say about us?

© 2011-2025 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