1 /*++
2 
3 Copyright (c) Microsoft Corporation
4 
5 Module Name:
6 
7     FxWaitLock.cpp
8 
9 Abstract:
10 
11     This module implements the FxWaitLock's factory method.
12 
13 Author:
14 
15 
16 Revision History:
17 
18 
19 --*/
20 
21 #include "fxsupportpch.hpp"
22 
23 #if defined(EVENT_TRACING)
24 // Tracing support
25 extern "C" {
26 #include "fxwaitlock.tmh"
27 }
28 #endif
29 
30 __checkReturn
31 NTSTATUS
32 FxWaitLock::_Create(
33     __in PFX_DRIVER_GLOBALS         FxDriverGlobals,
34     __in_opt PWDF_OBJECT_ATTRIBUTES Attributes,
35     __in_opt FxObject*              ParentObject,
36     __in BOOLEAN                    AssignDriverAsDefaultParent,
37     __out WDFWAITLOCK*              LockHandle
38     )
39 {
40     FxWaitLock*     lock;
41     NTSTATUS        status;
42 
43     *LockHandle = NULL;
44 
45     lock = new (FxDriverGlobals, Attributes) FxWaitLock(FxDriverGlobals);
46     if (lock == NULL) {
47         status = STATUS_INSUFFICIENT_RESOURCES;
48         DoTraceLevelMessage(FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGIO,
49                             "Memory allocation failed: %!STATUS!", status);
50         return status;
51     }
52 
53     status = lock->Initialize();
54     if (!NT_SUCCESS(status)) {
55         lock->DeleteFromFailedCreate();
56         DoTraceLevelMessage(FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGIO,
57                             "faield to initialize wait lock: %!STATUS!", status);
58         return status;
59     }
60 
61     status = lock->Commit(Attributes,
62                           (WDFOBJECT*)LockHandle,
63                           ParentObject,
64                           AssignDriverAsDefaultParent);
65 
66     if (!NT_SUCCESS(status)) {
67         lock->DeleteFromFailedCreate();
68     }
69 
70     return status;
71 }
72 
73 
74 
75