/*++

Copyright (c) Microsoft. All rights reserved.

Module Name:

    WudfDispatcher.h

Abstract:

    This file contains the class definition of the WUDF dispatcher object.

Author:



Environment:

    User mode only

Revision History:



--*/
#pragma once

extern const GUID IID_FxMessageDispatch;
extern const GUID IID_FxMessageDispatch2;

class FxMessageDispatch;

class FxMessageDispatch :
    public FxStump,
    public IFxMessageDispatch2
{
    //
    // Manager functions.
    //
private:
    FxMessageDispatch(
        _In_ FxDevice* Device
        ) :
        m_cRefs(1),
        m_Device(Device)
    {
    }

public:
    ~FxMessageDispatch()
    {
    //    SAFE_RELEASE(m_Device);
    }

    static
    NTSTATUS
    _CreateAndInitialize(
        _In_ PFX_DRIVER_GLOBALS DriverGlobals,
        _In_ FxDevice* Device,
        _Out_ FxMessageDispatch ** ppWudfDispatcher
       );

    //
    // IUnknown
    //
public:
    HRESULT
    __stdcall
    QueryInterface(
        _In_ REFIID     riid,
        _Out_ LPVOID*   ppvObject
        );

    ULONG
    __stdcall
    AddRef();

    ULONG
    __stdcall
    Release();

    //
    // IFxMessageDispatch
    //
public:
    virtual void __stdcall
    DispatchPnP(
        _In_ IWudfIrp *  pIrp
        );

    virtual void __stdcall
    CreateFile(
        _In_ IWudfIoIrp *  pCreateIrp
        );

    virtual void __stdcall
    DeviceControl(
        _In_ IWudfIoIrp * pIrp,
        _In_opt_ IUnknown * pFxContext
        );

    virtual void __stdcall
    ReadFile(
        _In_ IWudfIoIrp * pIrp,
        _In_opt_ IUnknown * pFxContext
        );

    virtual void __stdcall
    WriteFile(
        _In_ IWudfIoIrp * pIrp,
        _In_opt_ IUnknown * pFxContext
        );

    virtual void __stdcall
    CleanupFile(
        _In_ IWudfIoIrp * pIrp,
        _In_ IUnknown * pFxContext
        );

    virtual void __stdcall
    CloseFile(
        _In_ IWudfIoIrp * pIrp,
        _In_ IUnknown * pFxContext
        );

    virtual
    VOID
    __stdcall
    GetPreferredTransferMode(
        _Out_ UMINT::WDF_DEVICE_IO_BUFFER_RETRIEVAL *RetrievalMode,
        _Out_ UMINT::WDF_DEVICE_IO_TYPE *RWPreference,
        _Out_ UMINT::WDF_DEVICE_IO_TYPE *IoctlPreference
        );

    virtual void __stdcall
    FlushBuffers(
        _In_ IWudfIoIrp * pIrp,
        _In_opt_ IUnknown * pFxContext
        );

    virtual void __stdcall
    QueryInformationFile(
        _In_ IWudfIoIrp * pIrp,
        _In_opt_ IUnknown * pFxContext
        );

    virtual void __stdcall
    SetInformationFile(
        _In_ IWudfIoIrp * pIrp,
        _In_opt_ IUnknown * pFxContext
        );

    virtual NTSTATUS __stdcall
    ProcessWmiPowerQueryOrSetData(
        _In_ RdWmiPowerAction Action,
        _Out_ BOOLEAN *QueryResult
        );

    //
    // We should remove these methods from this interface.
    //
    virtual WUDF_INTERFACE_CONTEXT __stdcall
    RemoteInterfaceArrival(
        _In_    LPCGUID pDeviceInterfaceGuid,
        _In_    PCWSTR  pSymbolicLink
        );

    virtual void __stdcall
    RemoteInterfaceRemoval(
        _In_    WUDF_INTERFACE_CONTEXT RemoteInterfaceID
        );

    virtual BOOL __stdcall
    TransportQueryID(
        _In_    DWORD  Id,
        _In_    PVOID  DataBuffer,
        _In_    SIZE_T cbDataBufferSize
        );

    virtual ULONG __stdcall
    GetDirectTransferThreshold(
        VOID
        );

    virtual void __stdcall
    PoFxDevicePowerRequired(
        VOID
        );

    virtual void __stdcall
    PoFxDevicePowerNotRequired(
        VOID
        );

    //
    // Additional public functions.
    //
public:
    //
    // Returns the Dispatcher object from the given interface without
    // incrementing the refcount.
    //
    static
    FxMessageDispatch*
    _GetObjFromItf(
        _In_ IFxMessageDispatch* pIFxMessageDispatch
        );

    //
    // Returns the specified interface from the given object without
    // incrementing the refcount.
    //
    static
    IFxMessageDispatch*
    _GetDispatcherItf(
        _In_ FxMessageDispatch* pWudfDispatcher
        );

    //
    // Returns a weak ref to the embedded user-mode driver object.
    //
    PDRIVER_OBJECT_UM
    GetDriverObject(
        VOID
        )
    {
        return m_Device->GetDriver()->GetDriverObject();
    }

    MdDeviceObject
    GetDeviceObject(
        VOID
        )
    {
        return m_Device->GetDeviceObject();
    }

    //
    // Data members.
    //
private:
    //
    // Reference count for debugging purposes. The lifetime is managed by
    // FxDevice.
    //
    LONG                    m_cRefs;

    //
    // Device object associated with this dispatcher object.
    //
    FxDevice *           m_Device;
};