ReactOS 0.4.16-dev-1946-g52006dd
fxdriverapi.cpp
Go to the documentation of this file.
1/*++
2
3Copyright (c) Microsoft Corporation
4
5Module Name:
6
7 FxDriverApi.cpp
8
9Abstract:
10
11 This module contains the "C" interface for the FxDriver object.
12
13Author:
14
15
16
17Environment:
18
19 Both kernel and user mode
20
21Revision History:
22
23--*/
24
25#include "coreprivshared.hpp"
26
27// Tracing support
28extern "C" {
29#include <ntverp.h>
30// #include "FxDriverApi.tmh"
31}
32
33#include "fxtelemetry.hpp"
34
35//
36// extern the whole file
37//
38extern "C" {
39
40//
41// Driver Pool Allocations
42//
43
44
48WDFEXPORT(WdfDriverGetRegistryPath)(
49 __in
50 PWDF_DRIVER_GLOBALS DriverGlobals,
51 __in
52 WDFDRIVER Driver
53 )
54{
55 DDI_ENTRY();
56
60
62 Driver,
64 (PVOID *)&pDriver,
66
69 return NULL;
70 }
71
73}
74
79WDFEXPORT(WdfDriverCreate)(
80 __in
81 PWDF_DRIVER_GLOBALS DriverGlobals,
82 __in
84 __in
88 __in
91 WDFDRIVER* Driver
92 )
93{
94 DDI_ENTRY();
95
99 WDFDRIVER hDriver;
102
103 hDriver = NULL;
104 pFxDriverGlobals = GetFxDriverGlobals(DriverGlobals);
105
109
110 //
111 // Validate the size of the input Driver Config structure. The size changed
112 // after v1.1. The size is the same for v1.1 and v1.0, verify that.
113 //
115
116 if (DriverConfig->Size != sizeof(WDF_DRIVER_CONFIG)
117 &&
118 DriverConfig->Size != sizeof(WDF_DRIVER_CONFIG_V1_1)) {
119
123 "WDF_DRIVER_CONFIG got Size %d, expected v1.1 size %d or cur ver size %d, %!STATUS!",
124 DriverConfig->Size,
126
127 return status;
128 }
129
130 //
131 // Validate the DriverInitFlags value in the Driver Config.
132 //
133 if ((DriverConfig->DriverInitFlags & ~validFlags) != 0) {
137 "DriverInitFlags 0x%x invalid, valid flags are 0x%x, %!STATUS!",
138 DriverConfig->DriverInitFlags, validFlags, status);
139 return status;
140 }
141
143 if (!NT_SUCCESS(status)) {
144 return status;
145 }
146
148 if (!NT_SUCCESS(status)) {
149 return status;
150 }
151
152 //
153 // Driver and Public.Driver are set once WdfDriverCreate returns successfully.
154 // If they are set, that means this DDI has already been called for this
155 // client. Return an error if this occurrs.
156 //
158 pFxDriverGlobals->Public.Driver != NULL) {
159
161
163 "WdfDriverCreate can only be called one time per "
164 "WDM PDRIVER_OBJECT %p, %!STATUS!",
166
167 return status;
168 }
169
170 if (Driver != NULL) {
171 *Driver = NULL;
172 }
173
174 //
175 // Initializing the tag requires initializing the driver name first.
176 //
178
179 //
180 // Initialize the tag before any allocation so that we can use the correct
181 // tag value when allocating on behalf of the driver (for all allocations,
182 // including FxDriver).
183 //
184 // Use the client's driver tag value if they specified one. First check
185 // to make sure the size of the structure is the new size (vs the old size
186 // in v1.1).
187 //
188 // ' kdD' - was the default tag in many DDKs, don't allow its use.
189 //
190 if (DriverConfig->Size == sizeof(WDF_DRIVER_CONFIG) &&
191 DriverConfig->DriverPoolTag != 0x0 &&
192 DriverConfig->DriverPoolTag != ' kdD') {
193 //
194 // Copy directly using the driver's value
195 //
196 pFxDriverGlobals->Tag = DriverConfig->DriverPoolTag;
197 pFxDriverGlobals->Public.DriverTag = DriverConfig->DriverPoolTag;
198 }
199 else {
200 //
201 // Derive the value from the driver's service name
202 //
204 }
205
206 //
207 // Check to see if this is an NT4 style device driver. If so, fail if they
208 // specified an AddDevice routine. If no dispatch override is set,
209 // do not do any checking at all.
210 //
212 DO_NOTHING();
213 }
214 else if ((DriverConfig->DriverInitFlags & WdfDriverInitNonPnpDriver) &&
215 DriverConfig->EvtDriverDeviceAdd != NULL) {
216
218 "Invalid Driver flags or EvtDriverDeviceAdd callback already added"
219 "STATUS_INVALID_PARAMETER");
220
222 }
223
228 );
229
230 if (!NT_SUCCESS(status)) {
231 return status;
232 }
233
234 //
235 // FxDriver stores the driver wide configuration
236 //
238
239 //
240 // FxDriver stores the driver wide configuration
241 //
244
245 if (pDriver != NULL) {
246
247 if (NT_SUCCESS(status)) {
248
250
251 if (NT_SUCCESS(status)) {
253 }
254 }
255 }
256 else {
258 }
259
260 //
261 // Only return a valid handle on success. Upon error, release any memory
262 // and do not rely on any other function (like the driver unload routine) to
263 // be called.
264 //
266 //
267 // **** Note ****
268 // Do not introduce failures after this point without ensuring
269 // FxObject::DeleteFromFailedCreate has a chance to clear out any
270 // assigned callbacks on the object.
271 //
272
273 //
274 // Store the WDFDRIVER and FxDriver* globally so the driver can retrieve
275 // it anytime.
276 //
279
280 //
281 // Record the flags so that diagnostics knows what type of driver it is.
282 //
283 pFxDriverGlobals->Public.DriverFlags |= DriverConfig->DriverInitFlags;
284
285 if (DriverConfig->DriverInitFlags &
287 //
288 // If there is no dispatch override or if it is an NT4 legacy style
289 // driver then we will not displace unload in the stub if one was not
290 // specified.
291 //
292 if (DriverConfig->EvtDriverUnload != NULL) {
293 pFxDriverGlobals->Public.DisplaceDriverUnload = TRUE;
294 }
295 else {
296 pFxDriverGlobals->Public.DisplaceDriverUnload = FALSE;
297 }
298 }
299 else {
300 pFxDriverGlobals->Public.DisplaceDriverUnload = TRUE;
301 }
302
303 if (Driver != NULL) {
304 *Driver = hDriver;
305 }
306
307#ifndef __REACTOS__
308 if (FX_TELEMETRY_ENABLED(g_TelemetryProvider, pFxDriverGlobals)) {
310
311#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
312 const PWCHAR pVersionStr =
313 FX_MAKE_WSTR(__WDF_MAJOR_VERSION_STRING) L"."
314 FX_MAKE_WSTR(__WDF_MINOR_VERSION_STRING) L"."
315 FX_MAKE_WSTR(__WDF_BUILD_NUMBER) ;
316#else // USER_MODE
317 const PWCHAR pVersionStr =
318 FX_MAKE_WSTR(__WUDF_MAJOR_VERSION_STRING) L"."
319 FX_MAKE_WSTR(__WUDF_MINOR_VERSION_STRING) L"."
320 FX_MAKE_WSTR(__WUDF_SERVICE_VERSION) ;
321#endif
322
323 //
324 // GetImageName can fail if the registry cannot be accessed. This
325 // can happen during system shutdown. Since the image name is only
326 // used for telemetry the failure can be ignored.
327 //
328 (VOID) GetImageName(pFxDriverGlobals, &imageName.m_UnicodeString);
329
330 WDF_CENSUS_EVT_WRITE_DRIVER_LOAD(g_TelemetryProvider,
332 imageName.m_UnicodeString.Buffer,
334 }
335#endif // __REACTOS__
336 }
337 else {
338 if (pDriver != NULL) {
340 }
341
343 }
344
345 return status;
346}
347
351NTAPI
352WDFEXPORT(WdfDriverRegisterTraceInfo)(
353 __in
354 PWDF_DRIVER_GLOBALS DriverGlobals,
355 __in
357 __in
359 __in
361 )
362{
363 DDI_ENTRY();
364
369
371}
372
376NTAPI
377WDFEXPORT(WdfDriverRetrieveVersionString)(
378 __in
379 PWDF_DRIVER_GLOBALS DriverGlobals,
380 __in
381 WDFDRIVER Driver,
382 __in
383 WDFSTRING String
384 )
385{
386 DDI_ENTRY();
387
392
393#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
395 L"Kernel Mode Driver Framework version "
396 FX_MAKE_WSTR(__WDF_MAJOR_VERSION_STRING) L"."
397 FX_MAKE_WSTR(__WDF_MINOR_VERSION_STRING) L"."
398 FX_MAKE_WSTR(__WDF_BUILD_NUMBER) ;
399
401 L"Kernel Mode Driver Framework (verifier on) version "
402 FX_MAKE_WSTR(__WDF_MAJOR_VERSION_STRING) L"."
403 FX_MAKE_WSTR(__WDF_MINOR_VERSION_STRING) L"."
404 FX_MAKE_WSTR(__WDF_BUILD_NUMBER);
405#else // USER_MODE
406 const PWCHAR pVersionStr =
407 L"User Mode Driver Framework version "
408 FX_MAKE_WSTR(__WUDF_MAJOR_VERSION_STRING) L"."
409 FX_MAKE_WSTR(__WUDF_MINOR_VERSION_STRING) L"."
410 FX_MAKE_WSTR(__WUDF_SERVICE_VERSION) ;
411
413 L"User Mode Driver Framework (verifier on) version "
414 FX_MAKE_WSTR(__WUDF_MAJOR_VERSION_STRING) L"."
415 FX_MAKE_WSTR(__WUDF_MINOR_VERSION_STRING) L"."
416 FX_MAKE_WSTR(__WUDF_SERVICE_VERSION);
417#endif
418
419 //
420 // Even though it is unused, still convert it to make sure a valid handle is
421 // being passed in.
422 //
424 Driver,
426 (PVOID *)&pDriver,
428
430
432 if (!NT_SUCCESS(status)) {
433 return status;
434 }
435
437 String,
439 (PVOID *)&pString);
440
443 );
444
445 return status;
446}
447
451NTAPI
452WDFEXPORT(WdfDriverIsVersionAvailable)(
453 __in
454 PWDF_DRIVER_GLOBALS DriverGlobals,
455 __in
456 WDFDRIVER Driver,
457 __in
459 )
460{
461 DDI_ENTRY();
462
467
468#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
469 major = __WDF_MAJOR_VERSION;
470 minor = __WDF_MINOR_VERSION;
471#else
472 major = __WUDF_MAJOR_VERSION;
473 minor = __WUDF_MINOR_VERSION;
474#endif
475
476 //
477 // Even though it is unused, still convert it to make sure a valid handle is
478 // being passed in.
479 //
481 Driver,
483 (PVOID *)&pDriver,
485
487
489 if (!NT_SUCCESS(status)) {
490 return FALSE;
491 }
492
495
498 "VersionAvailableParams Size 0x%x, expected 0x%x, %!STATUS!",
500 status);
501
502 return FALSE;
503 }
504
505 //
506 // We log at TRACE_LEVEL_INFORMATION so that we know it gets into the IFR at
507 // all times. This will make it easier to debug drivers which fail to load
508 // when a new minor version of WDF is installed b/c they are failing
509 // version checks.
510 //
513 "IsVersionAvailable, current WDF ver major %d, minor %d, caller asking "
514 "about major %d, minor %d", major, minor,
515 VersionAvailableParams->MajorVersion, VersionAvailableParams->MinorVersion);
516
517 //
518 // Currently we only support one major version per KMDF binary and we support
519 // all minor versions of that major version down to 0x0.
520 //
521 if (VersionAvailableParams->MajorVersion == major &&
522 VersionAvailableParams->MinorVersion <= minor) {
523 return TRUE;
524 }
525
526 return FALSE;
527}
528
529} // extern "C"
unsigned char BOOLEAN
#define VOID
Definition: acefi.h:82
LONG NTSTATUS
Definition: precomp.h:26
PUNICODE_STRING GetRegistryPathUnicodeString(VOID)
Definition: fxdriver.hpp:243
static VOID _InitializeTag(__in PFX_DRIVER_GLOBALS Globals, __in PWDF_DRIVER_CONFIG Config)
Definition: fxdriver.cpp:266
static VOID _InitializeDriverName(__in PFX_DRIVER_GLOBALS Globals, __in PCUNICODE_STRING RegistryPath)
Definition: fxdriver.cpp:180
_Must_inspect_result_ NTSTATUS Initialize(__in PCUNICODE_STRING RegistryPath, __in PWDF_DRIVER_CONFIG Config, __in_opt PWDF_OBJECT_ATTRIBUTES DriverAttributes)
Definition: fxdriver.cpp:334
VOID DeleteFromFailedCreate(VOID)
Definition: fxobject.cpp:391
_Must_inspect_result_ NTSTATUS Commit(__in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __out_opt WDFOBJECT *ObjectHandle, __in_opt FxObject *Parent=NULL, __in BOOLEAN AssignDriverAsDefaultParent=TRUE)
Definition: fxobject.cpp:904
_Must_inspect_result_ NTSTATUS Assign(__in PCWSTR SourceString)
Definition: fxstring.cpp:57
#define __out_opt
Definition: dbghelp.h:65
#define __in
Definition: dbghelp.h:35
#define __in_opt
Definition: dbghelp.h:38
#define TRACINGDRIVER
Definition: dbgtrace.h:68
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
#define __drv_maxIRQL(irql)
Definition: driverspecs.h:291
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
NTSTATUS status
Definition: fxdriverapi.cpp:58
_Must_inspect_result_ __in MdDriverObject __in PCUNICODE_STRING __in_opt PWDF_OBJECT_ATTRIBUTES DriverAttributes
Definition: fxdriverapi.cpp:87
FxInitialize(pFxDriverGlobals, DriverObject, RegistryPath, DriverConfig)
FxDriver * pDriver
Definition: fxdriverapi.cpp:59
_Must_inspect_result_ __in PDRIVER_OBJECT __in PFN_WDF_TRACE_CALLBACK __in PVOID ControlBlock
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Driver, FX_TYPE_DRIVER,(PVOID *)&pDriver, &pFxDriverGlobals)
_Must_inspect_result_ __in MdDriverObject DriverObject
Definition: fxdriverapi.cpp:83
_Must_inspect_result_ __in WDFDRIVER __in WDFSTRING String
_Must_inspect_result_ __in WDFDRIVER __in PWDF_DRIVER_VERSION_AVAILABLE_PARAMS VersionAvailableParams
const PWCHAR pVersionStr
__in WDFDRIVER Driver
Definition: fxdriverapi.cpp:54
_Must_inspect_result_ __in PDRIVER_OBJECT __in PFN_WDF_TRACE_CALLBACK EvtTraceCallback
FxString * pString
return STATUS_NOT_SUPPORTED
const PWCHAR pVersionStrVerifier
const LONG validFlags
FxObjectHandleGetPtr(pFxDriverGlobals, String, FX_TYPE_STRING,(PVOID *)&pString)
return FALSE
_Must_inspect_result_ __in MdDriverObject __in PCUNICODE_STRING __in_opt PWDF_OBJECT_ATTRIBUTES __in PWDF_DRIVER_CONFIG DriverConfig
Definition: fxdriverapi.cpp:89
ULONG major
_Must_inspect_result_ __in MdDriverObject __in PCUNICODE_STRING RegistryPath
Definition: fxdriverapi.cpp:85
WDFDRIVER hDriver
Definition: fxdriverapi.cpp:99
ULONG minor
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_INFORMATION, TRACINGDRIVER, "IsVersionAvailable, current WDF ver major %d, minor %d, caller asking " "about major %d, minor %d", major, minor, VersionAvailableParams->MajorVersion, VersionAvailableParams->MinorVersion)
PFX_DRIVER_GLOBALS pFxDriverGlobals
Definition: fxdriverapi.cpp:57
__inline PFX_DRIVER_GLOBALS GetFxDriverGlobals(__in PWDF_DRIVER_GLOBALS DriverGlobals)
Definition: fxglobals.h:597
VOID FxDestroy(__in PFX_DRIVER_GLOBALS FxDriverGlobals)
Definition: globals.cpp:981
#define DDI_ENTRY()
Definition: fxglobalskm.h:56
#define FX_MAKE_WSTR(x)
Definition: fxmacros.hpp:264
#define WDFEXPORT(a)
Definition: fxmacros.hpp:157
#define FxPointerNotNull(FxDriverGlobals, Ptr)
Definition: fxmacros.hpp:253
#define WDF_CENSUS_EVT_WRITE_DRIVER_LOAD(TraceHandle, Globals, DrvImage, WdfVersion)
Definition: fxtelemetry.hpp:72
_Must_inspect_result_ NTSTATUS GetImageName(_In_ PFX_DRIVER_GLOBALS DriverGlobals, _Out_ PUNICODE_STRING ImageName)
#define FX_TELEMETRY_ENABLED(TraceHandle, Globals)
Definition: fxtelemetry.hpp:45
@ FX_TYPE_DRIVER
Definition: fxtypes.h:46
@ FX_TYPE_STRING
Definition: fxtypes.h:52
@ FX_VALIDATE_OPTION_SYNCHRONIZATION_SCOPE_ALLOWED
@ FX_VALIDATE_OPTION_EXECUTION_LEVEL_ALLOWED
@ FX_VALIDATE_OPTION_PARENT_NOT_ALLOWED
_Must_inspect_result_ NTSTATUS __inline FxValidateUnicodeString(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PCUNICODE_STRING String)
_Must_inspect_result_ NTSTATUS FxValidateObjectAttributes(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in ULONG Flags=FX_VALIDATE_OPTION_NONE_SPECIFIED)
__inline NTSTATUS FxVerifierCheckIrqlLevel(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in KIRQL Irql)
Definition: fxverifier.h:158
UNICODE_STRING imageName
Definition: library.c:551
#define DO_NOTHING()
Definition: mxgeneral.h:32
#define _Must_inspect_result_
Definition: no_sal2.h:62
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
long LONG
Definition: pedump.c:60
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
#define TRACE_LEVEL_INFORMATION
Definition: storswtr.h:29
BOOLEAN FxVerifierOn
Definition: fxglobals.h:420
FxDriver * Driver
Definition: fxglobals.h:374
Definition: ps.c:97
uint16_t * PWSTR
Definition: typedefs.h:56
#define NTAPI
Definition: typedefs.h:36
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_DRIVER_INTERNAL_ERROR
Definition: udferr_usr.h:177
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_INFO_LENGTH_MISMATCH
Definition: udferr_usr.h:133
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define WDFCASSERT(c)
Definition: wdfassert.h:93
_Must_inspect_result_ _In_ WDFDRIVER Driver
Definition: wdfcontrol.h:83
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2439
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING _In_opt_ PWDF_OBJECT_ATTRIBUTES DriverAttributes
Definition: wdfdriver.h:217
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PFN_WDF_TRACE_CALLBACK _In_ PVOID ControlBlock
Definition: wdfdriver.h:375
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ PWDF_DRIVER_CONFIG DriverConfig
Definition: wdfdriver.h:219
_Must_inspect_result_ _In_ WDFDRIVER _In_ PWDF_DRIVER_VERSION_AVAILABLE_PARAMS VersionAvailableParams
Definition: wdfdriver.h:439
EVT_WDF_TRACE_CALLBACK * PFN_WDF_TRACE_CALLBACK
Definition: wdfdriver.h:118
@ WdfDriverInitNonPnpDriver
Definition: wdfdriver.h:51
@ WdfDriverInitNoDispatchOverride
Definition: wdfdriver.h:52
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PFN_WDF_TRACE_CALLBACK EvtTraceCallback
Definition: wdfdriver.h:372
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_In_ LPWSTR _In_ ULONG _In_ ULONG _In_ ULONG _Out_ DEVINFO _In_ HDEV _In_ LPWSTR _In_ HANDLE hDriver
Definition: winddi.h:3557