//
//    Copyright (C) Microsoft.  All rights reserved.
//
#ifndef _FXUSBIDLEINFO_H_
#define _FXUSBIDLEINFO_H_

struct FxUsbIdleInfo : public FxStump {
public:
    FxUsbIdleInfo(
        __in FxPkgPnp* PkgPnp
        ) : m_IdleCallbackEvent(NULL), m_IdleIrp(NULL)
    {
        m_CallbackInfo.IdleCallback = _UsbIdleCallback;
        m_CallbackInfo.IdleContext = PkgPnp;
        m_EventDropped = FALSE;
    }

    _Must_inspect_result_
    NTSTATUS
    Initialize(
        VOID
        );

    FxCREvent* m_IdleCallbackEvent;

    FxAutoIrp m_IdleIrp;

    USB_IDLE_CALLBACK_INFO m_CallbackInfo;

    //
    // used to check if UsbSelectiveSuspendCompleted event was dropped.
    //
    BOOLEAN m_EventDropped;

private:

    __drv_maxIRQL(PASSIVE_LEVEL)
    static
    VOID
    STDCALL
    _UsbIdleCallback(
        __in PVOID Context
        );
};

#endif // _FXUSBIDLEINFO_H_