1 /*++
2 
3 Copyright (c) Microsoft Corporation
4 
5 Module Name:
6 
7     FxGlobalsUm.h
8 
9 Abstract:
10 
11     This module contains user-mode specific globals definitions
12     for the frameworks.
13 
14     For common definitions common between km and um please see
15     FxGlobals.h
16 
17 Author:
18 
19 Environment:
20 
21     kernel mode only
22 
23 Revision History:
24 
25 
26 --*/
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 #include "FxGlobals.h"
32 
33 extern IUMDFPlatform *g_IUMDFPlatform;
34 extern IWudfHost2 *g_IWudfHost2;
35 
36 _Must_inspect_result_
37 __inline
38 BOOLEAN
FxIsProcessorGroupSupported(VOID)39 FxIsProcessorGroupSupported(
40     VOID
41     )
42 {
43     //
44     // UMDF 2.0 is targeted for platforms that support processor groups.
45     //
46     return TRUE;
47 }
48 
49 
50 __inline
51 VOID
FX_TRACK_DRIVER(__in PFX_DRIVER_GLOBALS FxDriverGlobals)52 FX_TRACK_DRIVER(
53     __in PFX_DRIVER_GLOBALS FxDriverGlobals
54     )
55 {
56     UNREFERENCED_PARAMETER(FxDriverGlobals);
57     //
58     // Not yet supported for UMDF
59     //
60 }
61 
62 _Must_inspect_result_
63 __inline
64 PVOID
FxAllocateFromNPagedLookasideListNoTracking(__in PNPAGED_LOOKASIDE_LIST Lookaside)65 FxAllocateFromNPagedLookasideListNoTracking (
66     __in PNPAGED_LOOKASIDE_LIST Lookaside
67     )
68 {
69     UNREFERENCED_PARAMETER(Lookaside);
70     ASSERTMSG("Not implemented for UMDF!\n", FALSE);
71     return NULL;
72 }
73 
74 __inline
75 PVOID
76 FxAllocateFromNPagedLookasideList (
77     _In_ PNPAGED_LOOKASIDE_LIST Lookaside,
78     _In_opt_ size_t ElementSize = 0
79     )
80 {
81     UNREFERENCED_PARAMETER(Lookaside);
82 
83     //
84     // UMDF doesn't yet use a look-aside list, so just alloc memory from pool.
85     //
86     return MxMemory::MxAllocatePoolWithTag(NonPagedPool, // not used
87                                           ElementSize,
88                                           0             // not used
89                                           );
90 }
91 
92 __inline
93 PVOID
FxAllocateFromPagedLookasideList(__in PPAGED_LOOKASIDE_LIST Lookaside)94 FxAllocateFromPagedLookasideList (
95     __in PPAGED_LOOKASIDE_LIST Lookaside
96     )
97 {
98     UNREFERENCED_PARAMETER(Lookaside);
99     ASSERTMSG("Not implemented for UMDF!\n", FALSE);
100     return NULL;
101 }
102 
103 __inline
104 VOID
FxFreeToNPagedLookasideListNoTracking(__in PNPAGED_LOOKASIDE_LIST Lookaside,__in PVOID Entry)105 FxFreeToNPagedLookasideListNoTracking (
106     __in PNPAGED_LOOKASIDE_LIST Lookaside,
107     __in PVOID Entry
108     )
109 {
110     UNREFERENCED_PARAMETER(Lookaside);
111     UNREFERENCED_PARAMETER(Entry);
112     ASSERTMSG("Not implemented for UMDF!\n", FALSE);
113 }
114 
115 __inline
116 VOID
FxFreeToPagedLookasideList(__in PPAGED_LOOKASIDE_LIST Lookaside,__in PVOID Entry)117 FxFreeToPagedLookasideList (
118     __in PPAGED_LOOKASIDE_LIST Lookaside,
119     __in PVOID Entry
120     )
121 {
122     UNREFERENCED_PARAMETER(Lookaside);
123     UNREFERENCED_PARAMETER(Entry);
124     ASSERTMSG("Not implemented for UMDF!\n", FALSE);
125 }
126 
127 __inline
128 VOID
FxFreeToNPagedLookasideList(__in PNPAGED_LOOKASIDE_LIST Lookaside,__in PVOID Entry)129 FxFreeToNPagedLookasideList (
130     __in PNPAGED_LOOKASIDE_LIST Lookaside,
131     __in PVOID Entry
132     )
133 {
134     UNREFERENCED_PARAMETER(Lookaside);
135 
136     MxMemory::MxFreePool(Entry);
137 }
138 
139 __inline
140 BOOL
IsCurrentThreadImpersonated()141 IsCurrentThreadImpersonated( )
142 {
143     return g_IWudfHost2->IsCurrentThreadImpersonated();
144 }
145 
146 __inline
147 PWDF_ACTIVATION_FRAME *
GetActivationList(VOID)148 GetActivationList(
149     VOID
150     )
151 {
152     return g_IUMDFPlatform->GetActivationListHead();
153 }
154 
155 //
156 // This has to be a macro (as opposed an inline function) beacause of the activation frame is
157 // allocated in the caller's stack.
158 //
159 // NOTE: This must not be wrapped in {}'s since that puts the activation frame in a very
160 //       short lived scope.  It's destructor will be called when control leaves the block
161 //       rather than when the function returns and that defeats the entire purpose of the
162 //       activation frame (which is to live for the life of the DDI call).
163 //
164 // NOTE 2:
165 // WDF_ACTIVATION constructor includes a default argument which is the _ReturnAddress()
166 // instrinsic. This macro should be placed in methods such that the _ReturnAddress
167 // points to calling driver code.
168 //
169 
170 #define DDI_ENTRY_IMPERSONATION_OK()                     \
171     WDF_ACTIVATION activationFrame(GetActivationList()); \
172 
173 #define DDI_ENTRY()                                                             \
174     DDI_ENTRY_IMPERSONATION_OK()                                                \
175     FX_VERIFY(                                                                  \
176         DRIVER(BadArgument, TODO),                                              \
177         CHECK("It is illegal to invoke this DDI while "                         \
178               "thread is impersonated",                                         \
179               (FALSE == IsCurrentThreadImpersonated())) \
180         );
181 
182 #ifdef __cplusplus
183 }
184 #endif
185