1 /*++ 2 3 Copyright (c) Microsoft Corporation 4 5 ModuleName: 6 7 MxPagedLockKm.h 8 9 Abstract: 10 11 Kernel mode implementation of paged lock defined in 12 MxPagedLock.h 13 14 Author: 15 16 17 18 Revision History: 19 20 21 22 --*/ 23 24 #pragma once 25 26 #include "dbgmacros.h" 27 28 typedef FAST_MUTEX MdPagedLock; 29 30 #include "mxpagedlock.h" 31 32 __inline 33 MxPagedLock::MxPagedLock( 34 ) 35 { 36 CLEAR_DBGFLAG_INITIALIZED; 37 38 // 39 // Temporarily call initialize from c'tor 40 // so that we don't have to churn all of the KMDF code 41 // 42 #ifndef MERGE_COMPLETE 43 (VOID) MxPagedLock::Initialize(); 44 #endif 45 } 46 47 __inline 48 NTSTATUS 49 #ifdef _MSC_VER 50 #pragma prefast(suppress:__WARNING_UNMATCHED_DEFN, "_Must_inspect_result_ not needed in kernel mode as the function always succeeds"); 51 #endif 52 MxPagedLockNoDynam::Initialize( 53 ) 54 { 55 ExInitializeFastMutex(&m_Lock); 56 57 SET_DBGFLAG_INITIALIZED; 58 59 return STATUS_SUCCESS; 60 } 61 62 __drv_maxIRQL(APC_LEVEL) 63 __drv_setsIRQL(APC_LEVEL) 64 __drv_savesIRQLGlobal(FastMutexObject, this->m_Lock) 65 _Acquires_lock_(this->m_Lock) 66 __inline 67 VOID 68 MxPagedLockNoDynam::Acquire( 69 ) 70 { 71 ASSERT_DBGFLAG_INITIALIZED; 72 73 ExAcquireFastMutex(&m_Lock); 74 } 75 76 __inline 77 VOID 78 MxPagedLockNoDynam::AcquireUnsafe( 79 ) 80 { 81 ASSERT_DBGFLAG_INITIALIZED; 82 83 ExAcquireFastMutexUnsafe(&m_Lock); 84 } 85 86 _Must_inspect_result_ 87 __drv_maxIRQL(APC_LEVEL) 88 __drv_savesIRQLGlobal(FastMutexObject, this->m_Lock) 89 __drv_valueIs(==1;==0) 90 __drv_when(return==1, __drv_setsIRQL(APC_LEVEL)) 91 _When_(return==1, _Acquires_lock_(this->m_Lock)) 92 __inline 93 BOOLEAN 94 MxPagedLockNoDynam::TryToAcquire( 95 ) 96 { 97 ASSERT_DBGFLAG_INITIALIZED; 98 99 return ExTryToAcquireFastMutex(&m_Lock); 100 } 101 102 __drv_requiresIRQL(APC_LEVEL) 103 __drv_restoresIRQLGlobal(FastMutexObject, this->m_Lock) 104 _Releases_lock_(this->m_Lock) 105 __inline 106 VOID 107 MxPagedLockNoDynam::Release( 108 ) 109 { 110 ASSERT_DBGFLAG_INITIALIZED; 111 112 ExReleaseFastMutex(&m_Lock); 113 } 114 115 __inline 116 VOID 117 MxPagedLockNoDynam::ReleaseUnsafe( 118 ) 119 { 120 ASSERT_DBGFLAG_INITIALIZED; 121 122 ExReleaseFastMutexUnsafe(&m_Lock); 123 } 124 125 126 __inline 127 VOID 128 MxPagedLockNoDynam::Uninitialize( 129 ) 130 { 131 CLEAR_DBGFLAG_INITIALIZED; 132 } 133 134 __inline 135 MxPagedLock::~MxPagedLock( 136 ) 137 { 138 CLEAR_DBGFLAG_INITIALIZED; 139 } 140