[WDF] Add Windows Driver Framework files
[reactos.git] / sdk / lib / drivers / wdf / shared / inc / private / common / fxcallbacklock.hpp
diff --git a/sdk/lib/drivers/wdf/shared/inc/private/common/fxcallbacklock.hpp b/sdk/lib/drivers/wdf/shared/inc/private/common/fxcallbacklock.hpp
new file mode 100644 (file)
index 0000000..9002ffb
--- /dev/null
@@ -0,0 +1,648 @@
+/*++
+
+Copyright (c) Microsoft Corporation
+
+Module Name:
+
+    FxCallbackLock.hpp
+
+Abstract:
+
+    This is the C++ header for the FxCallbackLock
+
+    This represents an abstract class for implementing
+    the locks used when we callback into the device driver.
+
+Author:
+
+
+
+
+Revision History:
+
+
+        Made it mode agnostic
+
+--*/
+
+#ifndef _FXCALLBACKLOCK_H_
+#define _FXCALLBACKLOCK_H_
+
+extern "C" {
+
+#if defined(EVENT_TRACING)
+#include "FxCallbackLock.hpp.tmh"
+#endif
+
+}
+
+//
+// Callback locks track current owner. This is used to determine if a callback
+// event into the driver needs to be deferred to prevent recursive
+// locking.
+//
+// A Callback lock supports recursive locking, but this is not exposed in
+// the current Driver Frameworks <-> Device Driver interactions, and results
+// in a verifier assert.
+//
+
+class FxCallbackLock : public FxGlobalsStump {
+
+protected:
+    MxThread         m_OwnerThread;
+    ULONG            m_RecursionCount;
+
+    // For Verifier
+    FxVerifierLock*  m_Verifier;
+
+public:
+
+
+
+
+
+
+
+    KIRQL m_PreviousIrql;
+
+public:
+
+    FxCallbackLock(
+        PFX_DRIVER_GLOBALS FxDriverGlobals
+        ) :
+        FxGlobalsStump(FxDriverGlobals)
+    {
+        m_OwnerThread = NULL;
+        m_RecursionCount = 0;
+        m_Verifier = NULL;
+    }
+
+    virtual ~FxCallbackLock()
+    {
+    }
+
+    virtual
+    void
+    Initialize(
+        FxObject* ParentObject
+        ) = 0;
+
+    virtual
+    void
+    Lock(
+        __out PKIRQL PreviousIrql
+        ) = 0;
+
+    virtual
+    void
+    Unlock(
+        __in KIRQL PreviousIrql
+        ) = 0;
+
+    // TRUE if the current thread is the owner
+    _Must_inspect_result_
+    virtual
+    BOOLEAN
+    IsOwner(
+        VOID
+        ) = 0;
+
+    VOID
+    CheckOwnership(
+        VOID
+        )
+    {
+        PFX_DRIVER_GLOBALS pFxDriverGlobals;
+
+        pFxDriverGlobals = GetDriverGlobals();
+
+        //
+        // If verify locks is on, catch drivers
+        // returning with the lock released.
+        //
+        if (pFxDriverGlobals->FxVerifierLock) {
+            if (IsOwner() == FALSE) {
+                DoTraceLevelMessage(
+                    pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDEVICE,
+                    "Callback: Driver released the callback lock 0x%p",
+                    this);
+                FxVerifierDbgBreakPoint(pFxDriverGlobals);
+            }
+        }
+    }
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#endif // _FXCALLBACKLOCK_H_