Sample Code

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

/*++

  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