[WDF] Add Windows Driver Framework files
[reactos.git] / sdk / lib / drivers / wdf / shared / inc / primitives / common / mxlock.h
diff --git a/sdk/lib/drivers/wdf/shared/inc/primitives/common/mxlock.h b/sdk/lib/drivers/wdf/shared/inc/primitives/common/mxlock.h
new file mode 100644 (file)
index 0000000..7c67291
--- /dev/null
@@ -0,0 +1,109 @@
+/*++
+
+Copyright (c) Microsoft Corporation
+
+ModuleName:
+
+    MxLock.h
+
+Abstract:
+
+    Mode agnostic definition of lock
+
+    See MxLockKm.h and MxLockUm.h for mode
+    specific implementations
+
+Author:
+
+
+
+Revision History:
+
+
+
+--*/
+
+#pragma once
+
+//
+// MxLockNoDynam has no c'tor/d'tor
+// so as to be usable in global structs in km
+//
+// MxLock dervies from it and adds c'tor/d'tor
+//
+class MxLockNoDynam
+{
+
+DECLARE_DBGFLAG_INITIALIZED;
+
+protected:
+    MdLock m_Lock;
+public:
+    MdLock &
+    Get(
+        )
+    {
+        return m_Lock;
+    }
+
+    __inline
+    VOID
+    Initialize(
+        );
+
+    _Acquires_lock_(this->m_Lock)
+    __drv_maxIRQL(DISPATCH_LEVEL)
+    __drv_setsIRQL(DISPATCH_LEVEL)
+    __inline
+    VOID
+    Acquire(
+        __out __drv_deref(__drv_savesIRQL) KIRQL * OldIrql
+        );
+
+#if ((FX_CORE_MODE)==(FX_CORE_USER_MODE))
+
+    CHECK_RETURN_IF_USER_MODE
+    __inline
+    BOOLEAN
+    TryToAcquire(
+        VOID
+        );
+#endif
+
+    _Acquires_lock_(this->m_Lock)
+    __drv_requiresIRQL(DISPATCH_LEVEL)
+    __inline
+    VOID
+    AcquireAtDpcLevel(
+        );
+
+    _Releases_lock_(this->m_Lock)
+    __drv_requiresIRQL(DISPATCH_LEVEL)
+    __inline
+    VOID
+    Release(
+        __drv_restoresIRQL KIRQL NewIrql
+        );
+
+    _Releases_lock_(this->m_Lock)
+    __drv_requiresIRQL(DISPATCH_LEVEL)
+    __inline
+    VOID
+    ReleaseFromDpcLevel(
+        );
+
+    __inline
+    VOID
+    Uninitialize(
+        );
+};
+
+class MxLock : public MxLockNoDynam
+{
+public:
+    __inline
+    MxLock();
+
+    __inline
+    ~MxLock();
+};