1 /*++ 2 3 Copyright (c) Microsoft Corporation 4 5 ModuleName: 6 7 MxEvent.h 8 9 Abstract: 10 11 Kernel mode implementation of event 12 class defined in MxEvent.h 13 14 Author: 15 16 17 18 Revision History: 19 20 21 22 --*/ 23 24 #pragma once 25 26 typedef KEVENT MdEvent; 27 28 #include "mxevent.h" 29 30 __inline 31 MxEvent::MxEvent() 32 { 33 // 34 // Make sure that m_Event is the first member. That way if someone passes 35 // address of MxEvent to Ke*Event functions, it would still work. 36 // 37 // If this statement causes compilation failure, check if you added a field 38 // before m_Event. 39 // 40 C_ASSERT(FIELD_OFFSET(MxEvent, m_Event) == 0); 41 42 CLEAR_DBGFLAG_INITIALIZED; 43 } 44 45 __inline 46 MxEvent::~MxEvent() 47 { 48 } 49 50 __inline 51 NTSTATUS 52 #ifdef _MSC_VER 53 #pragma prefast(suppress:__WARNING_UNMATCHED_DECL_ANNO, "_Must_inspect_result_ not needed in kernel mode as the function always succeeds"); 54 #endif 55 MxEvent::Initialize( 56 __in EVENT_TYPE Type, 57 __in BOOLEAN InitialState 58 ) 59 { 60 KeInitializeEvent(&m_Event, Type, InitialState); 61 62 SET_DBGFLAG_INITIALIZED; 63 64 return STATUS_SUCCESS; 65 } 66 67 __inline 68 PVOID 69 MxEvent::GetEvent( 70 ) 71 { 72 ASSERT_DBGFLAG_INITIALIZED; 73 74 return &m_Event; 75 } 76 77 78 __inline 79 VOID 80 MxEvent::SetWithIncrement( 81 __in KPRIORITY Priority 82 ) 83 { 84 ASSERT_DBGFLAG_INITIALIZED; 85 86 KeSetEvent(&m_Event, Priority, FALSE); 87 } 88 89 __inline 90 VOID 91 MxEvent::Set( 92 ) 93 { 94 ASSERT_DBGFLAG_INITIALIZED; 95 96 KeSetEvent(&m_Event, IO_NO_INCREMENT, FALSE); 97 } 98 99 100 __inline 101 VOID 102 MxEvent::Clear( 103 ) 104 { 105 ASSERT_DBGFLAG_INITIALIZED; 106 107 KeClearEvent(&m_Event); 108 } 109 110 __drv_when(Timeout == NULL && Alertable == FALSE, __drv_valueIs(==0)) 111 __drv_when(Timeout != NULL && Alertable == FALSE, __drv_valueIs(==0;==258)) 112 __drv_when(Timeout != NULL || Alertable == TRUE, _Must_inspect_result_) 113 __inline 114 NTSTATUS 115 MxEvent::WaitFor( 116 __in KWAIT_REASON WaitReason, 117 __in KPROCESSOR_MODE WaitMode, 118 __in BOOLEAN Alertable, 119 __in_opt PLARGE_INTEGER Timeout 120 ) 121 { 122 ASSERT_DBGFLAG_INITIALIZED; 123 124 return KeWaitForSingleObject( 125 &m_Event, 126 WaitReason, 127 WaitMode, 128 Alertable, 129 Timeout 130 ); 131 } 132 133 LONG 134 __inline 135 MxEvent::ReadState( 136 ) 137 { 138 ASSERT_DBGFLAG_INITIALIZED; 139 140 return KeReadStateEvent(&m_Event); 141 } 142 143 144 __inline 145 VOID 146 MxEvent::Uninitialize( 147 ) 148 { 149 CLEAR_DBGFLAG_INITIALIZED; 150 } 151