ReactOS  0.4.15-dev-3272-g6e356a9
fxvalidatefunctions.cpp
Go to the documentation of this file.
1 /*++
2 
3 Copyright (c) Microsoft. All rights reserved.
4 
5 Module Name:
6 
7  FxValidateFunctions.cpp
8 
9 Abstract:
10 
11  Functions which validate external WDF data structures
12 
13 Author:
14 
15 
16 
17 Environment:
18 
19  Both kernel and user mode
20 
21 Revision History:
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 --*/
33 
34 #include "fxobjectpch.hpp"
35 
36 // We use DoTraceMessage
37 extern "C" {
38 #if defined(EVENT_TRACING)
39 #include "FxValidateFunctions.tmh"
40 #endif
41 }
42 
46  __in PFX_DRIVER_GLOBALS FxDriverGlobals,
49  )
50 {
51  if (Attributes == NULL) {
54  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDEVICE,
55  "WDF_OBJECT_ATTRIBUTES required, %!STATUS!",
57 
59  }
60  else {
61  return STATUS_SUCCESS;
62  }
63  }
64 
65  if (Attributes->Size != sizeof(WDF_OBJECT_ATTRIBUTES)) {
66  //
67  // Size is wrong, bail out
68  //
70  "Attributes %p Size incorrect, expected %d, got %d, %!STATUS!",
73 
75  }
76 
77  if (Attributes->ContextTypeInfo != NULL) {
78 #pragma prefast(suppress:__WARNING_REDUNDANTTEST, "different structs of the same size")
79  if (Attributes->ContextTypeInfo->Size !=
81  Attributes->ContextTypeInfo->Size !=
84  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
85  "Attributes %p ContextTypeInfo %p Size %d incorrect, expected %d, %!STATUS!",
86  Attributes, Attributes->ContextTypeInfo,
87  Attributes->ContextTypeInfo->Size,
89 
91  }
92 
93  //
94  // A ContextName != NULL and a ContextSize of 0 is allowed
95  //
96  if (Attributes->ContextTypeInfo->ContextSize > 0 &&
97  Attributes->ContextTypeInfo->ContextName == NULL) {
98 
100  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
101  "Attributes %p ContextTypeInfo %p ContextSize %I64d is not zero, "
102  "but ContextName is NULL, %!STATUS!",
103  Attributes, Attributes->ContextTypeInfo,
104  Attributes->ContextTypeInfo->ContextSize,
106 
108  }
109  }
110 
111  if (Attributes->ContextSizeOverride > 0) {
112  if (Attributes->ContextTypeInfo == NULL) {
113  //
114  // Can't specify additional size without a type
115  //
117  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
118  "Attributes %p ContextSizeOverride of %I64d specified, but no type "
119  "information, %!STATUS!",
120  Attributes, Attributes->ContextSizeOverride,
122 
124  }
125  else if (Attributes->ContextSizeOverride <
126  Attributes->ContextTypeInfo->ContextSize) {
128  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
129  "Attributes %p ContextSizeOverride %I64d < "
130  "ContextTypeInfo->ContextSize %I64d, %!STATUS!",
131  Attributes, Attributes->ContextSizeOverride,
132  Attributes->ContextTypeInfo->ContextSize,
134 
136  }
137  }
138 
140  if (Attributes->ParentObject != NULL) {
142  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
143  "Attributes %p does not allow a parent object to be set, set to "
144  "%p, %!STATUS!", Attributes, Attributes->ParentObject,
146 
148  }
149  }
151  Attributes->ParentObject == NULL) {
153  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDEVICE,
154  "ParentObject required in WDF_OBJECT_ATTRIBUTES %p, %!STATUS!",
156 
158  }
159 
160  // Enum range checks
161  if ((Attributes->ExecutionLevel == WdfExecutionLevelInvalid) ||
162  (Attributes->ExecutionLevel > WdfExecutionLevelDispatch)) {
164  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
165  "Attributes %p execution level set to %d, out of range, %!STATUS!",
166  Attributes, Attributes->ExecutionLevel,
169  }
170 
171  if ((Attributes->SynchronizationScope == WdfSynchronizationScopeInvalid) ||
172  (Attributes->SynchronizationScope > WdfSynchronizationScopeNone)) {
174  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
175  "Attributes %p synchronization scope set to %d, out of range, %!STATUS!",
176  Attributes, Attributes->SynchronizationScope,
179  }
180 
182 
183  //
184  // If synchronization is not allowed for this object,
185  // check the requested level to ensure none was specified.
186  //
187  if ((Attributes->SynchronizationScope != WdfSynchronizationScopeInheritFromParent) &&
188  (Attributes->SynchronizationScope != WdfSynchronizationScopeNone)) {
189 
191  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
192  "Attributes %p does not allow synchronization scope too be set, "
193  "but was set to %!WDF_SYNCHRONIZATION_SCOPE!, %!STATUS!",
194  Attributes, Attributes->SynchronizationScope,
196 
198  }
199  }
200 
202 
203  //
204  // If execution level restrictions are not allowed for this object,
205  // check the requested level to ensure none was specified.
206  //
207  if (Attributes->ExecutionLevel != WdfExecutionLevelInheritFromParent) {
209  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
210  "Attributes %p does not allow execution level to be set, but was"
211  " set to %!WDF_EXECUTION_LEVEL!, %!STATUS!",
212  Attributes, Attributes->ExecutionLevel,
214 
216  }
217  }
218 
219  return STATUS_SUCCESS;
220 }
#define STATUS_INFO_LENGTH_MISMATCH
Definition: udferr_usr.h:133
#define STATUS_WDF_OBJECT_ATTRIBUTES_INVALID
Definition: wdfstatus.h:171
LONG NTSTATUS
Definition: precomp.h:26
#define TRACINGAPIERROR
Definition: dbgtrace.h:60
#define STATUS_WDF_SYNCHRONIZATION_SCOPE_INVALID
Definition: wdfstatus.h:234
#define STATUS_WDF_EXECUTION_LEVEL_INVALID
Definition: wdfstatus.h:243
#define TRACINGDEVICE
Definition: dbgtrace.h:58
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define STATUS_WDF_PARENT_ASSIGNMENT_NOT_ALLOWED
Definition: wdfstatus.h:225
_Must_inspect_result_ NTSTATUS FxValidateObjectAttributes(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in ULONG Flags)
#define _Must_inspect_result_
Definition: ms_sal.h:558
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define STATUS_WDF_PARENT_NOT_SPECIFIED
Definition: wdfstatus.h:252
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
#define STATUS_SUCCESS
Definition: shellext.h:65
#define __in
Definition: dbghelp.h:35
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes