/*++

Copyright (c) Microsoft Corporation

Module Name:

    FxIoQueueCallbacks.h

Abstract:

    This module implements the I/O package queue object callbacks

Author:




Environment:

    Both kernel and user mode

Revision History:

--*/

#ifndef _FXIOQUEUECALLBACKS_H_
#define _FXIOQUEUECALLBACKS_H_

//
// These delegates are in a seperate file since there are many
//

//
// EvtIoDefault callback delegate
//
class FxIoQueueIoDefault : public FxLockedCallback {

public:
    PFN_WDF_IO_QUEUE_IO_DEFAULT Method;

    FxIoQueueIoDefault(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in WDFQUEUE                Queue,
        __in WDFREQUEST              Request
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(Queue, Request);
            CallbackEnd(irql);
        }
    }
};


//
// EvtIoStop callback delegate
//
class FxIoQueueIoStop : public FxLockedCallback {

public:
    PFN_WDF_IO_QUEUE_IO_STOP Method;

    FxIoQueueIoStop(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in WDFQUEUE   Queue,
        __in WDFREQUEST Request,
        __in ULONG ActionFlags
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(Queue, Request, ActionFlags);
            CallbackEnd(irql);
        }
    }
};

//
// EvtIoResume callback delegate
//
class FxIoQueueIoResume : public FxLockedCallback {

public:
    PFN_WDF_IO_QUEUE_IO_RESUME Method;

    FxIoQueueIoResume(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in WDFQUEUE   Queue,
        __in WDFREQUEST Request
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(Queue, Request);
            CallbackEnd(irql);
        }
    }
};

//
// EvtIoRead callback delegate
//
class FxIoQueueIoRead : public FxLockedCallback {

public:
    PFN_WDF_IO_QUEUE_IO_READ Method;

    FxIoQueueIoRead(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in WDFQUEUE   Queue,
        __in WDFREQUEST Request,
        __in ULONG      Length
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(Queue, Request, Length);
            CallbackEnd(irql);
        }
    }
};

//
// EvtIoWrite callback delegate
//
class FxIoQueueIoWrite : public FxLockedCallback {

public:
    PFN_WDF_IO_QUEUE_IO_WRITE Method;

    FxIoQueueIoWrite(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in WDFQUEUE   Queue,
        __in WDFREQUEST Request,
        __in ULONG      Length
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(Queue, Request, Length);
            CallbackEnd(irql);
        }
    }
};

//
// EvtIoIoctl callback delegate
//
class FxIoQueueIoDeviceControl : public FxLockedCallback {

public:
    PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL Method;

    FxIoQueueIoDeviceControl(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in WDFQUEUE   Queue,
        __in WDFREQUEST Request,
        __in ULONG      OutputBufferLength,
        __in ULONG      InputBufferLength,
        __in ULONG      IoControlCode
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(
                Queue,
                Request,
                OutputBufferLength,
                InputBufferLength,
                IoControlCode
                );
            CallbackEnd(irql);
        }
    }
};

//
// EvtIoInternalIoctl callback delegate
//
class FxIoQueueIoInternalDeviceControl : public FxLockedCallback {

public:
    PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL Method;

    FxIoQueueIoInternalDeviceControl(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in WDFQUEUE   Queue,
        __in WDFREQUEST Request,
        __in ULONG      OutputBufferLength,
        __in ULONG      InputBufferLength,
        __in ULONG      IoInternalControlCode
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(
                Queue,
                Request,
                OutputBufferLength,
                InputBufferLength,
                IoInternalControlCode
                );
            CallbackEnd(irql);
        }
    }
};

//
// EvtIoQueueStatus callback delegate
//
class FxIoQueueIoState : public FxLockedCallback {

public:
    PFN_WDF_IO_QUEUE_STATE Method;

    FxIoQueueIoState(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in WDFQUEUE   Queue,
        __in WDFCONTEXT Context
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(Queue, Context);
            CallbackEnd(irql);
        }
    }
};

class FxIoQueueIoCanceledOnQueue : public FxLockedCallback {

public:
    PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE Method;

    FxIoQueueIoCanceledOnQueue(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in WDFQUEUE   Queue,
        __in WDFREQUEST Request
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(Queue, Request);
            CallbackEnd(irql);
        }
    }
};


class FxIoQueueForwardProgressAllocateResourcesReserved : public FxCallback {

public:
    PFN_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST  Method;

    FxIoQueueForwardProgressAllocateResourcesReserved(
        VOID
        )   :
        FxCallback()
    {
        Method = NULL;
    }

    _Must_inspect_result_
    NTSTATUS
    Invoke(
        __in WDFQUEUE   Queue,
        __in WDFREQUEST Request
        )
    {
        ASSERT(Method != NULL);
        return Method(Queue, Request);
    }
};

class FxIoQueueForwardProgressAllocateResources : public FxCallback {

public:
    PFN_WDF_IO_ALLOCATE_REQUEST_RESOURCES   Method;

    FxIoQueueForwardProgressAllocateResources(
        VOID
        )   :
       FxCallback()
    {
        Method = NULL;
    }

    _Must_inspect_result_
    NTSTATUS
    Invoke(
        __in WDFQUEUE   Queue,
        __in WDFREQUEST Request
        )
    {
        ASSERT(Method != NULL);
        return Method(Queue, Request);
    }
};

class FxIoQueueForwardProgressExamineIrp : public FxCallback {
public:
    PFN_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS Method;

    FxIoQueueForwardProgressExamineIrp(
        VOID
        )   :
        FxCallback()
    {
        Method = NULL;
    }

    WDF_IO_FORWARD_PROGRESS_ACTION
    Invoke(
        __in WDFQUEUE   Queue,
        __in PIRP       Irp
        )
    {
        ASSERT(Method != NULL);
        return Method(Queue, Irp);
    }
};



#endif // _FXIOQUEUECALLBACKS_H_