/*++

Copyright (c) Microsoft Corporation

ModuleName:

    MxEvent.h

Abstract:

    Kernel mode implementation of event
    class defined in MxEvent.h

Author:



Revision History:



--*/

#pragma once

typedef KEVENT MdEvent;

#include "MxEvent.h"

__inline
MxEvent::MxEvent()
{
    //
    // Make sure that m_Event is the first member.  That way if someone passes
    // address of MxEvent to Ke*Event functions, it would still work. 
    //
    // If this statement causes compilation failure, check if you added a field
    // before m_Event. 
    //
    C_ASSERT(FIELD_OFFSET(MxEvent, m_Event) == 0);

    CLEAR_DBGFLAG_INITIALIZED;
}

__inline
MxEvent::~MxEvent()
{
}

__inline
NTSTATUS
#pragma prefast(suppress:__WARNING_UNMATCHED_DECL_ANNO, "_Must_inspect_result_ not needed in kernel mode as the function always succeeds");
MxEvent::Initialize(
    __in EVENT_TYPE Type,
    __in BOOLEAN InitialState
    ) 
{
    KeInitializeEvent(&m_Event, Type, InitialState);

    SET_DBGFLAG_INITIALIZED;

    return STATUS_SUCCESS;
}

__inline
PVOID
MxEvent::GetEvent(
    )
{
    ASSERT_DBGFLAG_INITIALIZED;

    return &m_Event;
}


__inline
VOID
MxEvent::SetWithIncrement(
    __in KPRIORITY Priority
    )
{
    ASSERT_DBGFLAG_INITIALIZED;

    KeSetEvent(&m_Event, Priority, FALSE);
}

__inline
VOID
MxEvent::Set(
    )
{
    ASSERT_DBGFLAG_INITIALIZED;

    KeSetEvent(&m_Event, IO_NO_INCREMENT, FALSE);
}


__inline
VOID
MxEvent::Clear(
    )
{
    ASSERT_DBGFLAG_INITIALIZED;

    KeClearEvent(&m_Event);
}

__drv_when(Timeout == NULL && Alertable == FALSE, __drv_valueIs(==0))
__drv_when(Timeout ! = NULL && Alertable == FALSE, __drv_valueIs(==0;==258))
__drv_when(Timeout ! = NULL || Alertable == TRUE, _Must_inspect_result_)
__inline
NTSTATUS
MxEvent::WaitFor(
    __in     KWAIT_REASON  WaitReason,
    __in     KPROCESSOR_MODE  WaitMode,
    __in     BOOLEAN  Alertable,
    __in_opt PLARGE_INTEGER  Timeout
    )
{
    ASSERT_DBGFLAG_INITIALIZED;

    return KeWaitForSingleObject(
                    &m_Event,
                    WaitReason,
                    WaitMode,
                    Alertable,
                    Timeout
                    );
}

LONG
__inline
MxEvent::ReadState(
    )
{
    ASSERT_DBGFLAG_INITIALIZED;

    return KeReadStateEvent(&m_Event);
}


__inline
VOID
MxEvent::Uninitialize(
    )
{
    CLEAR_DBGFLAG_INITIALIZED;
}
