Reactos
1/*++
2
3Copyright (c) Microsoft Corporation
4
5Module Name:
6
7 FxStringApi.cpp
8
9Abstract:
10
11 This module implements the "C" interface to the collection object.
12
13Author:
14
15
16
17Environment:
18
19 Both kernel and user mode
20
21Revision History:
22
23--*/
24
25#include "fxsupportpch.hpp"
26
27extern "C" {
28// #include "FxStringAPI.tmh"
29}
30
31extern "C" {
32
33_Must_inspect_result_
34__drv_maxIRQL(PASSIVE_LEVEL)
35NTSTATUS
36NTAPI
37WDFEXPORT(WdfStringCreate)(
38 __in
39 PWDF_DRIVER_GLOBALS DriverGlobals,
40 __in_opt
41 PCUNICODE_STRING UnicodeString,
42 __in_opt
43 PWDF_OBJECT_ATTRIBUTES StringAttributes,
44 __out
45 WDFSTRING* String
46 )
47{
48 DDI_ENTRY();
49
50 PFX_DRIVER_GLOBALS pFxDriverGlobals;
51 FxString* pString;
52 NTSTATUS status;
53
54 pFxDriverGlobals = GetFxDriverGlobals(DriverGlobals);
55
56 //
57 // Get the parent's globals if it is present
58 //
59 if (NT_SUCCESS(FxValidateObjectAttributesForParentHandle(pFxDriverGlobals,
60 StringAttributes))) {
61 FxObject* pParent;
62
63 FxObjectHandleGetPtrAndGlobals(pFxDriverGlobals,
64 StringAttributes->ParentObject,
65 FX_TYPE_OBJECT,
66 (PVOID*)&pParent,
67 &pFxDriverGlobals);
68 }
69
70 FxPointerNotNull(pFxDriverGlobals, String);
71
72 *String = NULL;
73
74 status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL);
75 if (!NT_SUCCESS(status)) {
76 return status;
77 }
78
79 status = FxValidateObjectAttributes(pFxDriverGlobals, StringAttributes);
80 if (!NT_SUCCESS(status)) {
81 return status;
82 }
83
84 if (UnicodeString != NULL) {
85 status = FxValidateUnicodeString(pFxDriverGlobals, UnicodeString);
86 if (!NT_SUCCESS(status)) {
87 return status;
88 }
89 }
90
91 pString = new (pFxDriverGlobals, StringAttributes) FxString(pFxDriverGlobals);
92
93 if (pString != NULL) {
94 if (UnicodeString != NULL) {
95 status = pString->Assign(UnicodeString);
96 }
97
98 if (NT_SUCCESS(status)) {
99 status = pString->Commit(StringAttributes, (WDFOBJECT*)String);
100 }
101
102 if (!NT_SUCCESS(status)) {
103 pString->DeleteFromFailedCreate();
104 pString = NULL;
105 }
106 }
107 else {
108 status = STATUS_INSUFFICIENT_RESOURCES;
109
110 DoTraceLevelMessage(
111 pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR,
112 "Could not allocate WDFSTRING handle, %!STATUS!", status);
113 }
114
115 return status;
116}
117
118__drv_maxIRQL(PASSIVE_LEVEL)
119VOID
120NTAPI
121WDFEXPORT(WdfStringGetUnicodeString)(
122 __in
123 PWDF_DRIVER_GLOBALS DriverGlobals,
124 __in
125 WDFSTRING String,
126 __out
127 PUNICODE_STRING UnicodeString
128 )
129{
130 DDI_ENTRY();
131
132 PFX_DRIVER_GLOBALS pFxDriverGlobals;
133 FxString* pString;
134 NTSTATUS status;
135
136 FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals),
137 String,
138 FX_TYPE_STRING,
139 (PVOID*) &pString,
140 &pFxDriverGlobals);
141
142 FxPointerNotNull(pFxDriverGlobals, UnicodeString);
143
144 status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL);
145 if (!NT_SUCCESS(status)) {
146 return;
147 }
148
149 RtlCopyMemory(UnicodeString,
150 pString->GetUnicodeString(),
151 sizeof(UNICODE_STRING));
152}
153
154} // extern "C"