[WDF] Add Windows Driver Framework files
[reactos.git] / sdk / lib / drivers / wdf / shared / inc / private / um / fxglobalsum.h
diff --git a/sdk/lib/drivers/wdf/shared/inc/private/um/fxglobalsum.h b/sdk/lib/drivers/wdf/shared/inc/private/um/fxglobalsum.h
new file mode 100644 (file)
index 0000000..472848d
--- /dev/null
@@ -0,0 +1,184 @@
+/*++
+
+Copyright (c) Microsoft Corporation
+
+Module Name:
+
+    FxGlobalsUm.h
+
+Abstract:
+
+    This module contains user-mode specific globals definitions
+    for the frameworks.
+
+    For common definitions common between km and um please see
+    FxGlobals.h
+
+Author:
+
+Environment:
+
+    kernel mode only
+
+Revision History:
+
+
+--*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "FxGlobals.h"
+
+extern IUMDFPlatform *g_IUMDFPlatform;
+extern IWudfHost2 *g_IWudfHost2;
+
+_Must_inspect_result_
+__inline
+BOOLEAN
+FxIsProcessorGroupSupported(
+    VOID
+    )
+{
+    //
+    // UMDF 2.0 is targeted for platforms that support processor groups.
+    //
+    return TRUE;
+}
+
+
+__inline
+VOID
+FX_TRACK_DRIVER(
+    __in PFX_DRIVER_GLOBALS FxDriverGlobals
+    )
+{
+    UNREFERENCED_PARAMETER(FxDriverGlobals);
+    //
+    // Not yet supported for UMDF
+    //
+}
+
+_Must_inspect_result_
+__inline
+PVOID
+FxAllocateFromNPagedLookasideListNoTracking (
+    __in PNPAGED_LOOKASIDE_LIST Lookaside
+    )
+{
+    UNREFERENCED_PARAMETER(Lookaside);
+    ASSERTMSG("Not implemented for UMDF!\n", FALSE);
+    return NULL;
+}
+
+__inline
+PVOID
+FxAllocateFromNPagedLookasideList (
+    _In_ PNPAGED_LOOKASIDE_LIST Lookaside,
+    _In_opt_ size_t ElementSize = 0
+    )
+{
+    UNREFERENCED_PARAMETER(Lookaside);
+
+    //
+    // UMDF doesn't yet use a look-aside list, so just alloc memory from pool.
+    //
+    return MxMemory::MxAllocatePoolWithTag(NonPagedPool, // not used
+                                          ElementSize,
+                                          0             // not used
+                                          );
+}
+
+__inline
+PVOID
+FxAllocateFromPagedLookasideList (
+    __in PPAGED_LOOKASIDE_LIST Lookaside
+    )
+{
+    UNREFERENCED_PARAMETER(Lookaside);
+    ASSERTMSG("Not implemented for UMDF!\n", FALSE);
+    return NULL;
+}
+
+__inline
+VOID
+FxFreeToNPagedLookasideListNoTracking (
+    __in PNPAGED_LOOKASIDE_LIST Lookaside,
+    __in PVOID Entry
+    )
+{
+    UNREFERENCED_PARAMETER(Lookaside);
+    UNREFERENCED_PARAMETER(Entry);
+    ASSERTMSG("Not implemented for UMDF!\n", FALSE);
+}
+
+__inline
+VOID
+FxFreeToPagedLookasideList (
+    __in PPAGED_LOOKASIDE_LIST Lookaside,
+    __in PVOID Entry
+    )
+{
+    UNREFERENCED_PARAMETER(Lookaside);
+    UNREFERENCED_PARAMETER(Entry);
+    ASSERTMSG("Not implemented for UMDF!\n", FALSE);
+}
+
+__inline
+VOID
+FxFreeToNPagedLookasideList (
+    __in PNPAGED_LOOKASIDE_LIST Lookaside,
+    __in PVOID Entry
+    )
+{
+    UNREFERENCED_PARAMETER(Lookaside);
+
+    MxMemory::MxFreePool(Entry);
+}
+
+__inline
+BOOL
+IsCurrentThreadImpersonated( )
+{
+    return g_IWudfHost2->IsCurrentThreadImpersonated();
+}
+
+__inline
+PWDF_ACTIVATION_FRAME *
+GetActivationList(
+    VOID
+    )
+{
+    return g_IUMDFPlatform->GetActivationListHead();
+}
+
+//
+// This has to be a macro (as opposed an inline function) beacause of the activation frame is
+// allocated in the caller's stack.
+//
+// NOTE: This must not be wrapped in {}'s since that puts the activation frame in a very
+//       short lived scope.  It's destructor will be called when control leaves the block
+//       rather than when the function returns and that defeats the entire purpose of the
+//       activation frame (which is to live for the life of the DDI call).
+//
+// NOTE 2:
+// WDF_ACTIVATION constructor includes a default argument which is the _ReturnAddress()
+// instrinsic. This macro should be placed in methods such that the _ReturnAddress
+// points to calling driver code.
+//
+
+#define DDI_ENTRY_IMPERSONATION_OK()                     \
+    WDF_ACTIVATION activationFrame(GetActivationList()); \
+
+#define DDI_ENTRY()                                                             \
+    DDI_ENTRY_IMPERSONATION_OK()                                                \
+    FX_VERIFY(                                                                  \
+        DRIVER(BadArgument, TODO),                                              \
+        CHECK("It is illegal to invoke this DDI while "                         \
+              "thread is impersonated",                                         \
+              (FALSE == IsCurrentThreadImpersonated())) \
+        );
+
+#ifdef __cplusplus
+}
+#endif