1 /*++
2
3 Copyright (c) Microsoft Corporation
4
5 Module Name:
6
7 FxUserObject.cpp
8
9 Abstract:
10
11 This module implements the user object that device
12 driver writers can use to take advantage of the
13 driver frameworks infrastructure.
14
15 Author:
16
17
18
19
20 Environment:
21
22 Both kernel and user mode
23
24 Revision History:
25
26
27
28
29
30
31 --*/
32
33 #include "fxobjectpch.hpp"
34
35 #include "fxuserobject.hpp"
36
37 // Tracing support
38 extern "C" {
39 #if defined(EVENT_TRACING)
40 #include "FxUserObject.tmh"
41 #endif
42 }
43
44 _Must_inspect_result_
45 NTSTATUS
_Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals,__in_opt PWDF_OBJECT_ATTRIBUTES Attributes,__out FxUserObject ** pUserObject)46 FxUserObject::_Create(
47 __in PFX_DRIVER_GLOBALS FxDriverGlobals,
48 __in_opt PWDF_OBJECT_ATTRIBUTES Attributes,
49 __out FxUserObject** pUserObject
50 )
51 {
52 FxUserObject* pObject = NULL;
53 NTSTATUS status;
54 USHORT wrapperSize = 0;
55 WDFOBJECT handle;
56
57 #ifdef INLINE_WRAPPER_ALLOCATION
58 #if FX_CORE_MODE==FX_CORE_USER_MODE
59 wrapperSize = FxUserObject::GetWrapperSize();
60 #endif
61 #endif
62
63 pObject = new(FxDriverGlobals, Attributes, wrapperSize)
64 FxUserObject(FxDriverGlobals);
65
66
67 if (pObject == NULL) {
68 DoTraceLevelMessage(FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGOBJECT,
69 "Memory allocation failed");
70 return STATUS_INSUFFICIENT_RESOURCES;
71 }
72
73 status = pObject->Commit(Attributes, &handle);
74
75 if (!NT_SUCCESS(status)) {
76 DoTraceLevelMessage(FxDriverGlobals, TRACE_LEVEL_ERROR,
77 TRACINGOBJECT,
78 "FxObject::Commit failed %!STATUS!", status);
79 }
80
81 if (NT_SUCCESS(status)) {
82 *pUserObject = pObject;
83 }
84 else {
85 pObject->DeleteFromFailedCreate();
86 }
87
88 return status;
89 }
90
91 //
92 // Public constructors
93 //
94
FxUserObject(__in PFX_DRIVER_GLOBALS FxDriverGlobals)95 FxUserObject::FxUserObject(
96 __in PFX_DRIVER_GLOBALS FxDriverGlobals
97 ) :
98 #ifdef INLINE_WRAPPER_ALLOCATION
99 FxNonPagedObject(FX_TYPE_USEROBJECT, sizeof(FxUserObject) + GetWrapperSize(), FxDriverGlobals)
100 #else
101 FxNonPagedObject(FX_TYPE_USEROBJECT, sizeof(FxUserObject), FxDriverGlobals)
102 #endif
103 {
104 return;
105 }
106
107