/*++

Copyright (c) Microsoft Corporation

Module Name:

    FxRelatedDevice.hpp

Abstract:

    This module defines the "related device" class.  These objects are used
    to handle device relations queries.

Author:



Environment:

    Both kernel and user mode

Revision History:

--*/

#ifndef _FXRELATEDDEVICE_H_
#define _FXRELATEDDEVICE_H_

enum FxRelatedDeviceState {
    RelatedDeviceStateUnspecified = 0,
    RelatedDeviceStateNeedsReportPresent,
    RelatedDeviceStateReportedPresent,
    RelatedDeviceStateNeedsReportMissing,
};

class FxRelatedDevice : public FxObject {
    friend FxRelatedDeviceList;

protected:
    FxTransactionedEntry m_TransactionedEntry;

    MdDeviceObject m_DeviceObject;

public:
    FxRelatedDeviceState m_State;

public:
    FxRelatedDevice(
        __in MdDeviceObject DeviceObject,
        __in PFX_DRIVER_GLOBALS FxDriverGlobals
        );

    ~FxRelatedDevice(
        VOID
        );

    MdDeviceObject
    GetDevice(
        VOID
        )
    {
        return m_DeviceObject;
    }

    DECLARE_INTERNAL_NEW_OPERATOR();

#ifdef INLINE_WRAPPER_ALLOCATION
#if (FX_CORE_MODE==FX_CORE_USER_MODE)
    FORCEINLINE
    PVOID
    GetCOMWrapper(
        )
    {
        PBYTE ptr = (PBYTE) this;
        return (ptr + (USHORT) WDF_ALIGN_SIZE_UP(sizeof(*this), MEMORY_ALLOCATION_ALIGNMENT));
    }
#endif
#endif
};

#endif // _FXRELATEDDEVICE_H_