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 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 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